php-fpm:为什么我的进程内存使用量高于memory_limit

php-fpm:为什么我的进程内存使用量高于memory_limit

我知道有很多相关的主题,但我没有找到我的答案。

我有一台具有 32Go RAM 的专用服务器(但我希望 php-fpm 最多只使用 12Go),并且我有一个与 apache 服务器一起运行的 php-fpm(7.2.13)。

我的问题是每个 php-fpm 进程都消耗了太多内存...我用

ps -ylC php-fpm --sort:rss

输出为 269 个进程,每个进程的 RSS 列中有 121Mo,并且在 3Go 专用服务器上总共占用了 RAM。

我还使用“memory_get_peak_usage()”php 函数进行了一些 php 分析,我的每个脚本平均使用 6Mo(峰值使用量!),最大峰值使用量为 50Mo(但这是一个非常特殊的情况)。在进行此分析后,我尝试将“memory_limit”设置为 10Mo,特定情况不起作用,因此我将其设置为 50Mo,一切正常(正常行为)。

我有两个问题:

  • 由于我的 php 脚本的峰值使用量不超过 50Mo,并且我将 memory_limit 设置为 50Mo,为什么我的每个 php-fpm 进程都很大 121Mo?

  • 如何让 269 个进程同时运行,并且每个进程都大 121Mo?总内存量为 269*121 = 32Go(当我进行此分析时,专用服务器使用的 RAM 总量只有 3Go...)

非常感谢你的帮助 !

答案1

php-fpm 进程使用的大部分内存是所有进程共享的。只有一小部分是每个进程独有的。您可以使用该实用程序查看共享内存和独有内存的数量smem。首先使用以下命令安装它

sudo apt-get install smem

或者

sudo yum install smem

然后运行smem -P php-fpm

您将获得包含以下信息的 php-fpm 进程列表:

交换:内存交换至磁盘

美国海军:此进程使用的唯一驻留内存 (RAM)

前列腺特发性硬化症:此进程使用的总驻留内存,包括一定比例的共享内存。将此列相加可得到进程使用的实际内存总量,而无需重复计算共享内存。

RSS:此进程使用的驻留内存,包括所有共享内存,如 中报告的ps。正如您所指出的,将其相加将使总数膨胀,因为它会重复计算共享内存。

答案2

第一个问题:php-fpm进程需要内存用于 php 解释器本身;50Mb 的限制限制了脚本可以消耗的 RAM 数量,此外还有解释器无论如何都需要的内存数量。

第二个问题:您的进程可能共享了相当多的内存(肯定是从同一个二进制文件/库加载的所有代码页)。

相关内容