有多个讨论抱怨 的内存占用过高PHP-FPM
,但没有任何实用方法可以解决。当我通过大量测试探索该问题时,发现该问题与 age 的年龄有关PHP-FPM
。
假设我们有pm.max_children
= 10,并且有一个 PHP 脚本消耗 10M 内存。预计需要 100MB。这对于前 10 个进程是正确的。处理 20 个 PHP 脚本后,系统内存使用量为 200MB,这意味着前 10 个进程消耗的内存尚未释放。
这将增加内存使用量,直到pm.max_requests
进程PHP-FPM
被重置。
笔记:这只是为了说明而粗略简化的示例,而不是实际行为。在现实世界中,有时会发生这种情况。通常,在 PHP 脚本结束时,PHP 消耗的内存将自动释放。在 PHP-FPM 中,这些内存sometimes
(我不知道什么时候)不会被释放。
这意味着处理类似的脚本(使用 10MB 内存)时
pm.max_children = 10
pm.max_requests = 100
您不需要 100MB 或 1000MB 的内存;而是介于两者之间的内存。换句话说,一些 PHP 的足迹previous processes
仍留在PHP-FPM
子代上。
根据这一理论,PHP-FPM
可以通过减少来解决的 高内存使用率问题pm.max_requests
,但这不是最终的解决方案,我们需要找到一种方法来释放以前的 PHP 进程对子进程的影响PHP-FPM
。有什么想法吗?
答案1
如果不知道您正在运行什么类型的应用程序,我们很难说您应该怎么做。但是,您考虑过使用按需进程管理器吗?它会在 N 次后终止进程,从而比您可能正在使用的动态或静态进程管理器更节省内存。