GSC 抓取统计里主机负载错误一天两百多次,可同一时段 top 显示 CPU 空闲八成,内存也没吃满,把页面逐个 curl 一遍响应都在 300ms 以内。

一开始怀疑是「磁盘 inode 用尽,写入日志失败后应用返回 500」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。PHP-FPM 的进程池被慢请求占满,新请求排队直到网关超时。也可能是CDN 回源并发上限设得太低,超出部分直接被边缘节点拒绝。

少数情况下是数据库连接数上限打满,页面查询在这里卡住。

动手时先看进程池的排队情况

grep -E 'listen queue|max children' /var/log/php-fpm/error.log | tail -20

再往下统计同一分钟的 5xx 分布

awk '$9>=500{print substr($4,2,17)}' access.log | sort | uniq -c | sort -rn | head

然后核对磁盘与 inode 余量

df -h /var/www; df -i /var/www

临时调大进程池观察水位

pm.max_children = 40
pm.max_requests = 800

别只看报错消失,验证要多做一步。调整后主机负载错误在两小时内归零,GSC 里同一时段的抓取成功率回到 99% 以上,页面响应时间中位数下降一半。

CPU 不高不代表没瓶颈,进程池排队和连接数打满的表现和负载过高完全一样,要分开看。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189