记一次线上python hang故障

故障排查过程

背景介绍

记一次线上python程序故障~~这个出问题的服务是一个使用zerorpc库搭建起来的简单RPC服务,负责向openv*n的management端口发送命令并记录命令的返回结果(与openv*n 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,初步判断陷入死循环)如图所示:
    记一次线上python hang故障
    2. 找出上一步的文件描述符(fd),再ls -l /proc/pid/fd | grep {fd}查看当前在操作的文件
    3. 观察到此fd是一个socket连接
    通过上面几个步骤,范围已经缩小很多了,基本可以定位到是哪段代码出现问题了,解决方法就不细讲了~~bugfixed.

一些衍生的知识点

strace

strace常用来跟踪进程执行时的系统调用和所接受的信号。使用strace命令输出的内容每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,等号右边是该调用的返回值。
使用命令strace -h 可以查阅使用方法

参考链接:
[1]: https://blog.csdn.net/chroming/article/details/82057397