![PHP-FPM 池、子进程和内存消耗](https://linux22.com/image/608565/PHP-FPM%20%E6%B1%A0%E3%80%81%E5%AD%90%E8%BF%9B%E7%A8%8B%E5%92%8C%E5%86%85%E5%AD%98%E6%B6%88%E8%80%97.png)
在我的 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 内存总量、子进程总数以及负载测试期间使用的共享/私有内存: