原文:http://vearne.cc/archives/297

引子:

我这里说的hang住,并不是指死锁,在真实的工作场景中,死锁的情况其实并不很多见。在我工作的几年中,有遇到好几次都是程序hang在某个IO请求上的。

1. 排查

排查hang住的最有用的命令是strace和lsof命令
比如我们有一个服务叫 atm-client

1.1 首先查出服务对应的进程
ps -ef| grep atm-client| grep -v grep

输出结果

root          5      1  0  2017 ?        01:05:39 atm-client
1.2 对于多线程的程序可以先列出进程的所有线程
ps -mp 5 -o THREAD,tid

输出结果

USER     %CPU PRI SCNT WCHAN  USER SYSTEM    TID
root      0.3   -    - -         -      -      -
root      0.0  19    - poll_s    -      -      5
root      0.0  19    - sk_wai    -      -     11
root      0.0  19    - sk_wai    -      -     12
root      0.0  19    - sk_wai    -      -     13
root      0.0  19    - sk_wai    -      -     14
root      0.0  19    - sk_wai    -      -     15
root      0.0  19    - sk_wai    -      -     16
root      0.0  19    - sk_wai    -      -     17
root      0.0  19    - sk_wai    -      -     18
root      0.0  19    - sk_wai    -      -     19
root      0.0  19    - sk_wai    -      -     20
root      0.0  19    - sk_wai    -      -     21
1.3