僵尸进程
程序:thinkphp6+think-queue
环境:宝塔linux+Supervisor
问题现象:
我有一个脚本,每半个小时查询需要执行的任务,再通过消费队列的方式,投递执行。
已知,当前半个小时执行数量20,从11:30到14:00,理论上在日志中,至少有120条记录,日志只有不到10条,而且消费的任务名称不一致(我在日志中会输出当前执行的是什么任务),无规律,
也就是出现任务丢失。
查看thinkphp的log,无异常。查看队列的异常log,也无异常。
排查发现,其他队列正常。只有cron这个处理定时任务的队列异常。
在Supervisor重启cron后,14:00那一轮也只有2条。
排查发现
bash
[root@iZ8vbhyenz6cZ public]# ps aux | grep -E "queue:work.*cron"
root 197330 0.0 0.5 223276 45300 ? S 14:13 0:00 php think queue:work --queue cron --tries 1 --timeout 300
root 198191 0.0 0.0 5756 940 pts/1 S+ 14:17 0:00 grep --color=auto -E queue:work.*cron
root 1278768 0.0 1.3 321236 104348 ? S May25 5:26 php think queue:work --queue cron --tries 1 --timeout 300
root 3919432 0.0 0.4 227376 32128 ? S 11:24 0:02 php think queue:work --queue cron --tries 1 --timeout 300
[root@iZ8vbhyenz6cZ public]# /www/server/panel/pyenv/bin/supervisorctl status | grep -i cron
cron:cron_00 RUNNING pid 197330, uptime 0:04:15
[root@iZ8vbhyenz6cZ public]#
发现了,3个进程同时在消费同一个 cron 队列。
Supervisor用的是197330,而我设置的进程数量只有1,理论上就应该只有1个进程。
那就意味着,冒出来的1278768 、3919432是异常的,大概率分发到他们了,进程在但实际未工作。
bash
# 杀掉两个僵尸 Worker(1278768 和 3919432)
kill -9 1278768 3919432
# 确认杀干净了
ps aux | grep -E "queue:work.*cron"
重新投递未执行成功的任务。正常。
14:30那一轮也正常执行了。
你好,我是勤勤学长。