Apache MPM 工作者陷入 G(优雅完成)增长 - “记分牌已满”

Apache MPM 工作者陷入 G(优雅完成)增长 - “记分牌已满”

运行 MPM 工作器,Apache 2.4.46,Debian 9

优雅地完成工作的时间会随着时间的推移而增长,它们似乎永远都完成不了。最终,我用完了容量,并收到“记分板已满”错误。如果我重新启动 Apache,它们就会被释放。

我不相信这与我的网站代码(php)有任何关系,因为许多挂起的请求只是纯图像 GET,不涉及 php。

在此处输入图片描述

<IfModule mpm_worker_module>
ServerLimit 500
StartServers       10
MinSpareThreads    50
MaxSpareThreads    100
    ThreadLimit          64
    ThreadsPerChild      64
    MaxRequestWorkers     500
    MaxConnectionsPerChild   0
</IfModule>

记分牌 在此处输入图片描述

例如 g 工人 在此处输入图片描述

Apache 一周内免费插槽逐渐减少 在此处输入图片描述

在此处输入图片描述

尝试过保持活动状态并关闭

在此处输入图片描述

答案1

当您使用 MPM 工作器时,请求由进程中存在的线程处理。

https://httpd.apache.org/docs/2.4/mod/worker.html

单个控制进程(父进程)负责启动子进程。每个子进程都会创建固定数量的服务器线程(如 ThreadsPerChild 指令中指定),以及一个侦听线程,用于侦听连接并在连接到达时将其传递给服务器线程进行处理。

在 Linux 上,一个进程“包含”线程,也就是说一个 PID 可以有多个线程,这些线程与该 PID 中的其他线程共享内存(以及其他资源)。

事实上,Linux 只关心“任务”,一个非多线程进程是一个带有容器的 PID任务。

当您正常重新加载 Apache 时,您将终止包含该进程。这里发生的事情是,Apache 让每个线程等待,直到包含该进程中的所有线程都完成后,再重新启动容器 PID。

因此,就您而言,列表中所有进程中都有一个线程,该线程仍然处于繁忙状态或以某种方式卡住。

您有几个选择。

  1. 无论如何,放弃等待并重新开始。
  2. 找到问题线程(可能是应用程序中的错误)并修复它。

1,很简单。添加一个值很高但不愚蠢的配置选项GracefulShutdownTimeout。比如说 900 秒。默认情况下,这是无限的,这意味着您的线程会永远等待问题线程完成。

这样做的主要缺点是,您可能会在执行关键任务的过程中遇到进程中断的情况 —— 终止进程可能会损坏文件或巧妙地破坏应用程序。您还可能会在处理过程中终止客户端(这种可能性极小)。

2,将涉及您发现卡在工作线程列表中的线程,然后诊断连接正在做什么,但您一定会发现可能是一个设计缺陷,并且您可以在吹走问题线程之前更自信地解释该行为。

相关内容