死循环
Glusterfs如果代码中出现死循环,过段时间后,虚拟机将会被异常挂起(io异常),df命令也会卡主!
死循环代码段定位
- pstack 进程号
pstack是通过采集某个时间点,当前进程调用函数的情况,通过多次调用pstack,发现某个函数一直出现,那么,绝大多数情况下,该函数出现(死循环or死锁)。假设func函数出现的概率很高
假设就是出现了死锁、死循环,那么这两种情况有所不同。
死锁:pstack显示卡死的代码行永远是某一行
死循环:pstack显示卡死的代码一直在某个函数范围内,但是行号会在函数内有所变化 - top命令、死循环/死锁
如果Glusterfs出现死循环,那么使用top查看cpu使用率时,将发现该进程cpu占用率会很高,达到100
死锁的情况下,没测过top,后续补充! - gdb调试进程,分析死循环(断点区间:由大变小)
首先,将断点打到函数(大区间),然后C,发现C过很久也一直卡主,说明程序可能在该函数内的某个代码段死循环了,导致没法重新进来
然后,将断点打到pstack显示的行号处(小区间),执行C,如果是死循环,C将会立刻退出,多次C,会一直退出(退出说明程序一直经过该行号)
最后,如果出现上述情况,那绝大多数是死循环了!此时应该用gdb打印各个变量的值,分析代码逻辑,证明的确是死循环。 - 死锁的判断!
上面说的很清楚,死锁的现象是pstack一直卡在某一行,此时,查看代码行,如果发现该代码行的确是LOCK,那么99%是死在这个锁上!
解决死锁!
是否存在AB顺序的加锁
是否存在协程没有cbk,导致同步死等