kprobe分析内核kworker占用CPU 100%问题总结

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内核提供的基础设施:

  1. tarcepoints => 静态探测点
  2. kprobe => 内核态动态探测点(kernel/kprobe.c, example:sample/kprobe)
  3. uprobe => 用户态动态探测点(kernel/events/uprobe.c)
  • ftrace是后面工具的基础,但使用比较繁琐
  • perf可图形化展示函数耗时,但不能自定义跟踪调试。
  • operf/oprofile依赖vmlinux,并且得带有debug信息。
  • systemtap依赖太多,kernel-debuginfo、内核编译参数等等,生产环境基本不可用。

kprobe作为轻量级内核调试工具,在诊断内核bug时有着先天独厚的优势,相

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阅读Linux内核设备驱动的关键是理解内核的基本概念和数据结构,并掌握一些常用的调试工具。以下是一些高效阅读Linux内核设备驱动的建议: 1. 提前了解Linux内核基础知识:在开始阅读设备驱动代码之前,建议对Linux内核的基础知识有一定了解,如进程管理、内存管理、进程调度等。这有助于更好地理解设备驱动的实现原理。 2. 熟悉常用的设备驱动框架:Linux内核的设备驱动通常遵循一定的框架,如字符设备驱动、块设备驱动、网络设备驱动等。熟悉这些框架的基本结构和函数接口,能够更好地理解和阅读具体的设备驱动代码。 3. 掌握内核调试工具:内核调试工具如printk、kprobe、kdump等对于理解设备驱动的执行流程及问题定位非常重要。学习使用这些工具,能够帮助快速定位并解决设备驱动的问题。 4. 阅读相关文档和源码注释:Linux内核源码中有大量的注释和文档,这些对于了解设备驱动的实现细节非常有帮助。注重阅读驱动源码中的注释和相关文档,能够更快地理解和掌握设备驱动的实现逻辑和使用方法。 5. 学习实际案例:通过学习和分析一些实际的设备驱动案例,可以更好地理解设备驱动的编写和调试方法。可以选择一些开源的设备驱动代码进行学习,并模仿其中的设计和实现方法。 总之,高效阅读Linux内核设备驱动需要掌握内核基础知识,熟悉常用的设备驱动框架,掌握内核调试工具,并善用相关文档和注释,同时通过学习实际案例来提高对设备驱动的理解和应用能力。这些方法可以帮助我们更高效地阅读和理解Linux内核设备驱动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值