在Web应用程序中运行某些function时,“top”命令有时会显示特定httpd.worker的CPU使用率高达100%。 而且,每个工人的记忆使用时间有时候也足够令人担忧。 wsgiconfiguration非常标准,如下所示:
... MaxSpareThreads 3 MinSpareThreads 1 MaxRequestsPerChild 500 ServerLimit 1 SetEnvIf X-Forwarded-SSL on HTTPS=1 ThreadsPerChild 5 WSGIDaemonProcess w2p processes=5 python-path=/home/[...]/python2.7 threads=1 ...
有没有办法限制每个工作人员的CPU使用量,使其不超过一定比例的CPU,并且一旦内存使用超过一定限制就重新启动工作人员?
鉴于你已经限制每个孩子的请求数量为500,我会在你的代码中寻找内存泄漏。
要限制内存,您可以在启动apache的脚本中使用ulimit
。 将其设置为一个比您期望的工作线程稍大的限制。 如果一个线程试图增长大于指定的大小,操作系统将杀死该工人。 Apache将重新产生一个新的进程来取代死亡的工人。 如果启用核心转储,则可以分析它们以查看内存的使用情况。 这将捕获大多数不处理失败的内存请求和崩溃的进程。 某些进程可能会捕获失败并正常退出,有或没有核心转储。
如果你有一个多核处理器,我不会担心一个工人使用100%的CPU。 即使在一个单一的核心stream程中,我也不会担心其他stream程是否会受到影响。 但是,这可能表明您有一些效率低下的代码。
如果CPU负载过重,负载平均值就是一个很好的指标。 如果它经常处于核心计数以上,那么CPU正在成为一个瓶颈。
如果你长时间运行高CPU请求,那么有一些程序可以很好地降低CPU的优先级,从而使其他进程获得CPU时间。 对于预定的代码,可能需要将它改为一个可以用CPU运行的应用程序。