我看到一个问题,PHP-FPM完美工作了几天,然后决定填满所有的内存+交换和调用OOM杀手。 发生这种情况后,服务器是完全死了,你甚至不能SSH进去了。 必须重启才能恢复正常。
我想知道为什么会发生这种情况,如果有一个修复或解决方法,如限制它可以使用的内存量或重新启动过程,如果它开始使用太多。
我已经捕获了内核转储发生的最后几次。
我的php-fpm.conf
我的www.conf:
让我知道如果还有什么我可以给你更多的信息,为什么这可能会发生。
您可能需要了解是否所有的内存分配是由一个不寻常的请求引起的(在这种情况下,您将不得不修复代码),或者这是渐进式内存泄漏的结果。 在后一种情况下,您可以减lessmax_requests参数以更频繁地重新启动PHP-FPM子项。
如果你不能解决代码中的问题,你可能不得不使用一个肮脏的黑客。 比如,编写一个脚本来监视PHP内存消耗并重新启动它。
还有一种方法可以限制给定进程的内存消耗(如这里或这里所述 ),但是我没有机会testing它。
关于OOM有很多很棒的信息。 如果你想了解发生了什么,我build议用更多的关键字来search它
我曾经在一个客户项目中做过这个工作,并且必须处理这个问题。 不幸的是,以上推荐的内容都没有帮助,因为这与内核有关。 OOM是在Linux中过度使用内存的一个肮脏的解决方法。
什么帮助(我)是设置一些内核参数,完全避免OOM。 要快速修复它,请将以下行添加到/etc/sysctl.conf以使更改在启动时保持持久性:
vm.overcommit_memory = 2 vm.overcommit_ratio = 80
不过,我会build议阅读OOM。 你可能会发现一些更有用的信息。
尝试减lesspm.max_requests到一些较低的值(1000)。 此外,您有高pm.start_servers,pm.start_servers,pm.max_spare_servers值和极高的pm.max_children