Heroku的负载平均值非常高

时间:2013-03-16 13:24:15

标签: heroku load

我目前正在尝试理解为什么我的Python Heroku应用程序中的一些请求需要> 30秒。即使是简单的请求也绝对没有。

我做过的一件事就是调查我的dynos的平均负载。我做了三件事:

1)看看Heroku日志。偶尔会打印出负载。以下是示例:

Mar 16 11:44:50 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 heroku[web.2] Dyno load average (1m): 11.900

Mar 16 11:45:11 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 heroku[web.2] Dyno load average (1m): 8.386

Mar 16 11:45:32 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 heroku[web.2] Dyno load average (1m): 6.798

Mar 16 11:45:53 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 heroku[web.2] Dyno load average (1m): 8.031

2)多次运行“heroku run uptime”,每次点击不同的机器(通过运行“hostname”验证)。以下是刚才的示例输出:

13:22:09 up 3 days, 13:57, 0 users, load average: 15.33, 20.55, 22.51

3)使用psutil将指标发送到石墨,测量我的dynos所在机器上的平均负载。图表确认了5到20之间的数字。

我不确定这是否解释了需要很长时间的简单请求,但有人可以说为什么Heroku上的负载平均数如此之高?

2 个答案:

答案 0 :(得分:1)

Heroku将主机虚拟化为访客' Dyno'你是通过LXC使用的。当你运行“正常运行时间”时你看到整个主机的正常运行时间而不是你的容器,正如@ jon-mountjoy所指出的,当你这样做时,你得到的是一个新的LXC容器而不是你运行的Dynos。

Heroku的dyno负载计算也不同于传统的UNIX / LINUX负载计算。

Heroku负载平均值反映了就绪队列中的CPU任务数(即等待处理)。 dyno管理器大约每20秒对每个dyno计算可运行的任务。使用前30分钟的可运行任务计数计算指数衰减的移动平均值,其中周期为1分钟,5分钟或15分钟(以秒为单位),count_of_runnable_tasks是队列中任务数量的条目在给定的时间点,平均值是先前计算的指数负载平均值

Heroku的平均负载和Linux之间的区别在于Linux还包括处于不间断睡眠状态(通常等待磁盘活动)的进程,如果许多进程在I / O到期时仍然受阻,则会导致明显不同的结果到繁忙或停滞的I / O系统。

在CPU绑定的Dyno上,我认为这不会产生太大的影响。在IO绑定的Dyno上,Heroku报告的负载平均值将远低于您在LXC容器上获得正常运行时间时所获得的负载平均值。

您还可以通过启用log-runtime-metrics

启用正在运行的dynos的定期加载消息

答案 1 :(得分:0)

也许预计dyno idling

PS。我怀疑没有必要运行heroku run uptime - 每次都会在新的一次性dyno中运行它。