运行 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>
尝试过保持活动状态并关闭
答案1
当您使用 MPM 工作器时,请求由进程中存在的线程处理。
从https://httpd.apache.org/docs/2.4/mod/worker.html
单个控制进程(父进程)负责启动子进程。每个子进程都会创建固定数量的服务器线程(如 ThreadsPerChild 指令中指定),以及一个侦听线程,用于侦听连接并在连接到达时将其传递给服务器线程进行处理。
在 Linux 上,一个进程“包含”线程,也就是说一个 PID 可以有多个线程,这些线程与该 PID 中的其他线程共享内存(以及其他资源)。
事实上,Linux 只关心“任务”,一个非多线程进程是一个带有容器的 PID一任务。
当您正常重新加载 Apache 时,您将终止包含该进程。这里发生的事情是,Apache 让每个线程等待,直到包含该进程中的所有线程都完成后,再重新启动容器 PID。
因此,就您而言,列表中所有进程中都有一个线程,该线程仍然处于繁忙状态或以某种方式卡住。
您有几个选择。
- 无论如何,放弃等待并重新开始。
- 找到问题线程(可能是应用程序中的错误)并修复它。
1,很简单。添加一个值很高但不愚蠢的配置选项GracefulShutdownTimeout
。比如说 900 秒。默认情况下,这是无限的,这意味着您的线程会永远等待问题线程完成。
这样做的主要缺点是,您可能会在执行关键任务的过程中遇到进程中断的情况 —— 终止进程可能会损坏文件或巧妙地破坏应用程序。您还可能会在处理过程中终止客户端(这种可能性极小)。
2,将涉及您发现卡在工作线程列表中的线程,然后诊断连接正在做什么,但您一定会发现可能是一个设计缺陷,并且您可以在吹走问题线程之前更自信地解释该行为。