You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP-FPM资源配置疑问:降ECS任务内存后连接数激增原因

问题描述

我在ECS EC2上运行PHP-FPM+Nginx技术栈,此前观察到内存和CPU使用率都较低,于是将ECS任务内存从13GB调整至9GB。但调整后,PHP-FPM引发的连接数大幅上升,明明之前资源有富余,想知道出现这种情况的原因。


相关配置信息

PHP-FPM配置(www.conf)

pm = dynamic
pm.max_children = 150
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 8
pm.max_requests = 500

ECS任务配置

新配置

TASK_MEMORY="9216"    
TASK_MEMORY_RESERVATION="8192"

旧配置

TASK_MEMORY="13516"    
TASK_MEMORY_RESERVATION="12288"

监控指标图

  • PHP-FPM指标图:PHP-FPM指标图
  • 容器CPU指标图:容器CPU指标图
  • 内存RSS指标图:内存RSS指标图

问题分析与解答

这种现象的核心原因是PHP-FPM进程的内存需求与ECS任务内存配额不匹配,导致进程频繁启停或无法按需扩容,进而引发请求排队,具体拆解如下:

  1. PHP-FPM动态进程模式的内存逻辑冲突
    在dynamic模式下,PHP-FPM会根据请求量动态调整进程数,但每个PHP-FPM进程都会占用一定内存(通常几十MB到上百MB不等)。你的pm.max_children=150意味着理论上最多会启动150个进程,按单个进程平均占用60MB计算,仅PHP-FPM就需要9GB内存(150×60=9000MB),刚好触达新配置的TASK_MEMORY=9216MB上限。

  2. ECS内存硬限制触发进程回收
    当ECS任务内存接近或达到TASK_MEMORY上限时,容器运行时(如Docker)会触发OOM killer,或PHP-FPM自身启动进程回收机制,强制终止部分进程。新请求进来时,PHP-FPM需要重新启动进程处理,但进程启动存在延迟,导致请求排队,最终表现为连接数大幅上升。

  3. 旧配置的内存冗余掩盖了进程上限问题
    旧配置13GB内存时,即便PHP-FPM启动满150个进程,内存占用也远未达上限,进程可以稳定运行,无需频繁启停,因此连接数保持正常。此前的低使用率是因为实际请求量未触发pm.max_children的上限,并非内存真的有大量富余空间。

  4. 优化建议

  • 先统计单个PHP-FPM进程的平均内存占用(可通过ps aux | grep php-fpm查看RSS列),计算合理的pm.max_children值,确保总内存占用不超过TASK_MEMORY_RESERVATION的80%(预留内存给Nginx和系统进程)。
  • 降低pm.max_children至合适值,比如单个进程占用60MB时,9GB内存下建议设置为pm.max_children=120(120×60=7200MB,预留2GB给其他进程)。
  • 调整pm.start_servers、pm.min_spare_servers、pm.max_spare_servers,使其与实际请求量匹配,避免进程频繁启停。

内容的提问来源于stack exchange,提问作者Pablo Marques

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:17:45