在 Web 应用程序中运行某些功能时,“top”命令有时会显示特定 httpd.worker 的 CPU 使用率高达 100%;此外,每个 worker 的内存使用量有时会高到令人担忧的程度。wsgi 配置非常标准,如下所示:
...
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,并且一旦内存使用率超过一定限制就重新启动工作进程?
答案1
鉴于您已经将每个孩子的请求数量限制为 500,我会在您的代码中寻找内存泄漏。
您可以在启动 apache 的脚本中限制内存ulimit
。将其设置为比您预期的工作线程使用量稍大的限制。如果线程试图增长到大于指定的大小,操作系统将终止该工作线程。Apache 将重新生成一个新进程来替换被终止的工作线程。如果启用核心转储,您可以分析它们以查看内存的用途。这将捕获大多数不处理失败的内存请求并崩溃的进程。某些进程可能会捕获故障并正常退出,无论是否进行核心转储。
如果您拥有多核处理器,我不会担心某个工作进程占用 100% 的 CPU。即使在单核进程中,如果其他进程没有受到影响,我也不会担心。但是,这可能表明您的某些代码效率低下。
平均负载往往是 CPU 过载的良好指标。如果负载经常等于或超过核心数,则 CPU 将成为瓶颈。
如果您长时间运行高 CPU 请求,则有些程序会优化(降低 CPU 优先级)有问题的进程,以便其他进程获得 CPU 时间。对于已调度的代码,可能值得考虑将其更改为可以在优化 CPU 的情况下运行的应用程序。