为什么静态与dynamic进程pipe理对php-fpm的内存使用量影响很大?

我最近将一个客户端迁移到运行Nginx + PHP-FPM的EC2实例。 当我第一次设置服务器时,我已经设置了pm=static和40个工作进程。 一个星期左右之后,我决定尝试pm=dynamic ,最多200人,最less30人。

我注意到,在静态设置下,40个进程占用了大约2.3GB的内存,而在dynamic的情况下,我看到只有1.2GB内存的60个进程的峰值。

从New Relic看到下面的图表,我的注释是红色的。

新的遗物记忆图表比较静态与动态下午

你可以看到,在11月25日白天,我从静态更改为dynamic,并重新启动php-fpm。 之后我们可以看到48个进程只占用990MB,60个进程只占用了1.2GB的内存。

什么可能导致这种静态和dynamicpipe理之间的差距? 难道是dynamic的,我已经把最大的请求设置为50? 也许静态内存的使用是由于内存泄漏,而不是内部使用php-fpm?

pm.max_requests不是特定于任何进程pipe理器( pm )模式。 它的好处是在他们单独处理的指定数量的请求之后重新启动工作进程。

在极端的情况下,它可以避免内存泄漏,但通常它只是释放内存饥渴的脚本执行时积累的内存分配。 内存分配堆积和分配的内存总量增长,但只在退出时(因此重生时)释放。

就像你说的pm.max_requests当使用pm static时候,你似乎没有激活pm.max_requests 。 你应该看到有所不同,而且肯定比平坦的路线。

pm dynamic还有一个额外的好处,就是根据它们之间的空闲进程数( pm.min_spare_serverspm.max_spare_servers )来停止工作,这是一种度量即时负载的度量。 停止无用进程以进程处理(CPU)为代价释放相关的已分配内存, pm.min_spare_servers在出现尖峰时确保安全缓冲,保持闲置的工作人员准备好处理请求。

现在,如果你真的在照顾你的记忆,下一个需求是更积极的(de)产卵过程(不)需要(再))。 这种模式是最接近边缘的,因为它不会吸收峰值以及pm dynamic ,但是它是内存消耗的最基础(同时使用更多的CPU进行进程pipe理)。

TL; DR

内存分配可以叠加到任何工作进程。 如果一个特定的请求需要内存,它将会放在处理工作者的内存分配上面,直到进程停止,这个请求才会被释放。

使用pm.max_requests来回收进程,无论使用pm.max_requests模式。

pm.dynamic将在另一个加载的标准上回收进程,并且当进程中有太多空闲时会pm.dynamic进程。 拥有更高的stream程更新率更有可能防止他们需要太多内存,代价是更多的用于stream程pipe理的CPU周期。