从EBS切换到EFS后Apache/PHP-FPM性能下降排查求助
排查方向建议
核心问题定位
当前核心矛盾是CPU负载高但使用率低+大量PHP-FPM进程处于D状态,结合EFS迁移后的表现,本质是进程在等待IO(D状态即不可中断睡眠,通常对应磁盘/网络IO等待),但EFS官方指标未触发瓶颈,需从NFS协议细节、系统内核参数、WordPress文件访问模式三个方向深挖。
一、NFS挂载与EFS配置优化排查
- 调整NFS挂载参数
- 当前挂载参数
timeo=600(60秒超时)过大,建议改为timeo=100(10秒),减少进程等待超时的时间;同时添加async参数(仅在可接受少量数据丢失场景下使用,WordPress静态文件/插件目录可尝试),降低同步IO等待对进程的阻塞 - 验证
rsize/wsize是否匹配EFS最优值:可临时改为rsize=262144,wsize=262144(256KB)测试性能变化,部分内核版本对1MB大尺寸块的处理存在额外开销 - 添加
noatime,nodiratime参数,禁用文件/目录访问时间记录,减少EFS的元数据IO请求
- 当前挂载参数
- EFS元数据性能排查
- 查看EFS控制台的Metadata IOPS指标,WordPress插件目录有大量文件枚举操作,元数据IO是EFS常见瓶颈,即使吞吐量/IO使用率没到上限,元数据IOPS可能已饱和
- 尝试启用EFS的Performance Mode为
Max I/O,该模式专为高并发元数据访问优化,适配多站点共享插件目录场景
二、系统内核与进程调度优化
- NFS相关内核参数调整
- 调整
net.core.rmem_max和net.core.wmem_max至4MB:echo 4194304 > /proc/sys/net/core/rmem_max、echo 4194304 > /proc/sys/net/core/wmem_max,提升NFS网络缓冲区大小,缓解大流量下的网络队列阻塞 - 优化
sunrpc.tcp_slot_table_entries参数,改为128:echo 128 > /proc/sys/sunrpc/tcp_slot_table_entries,增加RPC并发连接数,适配高并发PHP-FPM进程的NFS请求 - 调整
vm.dirty_ratio=10、vm.dirty_background_ratio=5,减少脏页回写阻塞对进程的影响
- 调整
- PHP-FPM进程调度优化
- 当前
pm.max_children=2000远超过96核的合理值(建议为CPU核心数*24,即192384),过多进程会导致上下文切换激增,同时加剧NFS请求的并发排队,先将该值下调至300测试 - 启用PHP-FPM的
pm.process_idle_timeout=10s,回收闲置进程,减少无用的NFS连接占用
- 当前
三、WordPress文件访问模式优化
- 插件目录本地缓存优化
- 用
rsync定期同步EFS插件目录到本地EBS,配合inotifywait实现实时同步,既保留EFS的集中管理,又避免高并发下的NFS访问瓶颈 - 启用W3 Total Cache的Opcode Cache高级设置,强制缓存插件文件的字节码,减少PHP对插件文件的磁盘读取请求
- 用
- 减少文件枚举操作
- 检查WordPress站点是否存在大量调用
scandir/glob的插件或主题,这类操作会触发大量EFS元数据请求,可通过禁用冗余插件、优化主题代码减少此类操作 - 为插件目录添加静态资源CDN,将JS/CSS等静态文件从EFS剥离,降低NFS的访问压力
- 检查WordPress站点是否存在大量调用
四、深层诊断工具使用
- 用
pidstat -d 1实时查看每个PHP-FPM进程的IO等待情况,定位具体进程对应的IO请求类型(读/写/元数据) - 用
trace-cmd或perf record追踪内核级的NFS请求流程,查看是否存在内核锁或RPC调用阻塞 - 启用EFS的访问日志,筛选插件目录的请求频率和延迟,确认是否存在高频元数据请求
内容的提问来源于stack exchange,提问作者Gnosis
相关产品推荐
相关产品推荐

