背景介绍

业务人员经常需要导出大量数据,考虑到 Excel 导出通常较耗时,容易出现 timeout 现象;所以通过 MQ 异步方式实现导出功能;
但是功能上线后,每隔一段时间,业务人员就反馈 Excel 导出失败;
查看ActiveMQ 服务器,发现消费者正常存在,但是消息却没有被消费掉,处于积压状态。

排查

  1. 通过 ps auxf | grep SendEmailConsumer 查看消费进程PID;获取到PID为:17128

PS:此处截图只做参考,之前的截图丢失了,此处新截图,PID 会对应不上
截屏2021-09-01 下午8.06.40.png

  1. 通过 strace -p 17128 查看当前消费进程的系统调用;

截屏2021-09-01 下午8.13.15.png
发现消费进程一直在循环调用 select 系统函数;
通过查询 select 函数文档得知,第二个参数为想要查看是否读就绪的文件描述符
截屏2021-09-01 下午8.17.34.png
截屏2021-09-01 下午8.17.49.png

  1. 通过 ls -l /proc/17128/fd 查看 消费进程 打开了哪些文件 或 设备;

    查询得知,13 为 socket,并且对应的标识符为 1447509076
    截屏2021-09-01 下午8.22.44.png

  2. 通过 lsof -n -P | grep --color '1447509076' 查看 socket 的源地址、目标地址信息;

截屏2021-09-01 下午8.31.33.png

结论

通过查询得知,xxx.xxx.137.41 是ActiveMQ 服务器;
初步判断是消费者与MQ服务器 TCP 连接没有正常断开,又没有心跳检测机制,导致消费进程假死;

参考

  1. Debugging across pipes and sockets with strace