Apache-2.2
PHP 殭屍程序太多
我今天重新啟動了我的 apache 守護程序以重新載入配置文件,但在此之後我開始在系統上看到許多 php 殭屍程序。數量從 10 到 30 不等,它們在死亡時都會佔用一點 CPU。我應該從哪裡開始調試這個問題?
我所做的修改是將每個孩子的最大請求數從 0(大量記憶體洩漏)減少到 1000。我認為 php 程序來自從“啞”設備接收數據的腳本,即。他們發送帶有 GET 參數的請求,而不關心結果。
一些數據:
unname -a
# uname -a Linux <hostname> 2.6.32-71.29.1.el6.x86_64 #1 SMP Mon Jun 27 19:49:27 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
ps-輔助 | grep php
# ps aux | grep php user1 5709 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5717 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5721 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5722 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5723 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5724 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5725 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5729 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5731 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5737 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5760 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5778 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5793 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5798 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5800 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5833 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5850 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5870 3.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5875 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5876 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5877 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5886 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5926 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5939 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5941 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5961 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5962 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5973 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct> user1 5977 0.0 0.2 106836 8680 ? R 12:15 0:00 /usr/bin/php /home/user1/public_html/<script>.php root 5981 0.0 0.0 103228 836 pts/0 S+ 12:15 0:00 grep php
自由
# free -m total used free shared buffers cached Mem: 3831 3173 658 0 183 2502 -/+ buffers/cache: 487 3344 Swap: 4031 7 4024
正常執行時間
# uptime 12:18:10 up 105 days, 23:21, 1 user, load average: 0.23, 0.20, 0.18
還有什麼需要幫助我調試的嗎?
這算不上問題。Zombies 不會佔用 CPU、記憶體或程序表插槽以外的任何東西。你說過,殭屍並沒有逗留很長時間,所以發生的所有事情都是 Apache 主程序正在做的事情不是等待子程序退出,所以有時需要一段時間才能終止孩子們得到收穫。
殭屍程序只是一個父程序已經死亡/被殺死,並且還沒有被清理的程序。
如果在服務重啟期間發生這種情況,則完全正常。您應該閱讀 linux 程序狀態,這裡有粗略的資訊:
- 執行:這是一個程序處於執行或準備執行的狀態。
- 可中斷:此狀態是程序的阻塞狀態,等待來自另一個程序的事件或信號
- 不間斷:也是阻塞狀態。在等待硬體狀態並且無法處理信號的特定條件下,程序被迫停止。
- 停止:一旦過程完成,就會出現這種狀態。這個過程可以重新開始
- Zombie:在這種狀態下,程序將被終止,並且程序表中的資訊仍然可用。
但是,如果它在您的網路伺服器的正常使用期間發生(我們畢竟在談論 php 程序),您可以通過每分鐘執行一次 apache 優雅重啟(
service apache2 reload
)的 cronjob 臨時解決此問題,但這並不能解決潛在的問題。可用插槽。在第二種情況下,您需要辨別是哪個主機導致了殭屍,並且必須修復應用程序。99% 的此類殭屍是由程式不當的網站造成的。