kprobe分析内核kworker占用CPU 100%问题总结
Create by Billow.Jen,2020.3.8
前言
利用linux kernel 动态追踪技术,排查问题本身就可能会变成一个非常有趣的过程,让我们遇到线上的诡异问题就感到兴奋,就仿佛好不容易又逮着机会,可以去解一道迷人的谜题。
一、系统问题说明
背景说明
负载均衡模块独立主机部署,运行BIRD、quagga、nftbl、contiv、ovs等进程,实现网络NAT功能。
内核版本:centos7-4.19.8
问题描述
在调用nftlb写入nft规则的过程中,发现部分主机性能低(因操作系统为centos且内核进行了升级,红帽服务不支持。)
过程如下:
1、执行命令:
time ip netns exec vpc067871207-lbalance curl -H "Key: spidernet" -X POST http://127.0.0.1:06787/farms --data '{"farms":[{"name":"b1","family":"ipv4","virtual-addr":"XX.XX.XX.XX","virtual-ports":"1001","mode":"snat","protocol":"tcp","scheduler":"weight","state":"up","backends":[{"name":"bck01","ip-addr":"192.168.0.1","port":"80","weight":"5","mark":"0x00000001","priority":"1","state":"up"}]}]}'
该命令正常应该在0.2ms内完成,但在部分主机上耗时到2、3s。
2、利用strace命令跟踪:
strace -tt -T -v -f -s 1024 -p 2727846
发现耗时在sendmsg(AF_NETLINK…)函数上,有长有短,短的在几十us,但有四个长在0.5s左右的sendmsg,如:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eAfNbx6U-1584208688223)(en-resource://database/1982:1)]
3、继续分析主机进程,发现一个进程kworker一直100%
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QxeEl9NA-1584208688224)(en-resource://database/1984:1)]
4、观察主机性能,nmon如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ewVOFHNl-1584208688225)(en-resource://database/1990:1)]
此时主机内存、cpu、网络、存储都很空闲,但中断比正常主机高1~2倍。
5、用perf工具查看kworker耗时
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CEyDfmjJ-1584208688226)(en-resource://database/1988:1)]
6、网卡中断,经确认(/proc/interrupts)网卡中断分布在每个cpu上,网络中断均衡
7、继续ftrace,分析事件:
cd /sys/kernel/debug/tracing
echo wakeup_rt > current_tracer
echo 0 > options/function-trace
echo 1 > events/enable
echo 1 > tracing_on
echo 0 > tracing_max_latency
chrt -f 5 sleep 1
echo 0 > tracing_on
cat trace
结果没有针对性,不具备进一步分析条件。初步问题分析完了,下步进行内核态深度分析。
小结
内核该kworker进程的性能影响了work处理效率,导致内核较慢,响应sendmsg的work延迟,导致curl耗时长。
二、内核性能分析、跟踪工具简述
ftrace、kprobe、perf、operf/oprofile、systemtap都是跟踪内核的好工具,但有所区别。
Linux内核提供的基础设施:
- tarcepoints => 静态探测点
- kprobe => 内核态动态探测点(kernel/kprobe.c, example:sample/kprobe)
- uprobe => 用户态动态探测点(kernel/events/uprobe.c)
- ftrace是后面工具的基础,但使用比较繁琐
- perf可图形化展示函数耗时,但不能自定义跟踪调试。
- operf/oprofile依赖vmlinux,并且得带有debug信息。
- systemtap依赖太多,kernel-debuginfo、内核编译参数等等,生产环境基本不可用。
kprobe作为轻量级内核调试工具,在诊断内核bug时有着先天独厚的优势,相