背景介绍
业务人员经常需要导出大量数据,考虑到 Excel 导出通常较耗时,容易出现 timeout 现象;所以通过 MQ 异步方式实现导出功能;
但是功能上线后,每隔一段时间,业务人员就反馈 Excel 导出失败;
查看ActiveMQ 服务器,发现消费者正常存在,但是消息却没有被消费掉,处于积压状态。
排查
- 通过
ps auxf | grep SendEmailConsumer
查看消费进程PID;获取到PID为:17128
PS:此处截图只做参考,之前的截图丢失了,此处新截图,PID 会对应不上
- 通过
strace -p 17128
查看当前消费进程的系统调用;
发现消费进程一直在循环调用 select
系统函数;
通过查询 select
函数文档得知,第二个参数为想要查看是否读就绪的文件描述符
通过
ls -l /proc/17128/fd
查看 消费进程 打开了哪些文件 或 设备;查询得知,13 为 socket,并且对应的标识符为 1447509076
通过
lsof -n -P | grep --color '1447509076'
查看 socket 的源地址、目标地址信息;
结论
通过查询得知,xxx.xxx.137.41 是ActiveMQ 服务器;
初步判断是消费者与MQ服务器 TCP 连接没有正常断开,又没有心跳检测机制,导致消费进程假死;