故障排查过程
背景介绍
记一次线上python程序故障~~这个出问题的服务是一个使用zerorpc库搭建起来的简单RPC服务,负责向某个服务的management端口发送命令并记录命令的返回结果(与management端口使用socket进行通信)
故障现象
故障是偶发的,表现为进程CPU使用率为100%,整个进程hang住,无法对调用做出应答。
问题的解决思路是
- 找出故障时的程序堆栈。像C和C++可以使用gdb打印backtrace, java可以使用jstack,python应该也有类似的方法。在网上找到了gdb + python-debuginfo的方法:https://wiki.python.org/moin/DebuggingWithGdb,不过试了一下没有成功,后面有时间再研究。
- 于是尝试:
1.strace -p pid
打印系统调用堆栈,有系统调用函数和文件描述符信息(短短几秒打印出几十万行,不断执行poll和recvfrom,初步判断陷入死循环)如图所示:
2. 找出上一步的文件描述符(fd),再ls -l /proc/pid/fd | grep