【问题标题】:Heroku load average alarmingly highHeroku 平均负载高得惊人
【发布时间】:2013-03-16 13:24:15
【问题描述】:

我目前正在尝试了解为什么我的 Python Heroku 应用程序中的某些请求需要超过 30 秒。甚至是完全没有任何作用的简单请求。

我做过的一件事是查看我的测功机上的平均负载。我做了三件事:

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”,每次运行不同的机器(通过运行“主机名”验证)。这是刚刚的示例输出:

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

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

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

【问题讨论】:

    标签: heroku load


    【解决方案1】:

    Heroku 将主机子虚拟化为您通过 LXC 使用的来宾“Dyno”。当您运行“正常运行时间”时,您看到的是整个主机的正常运行时间而不是您的容器,并且正如 @jon-mountjoy 所指出的,当您执行此操作时,您将获得一个新的 LXC 容器,而不是您正在运行的 Dynos 之一。

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

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

    Heroku 的平均负载与 Linux 之间的区别在于,Linux 还包括处于不可中断睡眠状态的进程(通常等待磁盘活动),如果许多进程由于忙或停滞的 I/O 系统。

    在 CPU 绑定的 Dyno 上,我认为这不会有太大的不同。在 IO 绑定的 Dyno 上,Heroku 报告的平均负载将远低于如果您可以在 LXC 容器上获得 TRUE 正常运行时间所报告的负载平均值。

    您还可以通过启用 log-runtime-metrics 来启用发送正在运行的测功机的定期负载消息

    【讨论】:

      【解决方案2】:

      也许是预期的dyno idling

      PS。我怀疑运行 heroku run uptime 毫无意义 - 每次都会在一个新的一次性测功机中运行它。

      【讨论】:

      • 我看不出测功机空转如何导致高负载平均值。至于一次性:当然有一点,只是我写了(“每次都验证不同的机器”——我知道,这是故意的):许多不同的机器我以这种方式“采样”具有较高的平均负载。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      相关资源
      最近更新 更多