PHP吃掉了所有的内存

从今天早上我们的一个networking服务器的内存被PHP填满,最终导致服务器开始交换,变慢和变得不可用(一个sshlogin需要5分钟,然后有时完全死亡)…

我想知道你将如何继续解决这类问题。

Jul 23 06:16:31 websrv2 kernel: [10409040.981882] php-cgi invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0 Jul 23 06:16:31 websrv2 kernel: [10409040.981888] php-cgi cpuset=/ mems_allowed=0 Jul 23 06:16:31 websrv2 kernel: [10409040.981892] Pid: 27697, comm: php-cgi Not tainted 2.6.32-5-amd64 #1 Jul 23 06:16:31 websrv2 kernel: [10409040.981894] Call Trace: Jul 23 06:16:31 websrv2 kernel: [10409040.981903] [<ffffffff810b6714>] ? oom_kill_process+0x7f/0x23f Jul 23 06:16:31 websrv2 kernel: [10409040.981908] [<ffffffff8106bdee>] ? timekeeping_get_ns+0xe/0x2e Jul 23 06:16:31 websrv2 kernel: [10409040.981912] [<ffffffff810b6c38>] ? __out_of_memory+0x12a/0x141 Jul 23 06:16:31 websrv2 kernel: [10409040.981916] [<ffffffff810b6d8f>] ? out_of_memory+0x140/0x172 Jul 23 06:16:31 websrv2 kernel: [10409040.981921] [<ffffffff810baaf4>] ? __alloc_pages_nodemask+0x4ec/0x5fc Jul 23 06:16:31 websrv2 kernel: [10409040.981927] [<ffffffff810d92d8>] ? read_swap_cache_async+0x5d/0xf3 Jul 23 06:16:31 websrv2 kernel: [10409040.981931] [<ffffffff810d93c5>] ? swapin_readahead+0x57/0x98 Jul 23 06:16:31 websrv2 kernel: [10409040.981937] [<ffffffff8100c18d>] ? __raw_callee_save_xen_pte_val+0x11/0x1e Jul 23 06:16:31 websrv2 kernel: [10409040.981941] [<ffffffff810cd245>] ? handle_mm_fault+0x47f/0x80f Jul 23 06:16:31 websrv2 kernel: [10409040.981947] [<ffffffff813001a6>] ? do_page_fault+0x2e0/0x2fc Jul 23 06:16:31 websrv2 kernel: [10409040.981952] [<ffffffff812fe045>] ? page_fault+0x25/0x30 Jul 23 06:16:31 websrv2 kernel: [10409040.981954] Mem-Info: 

我尝试去按内存使用sorting进程:

ps -e -orss =,args = | sort -b -k1,1n | pr-TW $ COLUMNS

我看到一堆/ usr / bin / php-cgi消耗内存。 我怎样才能限制PHP的整体内存消耗,所以服务器永远不会被推到极限,用尽所有的内存/交换,变得不可用?

更多系统信息:

 ii php5 5.3.3-7+squeeze18 server-side, HTML-embedded scripting language (metapackage) ii apache2 2.2.16-6+squeeze11 Apache HTTP Server metapackage 

你可以用cgroups限制一个用户(运行php-cgi进程的用户)的内存使用情况。

例如,要限制用户的内存使用情况,您可以执行以下操作:

 # file: /etc/cgconfig.conf group php { memory { memory.limit_in_bytes = "2G"; } } 

然后你必须把你的php-cgi用户添加到这个cgroup-group:

 # file: /etc/cgrules.conf phpcgiuser memory php 

如果要限制每个进程的内存使用量,可以使用ulimit(每个进程100 MB)执行此操作。

 # file: /etc/security/limits.conf phpcgiuser hard as 102400 

编辑:但是,你应该分析软件是什么导致内存泄漏。

如果这是常规使用的结果,你应该检查这些PHP脚本的内存泄漏,无限循环,以及这样的可怕的问题。