有几个讨论抱怨PHP-FPM高内存使用率,没有任何实际的方法来克服。 当我用大量的testing来探究这个问题时,问题与PHP-FPM时代的年龄有关。
想象一下,我们有pm.max_children = 10,并有一个消耗10M内存的PHP脚本。 一个预计需要100MB的MB。 这对前10个过程是正确的。 处理20个PHP脚本后,系统内存使用量为200MB,这意味着在前10个进程中消耗的内存还没有被释放。
这将增加内存使用量,直到PHP-FPM进程重置时达到pm.max_requests 。
注意:这只是一个大致简化的示例,而不是实际的行为。 在现实世界中,这有时会发生。 通常,在PHP脚本的末尾,PHP所消耗的内存将被自动释放。 在PHP-FPM中,这个内存sometimes (我不知道什么时候)不会被释放。
这意味着用于处理类似的脚本(使用10MB内存)
pm.max_children = 10 pm.max_requests = 100
你不需要100MB或1000MB的内存; 但介于两者之间。 换句话说,一些PHP previous processes脚印留在PHP-FPM孩子PHP-FPM 。
与此理论相一致, PHP-FPM的高内存使用率将通过减lesspm.max_requests来克服,但这不是最终的解决scheme,我们需要find一种方法来释放以前PHP进程对PHP-FPM儿童。 任何想法?
不知道你正在运行的是什么types的应用程序,我们很难说出你应该做什么。 但是,有没有考虑使用ondemand进程pipe理器? 它会在N次之后终止进程,从而使内存更加自由,而不是你可能使用的dynamic或静态。