我目前正在尝试理解为什么我的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上的负载平均数如此之高?
答案 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中运行它。