一次线上CPU软中断异常分析原创
问题现象
小伙伴反映压测过程中,应用服务器资源有点异常。对服务器的TOP打印结果如下图所示
对TOP图进行分析,能拿到几组数据
- us的利用率大约在70%左右
- sy的利用率大约在10%左右
- si软中断的利用率大约在20%-30%之间,很高
- 8核的机器,load负载最高已经到了70,很高
- Wa为0,内存使用率不高,说明资源没有太大的压力
问题判断
对上面几组数据进行综合分析,可以有一些基本判断。
软中断很高而硬中断不高,wa也不高,说明不是网卡中断或者磁盘的缺页中断导致。
sy利用率在10%左右,而软中断是在内核层面的操作。那么有几种可能
代码频繁调用了某些内核函数,比如yield之类的,不停地切换cpu;
内核频繁的在做日志读写;
内核频繁的读取某些配置文件或者缓存文件失败导致死循环;
考虑到负载已经到了70,很明显是线程出现了阻塞。所以很有可能是线程在内核层面读取配置文件失败导致的异常现象
问题定位
Top -H -p pid 获取子线程信息,拿到子线程之后再打印系统调用日志
strace -tt -T -v -f -e trace=file -o /tmp/strace.log -s 1024 -p {TID}
日志解读
这是一个系统调用的日志,做如下解读
内核试图通过lstat函数读取了/tmp/tomcat-docbase.8014904651672037141.8087/v2这个目录的信息,但是没找到,因此无法编译内存指令。
内核反复通过resumed这个函数去恢复提交内存指令,然后让lstat读取,但是依然找不到内容
Resumed是中断恢复指令,因为找不到对应的目录内容,无法编译内存指令集,内核于是陷入死循环,线程阻塞
检查tmp下面的目录,发现tomcat-docbase.8014904651672037141.8087下面是空的,没有V2这一层级,也有可能是无权限写入,需要开发配合检查一下。