bug排查大曝光,涉及Linux内核的那种
|
程序员的工作之一,调试代码的时间甚至会超过编写代码,之前为大家讲解了很多关于系统、架构、编程等方面的内容,这篇文章就为大家全方位展示一次涉及到内核的 bug 排查过程。 发现问题 话说一天公司服务器报警,登录到机器后发现进程已被“卡死”,常规 GDB 调试没有反应,查找 Log 也没有线索,问题似乎已经无解。 就在这时博主的脑海里浮现出了岛国的。。是的,你猜错了,是岛国的一休哥、柯南弟、国内的包青天、狄仁杰、国外的夏洛克等一众大佬,瞬间有如神助,一定还有办法!是的! 分析问题 先来仔细分析一下,既然进程看上去被卡死,那么如果被卡在用户态,那么该进程 CPU 使用率必然很高(死循环之类);如果被卡在内核态,这时进程应该正在进行 IO 或者网络通信等,那么 CPU 使用率应该会很低,现在还能查到进程ID,有了进程ID运行 top 命 CPU 那一列,显示 CPU 占用率为0%,我们发现此时该进程几乎没有占用CPU,这基本上是在告诉我们该进程是被卡死在内核态,进程要进入内核态那么就是因为调用了某个阻塞式系统调用导致被操作系统挂起,那么该怎么知道进程调用了什么系统调用呢? 跟踪进程系统调用 strace 命令就用来告诉你这个的,运行 strace 命令来查看一下此时进程调用了什么系统调用:strace一样,pstack 也被卡死了。 现在我们还能去哪里找线索呢? 古老的ps命令永不过时 我们可以利用 ps 命令来查看进程的运行状态和 WCHAN(waiting channel)。 WCHAN 是什么意思呢?
在 Linux 世界,有问题问男人(man),这就是万能的 man 命令,我们使用 man 命令来看一下 ps 展示内容的含义: (编辑:阜新站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


