今天我发现我的一个网站无法正常工作,所以我通过 ssh 连接到服务器并执行了 ps -eF。我看到大约 200 个 PHP 进程运行了 4 个小时。
Apache 使用 mpm event 和 mod fcgid 构建。
我终止了所有 PHP 进程,现在它运行良好,为什么会发生这种情况?这是预期的行为吗?
我真的不明白 Apache 如何跟踪 PHP 进程的数量及其进程 ID,因此如果有人能在我阅读本文时提供一些参考就好了。
此外,我使用了“ab”命令(Apache Benchmark)来查看这种情况是否一直发生,因此我连续运行了 4-5 次,并发请求数为 30,并且再次有大约 150 个 PHP 进程在运行,当我继续运行“ab”时,它现在不会产生更多进程,网站仍在运行。需要说明的是,我执行“ab”的 4-5 次并不是同时进行的,一个“ab”进程一完成,我就会执行另一个,但每次执行“ab”时,我都会发出 30 个并发请求。
请解释一下!谢谢 :)
答案1
是的,这是预期的行为。看起来您同时运行了 5 个 ab 副本。这导致您的 150 个 PHP 进程为每个 ab 进程处理 30 个请求。
当所有线程都可以在内存中运行时,Apache 的效果最好。当负载达到一定程度时,线程将需要交换到磁盘。发生这种情况时,响应时间将迅速降低。像您所做的那样终止进程将提高性能。在这种情况下,服务器性能可能会变差。如果最大线程数配置得太高,则使用此行为执行 DOS(拒绝服务)相对容易。
另一个导致问题出现的原因是两个进程在两个资源上死锁。如果其他进程需要其中任何一个资源,它们可能无法响应。在这种情况下,Apache 将限制创建的进程数。终止任何一个死锁进程应该可以解决问题。根据正常的锁定顺序,可能需要终止特定进程以防止再次发生死锁。这对服务器性能几乎没有影响。
编程错误也可能导致线程挂起。这可能会导致线程卡住,正如您所看到的。事后很难找到发生了什么,但 Apache 服务器日志的内容可能会有所帮助。检查错误日志以查找问题。访问日志中可能包含您终止进程时挂起的请求的条目。
如果一段时间内没有使用某些进程,Apache 会终止它们。这由参数控制MaxSpareThreads
。检查控制文件,该文件应该包含有关线程、服务器和客户端参数的一些注释。默认值通常很好。
如果代码有问题,将其设置MaxRequestsPerChild
为 5000 到 100 之间的某个值通常会有所帮助。数字越小,需要创建新线程的频率就越高,Apache 服务器需要工作的难度就越大。
编辑:Apache 将在启动时打开多个线程。这取决于几个参数的交互。请参阅MPM 配置文档有关参数的详细信息。这与服务器的任何负载无关,通常是正在运行的服务器将保持运行的最小线程数。