背景
最近遇到某个线上服务进程卡死的情况,但是在本地调试的过程中又没法复现,需要在线上服务器运行一段时间后在某些条件下才会触发。
定位问题
首先我们用ps auxf命令查看我们的进程执行到了哪一步:
可以看到执行到了[sh]然后就卡死了,然后我们接着通过strace命令来查看执行这个操作死在了哪个系统回调:
root@demo:~# strace -p 6093 Process 6093 attached recvfrom(5,
可以看到是死在了系统回调recvfrom这里,描述符5的具体含义我们可以进入 /proc/pid/fd 查看:
root@demo:~# cd /proc/6093/fd root@demo:/proc/6093/fd# ls -l total 0 lr-x------ 1 root root 64 Jul 14 05:58 0 -> pipe:[675847127] l-wx------ 1 root root 64 Jul 14 05:58 1 -> pipe:[675847128] l-wx------ 1 root root 64 Jul 14 05:58 2 -> pipe:[675847128] lr-x------ 1 root root 64 Jul 14 05:58 3 -> /dev/urandom lrwx------ 1 root root 64 Jul 14 05:58 4 -> socket:[675848446] lrwx------ 1 root root 64 Jul 14 05:58 5 -> socket:[675847890]
我们可以发现,5代表的是socket,说明进程是死在socket通讯上了,那么再去排查线上服务器中有哪些服务用到了socket,最后定位到是X服务中大量不合理的使用socket连接导致的,至此问题就定位到了。