我知道有很多相关的主题,但我没有找到我的答案。
我有一台具有 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 数量,此外还有解释器无论如何都需要的内存数量。
第二个问题:您的进程可能共享了相当多的内存(肯定是从同一个二进制文件/库加载的所有代码页)。