PHP-FPM 池、子进程和内存消耗

PHP-FPM 池、子进程和内存消耗

在我的 PHP-FPM 配置中,我有 3 个池,例如:配置是:

;;;;;;;;;;;;;;;;;;;;;;;
; Pool 1              ;
;;;;;;;;;;;;;;;;;;;;;;;
[www1]
user = www
group = www

listen = /tmp/php-fpm1.sock;
listen.backlog = -1
listen.owner = www
listen.group = www
listen.mode = 0666
pm = dynamic
pm.max_children = 40
pm.start_servers = 6
pm.min_spare_servers = 6
pm.max_spare_servers = 12
pm.max_requests = 250
slowlog = /var/log/php/$pool.log.slow
request_slowlog_timeout = 5s
request_terminate_timeout = 120s
rlimit_files = 131072

;;;;;;;;;;;;;;;;;;;;;;;
; Pool 2              ;
;;;;;;;;;;;;;;;;;;;;;;;
[www2]
user = www
group = www

listen = /tmp/php-fpm2.sock;
listen.backlog = -1
listen.owner = www
listen.group = www
listen.mode = 0666
pm = dynamic
pm.max_children = 40
pm.start_servers = 6
pm.min_spare_servers = 6
pm.max_spare_servers = 12
pm.max_requests = 250
slowlog = /var/log/php/$pool.log.slow
request_slowlog_timeout = 5s
request_terminate_timeout = 120s
rlimit_files = 131072

;;;;;;;;;;;;;;;;;;;;;;;
; Pool 3              ;
;;;;;;;;;;;;;;;;;;;;;;;
[www3]
user = www
group = www

listen = /tmp/php-fpm3.sock;
listen.backlog = -1
listen.owner = www
listen.group = www
listen.mode = 0666
pm = dynamic
pm.max_children = 40
pm.start_servers = 6
pm.min_spare_servers = 6
pm.max_spare_servers = 12
pm.max_requests = 250
slowlog = /var/log/php/$pool.log.slow
request_slowlog_timeout = 5s
request_terminate_timeout = 120s
rlimit_files = 131072

我根据网络上的一些示例计算了 pm.max_children 进程数,例如40 x 40 Mb = 1600 Mb。我为 PHP 分配了 4 GB 的 RAM,现在根据计算,一个套接字上有 40 个子进程,而我的 Nginx 和 FPM 配置中总共有 3 个套接字。我怀疑这些子进程消耗了多少内存。

httperf hog我尝试通过和在服务器中创建高负载siege,但我无法计算所有 PHP 进程的准确内存使用情况(其他进程,如 MySQL 和 Nginx 也在运行)。并且所有套接字都在使用中,因此,我向任何曾经这样做过或知道 PHP 中的 pm.max_children 究竟如何工作的人寻求指导。

因为我有 3 个池/套接字和 40 个子进程,这算作3 x 40 x 40 Mb内存使用量吗?或者它就像 40 个 Max. 子进程共享 3 个套接字(并且总内存使用量仅为40 x 40 Mb)?

答案1

这个问题没有简单的答案。很难将单个内存数据归结为正在运行的 PHP-FPM 进程。

首先,一个进程的内存使用通常被分成多个部分(通常是共享和非共享内存),而共享内存的使用很大程度上取决于PHP中库的使用。

如果您需要的指导是优化繁忙的 Web 服务器的正确设置,我可以推荐以下内容:

  • 在生产过程中坚守安全价值观。
  • 利用繁忙的生产时间来扩展极限并查看其如何处理(生产使用情况是最好的指标)。
  • 回收经常使用的进程,为进程非共享内存提供一个新的开始。
  • 不再关注每个进程的内存使用情况。
  • 运行基准测试工具和负载生成器来找到系统的极限。

我认为您正在寻找适合您的服务器规模的最佳内存设置。请记住,一个请求的持续时间也会对保持 Web 服务器响应所需的进程数量产生很大影响。

测量进程内存的一个很好的参考是堆栈溢出

答案2

以下 python 脚本会很有用,因为它会向您显示所有子进程使用的 php-fpm 内存总量、子进程总数以及负载测试期间使用的共享/私有内存:

http://www.pixelbeat.org/scripts/ps_mem.py

相关内容