我在我们的Web服务器上看到一个奇怪的问题,其中Apache进程似乎只剩下1或2个线程。 这对我来说是令人不安的,因为我只是想要强加一个更严格的ServerLimit,这样我可以更安全地上升我的php memory_limit。
谁会知道一个很好的方法来解决这个问题? 弄清楚那些进程在干什么? 他们在什么状态?
我不完全确定,但我会认为这是由于我们从不重新启动Apache服务,并且由于各种原因每天执行2-3次重新加载。
举个例子,其中一个Web服务器坐在无聊之间,而另一个则相当重要:
PID PPID RES THREADS *15608 1 29 MB 1 8880 1 2 MB 3 14989 1 0 MB 1 25029 1 0 MB 1 2115 15608 3 MB 2 13058 15608 361 MB 2 14556 15608 157 MB 27 19962 15608 23 MB 1 21219 15608 387 MB 3 21600 15608 3 MB 3 21828 15608 3 MB 2 30152 15608 3 MB 2
在这个例子中,我假设有三个过程,一个是控制过程(预重载),它们仍然在运行,不pipe出于什么原因。 而在新的控制过程中,一堆仍然有2-3个线程。
从11个小时后,很多相同的PID仍然在1线程左右。 你会想,如果MaxRequests已经达成了,那么这件事情就会退出。
memory usage report for apache2 pid count : 11 thread count : 46 shared mem usage : 670 MB total resident size : 691 MB total cpu usage : 79 % total memory usage : 7 % average mem / pid : 62 MB process breakdown PID PPID RES THREADS *15608 1 29 MB 1 8880 1 2 MB 3 14989 1 0 MB 1 25029 1 0 MB 1 2115 15608 3 MB 2 19962 15608 23 MB 1 21219 15608 387 MB 3 21600 15608 3 MB 3 21828 15608 3 MB 2 29239 15608 238 MB 27 30152 15608 3 MB 2 process tree |-apache2-+-3*[apache2---{apache2}] | |-apache2 | |-2*[apache2---2*[{apache2}]] | `-apache2---26*[{apache2}] |-apache2---2*[{apache2}] |-2*[apache2]
首先要检查的是这些是否产生了任何额外的进程(你是否有可用的pstree?)。 PHP执行function是否启用?
其他的事情要看你是否已经启用了Keepalive,以及maxRequests是否被设置为一个合理的值。 线程闲置或处理的东西?
PHP是否与数据库后端对话? 一旦执行线程进入DB客户端库,关于内存使用和时间限制的PHP约束将不再应用,直到线程返回到PHP。 你看到你的数据库查询缓慢吗?
其他值得检查的是MTA是否configuration正确 – 例如,如果您使用的是带有智能中继的sendmail,并且您configuration的地址不正确,那么php的mail()函数可能会长时间阻塞。
Rob Olmos对Rasmus Lerdorf的评论是在6年前做出的,虽然在声明中可能还是有一些事实,但它不太可能适用于主stream扩展。
你没有说你正在使用什么操作系统 – 恕我直言,与预分叉相比,线程在Linux上的好处几乎无法察觉。
当然,如果你已经耗尽了其他渠道,而且你没有一个强有力的理由来坚持使用线程化的Apache,那么值得尝试前叉 – 但是先看看其他地方。
PHP是通过mod_php运行的吗? PHP安装文档给出了这个:
警告我们不build议在Apache 2的生产环境中使用线程化的MPM。使用prefork MPM,它是Apache 2.0和2.2的默认MPM。 有关原因的信息,请阅读使用带有线程MPM的Apache2的相关FAQ条目
http://www.php.net/manual/en/install.unix.apache2.php
所以我怀疑这是问题所在。