一次PHP僵尸进程排查分享
好久没有做分享了,今天来分享一下工作中遇到僵尸进程的排查分析
1、问题背景
所负责的项目中有很多php定时脚本获取第三方数据,线下业务反馈数据不同步了
2、排查过程
我首先以为是脚本没有启动,
通过命令查看发现这个脚本已经运行了很多天,我意识到只需5分钟就能能运行完的脚本执行这么长时间肯定是阻塞了
ps aux | grep php apache 2007380 0.0 0.1 266076 25448 ? Ss Dec02 0:00 php ncl.php
通过手动执行脚本,发现该阻塞是偶发存在的,通过断点排查不好定位问题位置
所以通过 strace -p 2007380 查看进程的资源调用
[root@op01 cargocvge_stat_async]# strace -p 2007380 strace: Process 2007380 attached restart_syscall(<... resuming interrupted read ...>) = 0 poll(NULL, 0, 1000) = 0 (Timeout) rt_sigaction(SIGPIPE, NULL, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7ffa0ccfd400}, 8) = 0 rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7ffa0ccfd400}, NULL, 8) = 0 poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7ffa0ccfd400}, NULL, 8) = 0 poll([{fd=5, events=POLLIN}], 1, 1000) = 0 (Timeout) poll(NULL, 0, 1000) = 0 (Timeout)
然后通过 lsof -p 2007380 查看 fd=5的资源内容操作
[root@op01 cargocvge_stat_async]# lsof -p 2007380 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME .... php 2014108 root 5u IPv4 30248799 0t0 TCP op01:35334->no-data:https (ESTABLISHED
发现是一个TCP的操作,到这里再加上网上查阅的资料就初步怀疑可能是CURL请求超时的问题
3、解决方案
通过给CURL 设置 timeout 超时时间,解决了这个因 php curl阻塞导致僵尸进程的问题