![当某个进程正在关闭并且记分板已满时,Apache MPM-Event 是否可以强制其在超时后停止连接?](https://linux22.com/image/792877/%E5%BD%93%E6%9F%90%E4%B8%AA%E8%BF%9B%E7%A8%8B%E6%AD%A3%E5%9C%A8%E5%85%B3%E9%97%AD%E5%B9%B6%E4%B8%94%E8%AE%B0%E5%88%86%E6%9D%BF%E5%B7%B2%E6%BB%A1%E6%97%B6%EF%BC%8CApache%20MPM-Event%20%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%BC%BA%E5%88%B6%E5%85%B6%E5%9C%A8%E8%B6%85%E6%97%B6%E5%90%8E%E5%81%9C%E6%AD%A2%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
我们正在使用可以保持连接很长时间(可能是数周)的 WebSocket。
Apache 2.4.41 w/MPMEvent 有时会决定停止某个进程(例如 1:当负载下降时,2:当用户重新加载配置时,3:当 logrotate 在旋转日志后重新加载配置时 - Ubuntu 默认)。当某个进程停止时,它似乎永远不会在需要时重新启动,即使配置没有更改(同一代,未使用重新加载配置)。
websocket 连接阻止了进程停止,我们可以在 /server-status 中看到连接,线程标记为 G,表示正常完成。
我们遇到过这样一种情况:8 个进程已满,并且‘记分牌已满’,而其余 8 个进程处于‘停止’状态,并且有线程以‘G’优雅地完成。
问题 1:一旦 apache 决定停止某个进程(因为负载下降,并且不再需要该进程作为 pr )MinSpareThreads
,它是否就无法改变对该进程的想法并让该进程再次接受连接?如果我们的进程卡住的唯一原因是它们是老一代(由于 apache 重新加载),那么一个很好的解决方案就是删除 logrotate。根据我的测试,这是真的,Apache 开始接受与“正在停止”的进程的连接(但希望得到确认)。
问题 2:是否可以添加超时,以便当 Apache 需要启动新进程(即服务器)但因serverLimit
已到达而无法启动时,它会强制终止处于停止状态但因打开连接而等待的进程。从而在需要时清理空间并强制关闭连接。
我应该注意到,我们发现了设置优雅关机超时,但在发现这一点之后优雅停止很明显,这个超时是指正常停止整个 Apache 服务器,而不是停止某个进程(根据文档,又名服务器)。
我知道可能的解决方案是不使用 logrotate(这会导致所有进程每晚都停止),并更改我们的 websocket 以频繁重新连接。后者在我们的案例中并不容易,前者无法解决负载波动导致进程停止的问题。
我们的 mpm_event 配置如下所示:
<IfModule mpm_event_module>
StartServers 3
ServerLimit 16
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>