Ted's Blog



一次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阻塞导致僵尸进程的问题


分享:

写评论


Contact ME

github:https://github.com/tebie6

email:liumingyuphp@163.com

友情链接

无敌我大鑫哥:http://dream128.cn