Pod内存限制过低会导致php-fpm被OOM Killer终止,引发502错误;应设limits.memory≥1Gi、调低pm.max_children、用/healthz探针并延长initialDelaySeconds、优先基于php-fpm状态指标扩缩容、镜像中固化OPcache配置。

Pod内存限制设太低会导致php-fpm进程被OOM Killer杀掉
ThinkPHP项目在K8s里跑着跑着就502,查kubectl logs看不到明显报错,但kubectl describe pod里能看到OOMKilled状态——这基本就是内存配少了。ThinkPHP本身不重,但php-fpm工作进程在处理上传、Excel导出或并发请求时,单个进程吃300MB+很常见,尤其开了opcache.enable=1和opcache.memory_consumption较大时。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
resources.limits.memory别卡在512Mi,起步至少1Gi,高并发场景建议1.5Gi~2Gi - 同时设
requests.memory为相同值(避免调度到内存紧张节点后被挤占) - 在
php-fpm.conf里调低pm.max_children,比如从50压到15~20,配合K8s多副本横向扩,比单Pod堆进程更稳 - 用
kubectl top pod持续观察实际内存水位,别只看平均值——高峰瞬时占用才是关键
livenessProbe用/index.php健康检查会误杀正在加载的Pod
很多团队直接把Nginx的livenessProbe指向httpGet: path: /index.php,结果Pod刚拉起、OPcache还没热完或数据库连接池没建好,探针就失败,触发反复重启循环。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 独立写一个轻量健康端点,比如
/healthz,只检查PHP运行时和Redis连接(跳过DB),响应体就{"status":"ok"} -
initialDelaySeconds至少设为30,给Composer autoload、OPcache预热留时间 -
failureThreshold别设成1,改成3~5次连续失败再重启,防网络抖动误判 - 避免在
livenessProbe里做耗时操作(如查MySQL主从延迟),它本意是“进程活着”,不是“服务全链路可用”
HorizontalPodAutoscaler按CPU伸缩对ThinkPHP不敏感
CPU使用率在PHP-FPM模型下波动剧烈且滞后:请求进来时CPU飙高,但PHP进程可能卡在IO(如DB查询、CURL)上,此时CPU低但实际已堵住;等CPU回落,队列里已积压一堆请求。HPA光看CPU,往往伸缩慢半拍甚至不伸缩。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 优先用
metrics-server+custom metrics,采集php-fpm.status里的active processes或listen queue len作为伸缩指标 - 如果只能用CPU,把
targetCPUUtilizationPercentage从80%降到60%,并缩短periodSeconds到15秒,提升响应速度 - 加
stabilizationWindowSeconds: 60,防短时流量尖峰引发频繁扩缩容 - 务必配
minReplicas: 2,单Pod故障时有兜底,别让HPA缩到1个然后挂了全站
OPcache配置没进容器镜像导致每次重启都冷启动
本地开发开OPcache没问题,但Dockerfile里没显式复制php.ini或覆盖opcache.revalidate_freq=0,导致K8s滚动更新后,所有Pod的OPcache从空开始重建,首屏加载变慢、CPU飙升,用户感知就是“更新后页面卡几秒”。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- Dockerfile里明确COPY定制的
php.ini,确保含opcache.enable=1、opcache.validate_timestamps=0(生产环境关时间戳校验) -
opcache.memory_consumption设够,ThinkPHP应用通常需128M起步,不够会频繁淘汰缓存 - 用
php -i | grep opcache进Pod验证配置是否生效,别只信Dockerfile写了 - 如果用
php-fpm动态子进程模型,注意opcache.interned_strings_buffer也要调大,否则字符串缓存易满
真正难的不是配多少内存或几个副本,而是得盯住PHP进程生命周期和K8s调度节奏之间的错位——比如OPcache热身要时间,而K8s默认等就绪探针通过就切流量,中间那几秒谁来扛?



















