2013-03-12 48 views
4

我正在使用Nginx + PHP-FPM與PHP 5.3.6,它運行良好數週。 突然,每個PHP-FPM孩子開始佔用太多內存。在最初的幾周裏,每個PHP-FPM孩子過去需要3MB,現在很少有孩子需要700MB。 任何人都可以指導呢?PHP-FPM佔用太多內存

This script I used to get memory usage by child pid 
http://www.pixelbeat.org/scripts/ps_mem.py. 

It could be verified by 'top' method too 

top output:: 
------------------------------ 
------------------------------ 
28419 daemon 20 0 844m 757m 4200 S 0 6.4 0:14.27 php-fpm               

16788 daemon 20 0 700m 614m 4632 S 0 5.2 0:28.34 php-fpm               

29450 daemon 20 0 669m 581m 3548 S 0 4.9 0:08.31 php-fpm               

17881 daemon 20 0 642m 556m 4108 S 0 4.7 0:14.83 php-fpm               

19048 daemon 20 0 642m 555m 4108 S 0 4.7 0:08.86 php-fpm 
11956 daemon 20 0 97612 10m 5476 S 4 0.1 0:39.57 php-fpm               
11993 daemon 20 0 97560 10m 5188 S 4 0.1 0:39.18 php-fpm               
11925 daemon 20 0 97328 10m 5144 D 3 0.1 0:38.68 php-fpm               
11953 daemon 20 0 97748 10m 5172 S 4 0.1 0:38.51 php-fpm 

PHP-fpm.conf:

/etc/php-fpm/php-fpm.conf 
listen = 127.0.0.1:9000 
user = daemon 
group = daemon 

pm = dynamic 
pm.max_children = 2000 
pm.start_servers = 50 
pm.min_spare_servers = 40 
pm.max_spare_servers = 90 
pm.max_requests = 10000 

以下是更多的調試輸入:

PMAP ::

pmap 28419 
0000000000b52000  96K rw--- [ anon ] 
0000000001a49000 1668K rw--- [ anon ] 
0000000001bea000 208K rw--- [ anon ] 
0000000001c1e000 770476K rw--- [ anon ] 

strace的::

strace -p 28419 
Process 28419 attached - interrupt to quit 
restart_syscall(<... resuming interrupted call ...>) = 0 
recvfrom(4, 0x1bda1d0, 8196, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) 
poll([{fd=4, events=POLLIN}], 1, 5000) = 0 (Timeout) 
recvfrom(4, 0x1bda1d0, 8196, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) 
poll([{fd=4, events=POLLIN}], 1, 5000^C <unfinished ...> 
+0

可能是一個太無知的評論 - 任何你的PHP腳本開始吃太多內存的機會 - 例如加載太多的數據? – 2013-03-12 15:05:19

+0

你的網站很忙嗎?每分鐘的請求數是多少?這可能會導致一些內存泄露,這在php中很常見。 :) – 2013-03-12 16:29:03

+0

你檢查了你的slowlog?它在你的php-fpm配置文件中定義。 – 2013-03-13 00:40:49

回答

6

嘗試將pm.max_requests降至1000,然後降低(如果需要)。這將在1000次請求後終止子進程。當php-fpm佔用資源時,需要考慮許多變量。我一直在使用它一段時間,並沒有看到這個級別的內存消耗。我的猜測是代碼問題,或者是一個逃跑腳本。

+0

對。這是對抗第三方庫內存泄漏的主要工具。 – 2013-03-13 00:48:20

+3

請務必閱讀! http://linuxbsdos.com/2015/02/17/how-to-reduce-php-fpm-php5-fpm-ram-usage-by-about-50/ – orszaczky 2015-11-12 08:26:08