博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小心 php fpm 的超时
阅读量:6271 次
发布时间:2019-06-22

本文共 935 字,大约阅读时间需要 3 分钟。

hot3.png

一次线上问题,让我意识到,fpm 居然是用这种方式处理超时的,虽然有点震惊,但是想想,这才是我大 PHP 处理问题的方式,简单粗暴而且高效。

问题的现象是这样的,某个接口访问量大增,然后接口大量502,接着 fpm 的机器cpu暴涨,最后gg。

fpm 处理超时的方式非常简单,那就是,直接退出 worker 子进程。

对于超时的处理,fpm 的代码里是这样写的的(我隐去了细节,有兴趣的可以去 PHP 官网下载一份源码看看,在源码的 sapi/fpm 目录里) 检测超时

static void fpm_pctl_check_request_timeout(struct timeval *now){    ……    fpm_request_check_timed_out(child, now, terminate_timeout, slowlog_timeout);    ……}

处理超时

void fpm_request_check_timed_out(struct fpm_child_s *child, struct timeval *now, int terminate_timeout, int slowlog_timeout){    ……            fpm_pctl_kill(child->pid, FPM_PCTL_TERM);    ……    }}

然后kill

int fpm_pctl_kill(pid_t pid, int how) {    ……    return kill(pid, s);}

然后问题就清楚了,接口里有个服务超时,造成fpm超时,fpm worker 进程不断被kill掉并拉起新的 fpm worker 进程,然后不断的这样 kill 然后拉起,cpu 就暴涨,最后 gg。

这个问题怎么避免,去掉 fpm 超时是万万不可取的,只能严格控制代码,调用每一个外部服务必须设置超时时间,而且这个超时时间必须小于 fpm 超时时间。

更多架构、PHP、GO相关踩坑实践技巧请关注我的公众号:PHP架构师

转载于:https://my.oschina.net/u/222608/blog/1924450

你可能感兴趣的文章
Windows Server 2012正式版RDS系列⒃
查看>>
Shell脚本之awk篇
查看>>
微软发布Azure Stack硬件需求
查看>>
python socket编程详细介绍
查看>>
Windows Server 2016第三个技术预览版新技术
查看>>
Everything 本地磁盘文件搜索工具下载!
查看>>
Python dict(字典) 详细总结
查看>>
RPF(Reverse Path Forwarding 反向路径转发)技术
查看>>
2016年收到的第一件礼物,被评上微软全球最有价值专家MVP(一)
查看>>
2016中国VR开发者论坛第一期
查看>>
Hyper-V 2016 系列教程5 Hyper-V 服务器基本属性
查看>>
北京、天津工厂自动监测数据爬取
查看>>
第一个python程序简单加法计算器
查看>>
在CentOS下安装Tomcat8
查看>>
Weblogic classloader分析
查看>>
做技术做软件-----如何才能拿到上万的月薪
查看>>
linux 查看当前路径命令:pwd
查看>>
At.js – 用于 Web 应用程序的自动完成库
查看>>
[Android Pro] Android权限设置android.permission完整列表
查看>>
如何对抗硬件断点--- 调试寄存器
查看>>