前面的文章中介绍了使用bcc systemtap等跟踪命令,对内核进行跟踪,还有一个perf工具,作为内核自带的内核分析工具,也可以对内核跟踪和观测,perf的不同之处在于可以方便的分析内核中那个函数占用的CPU时间较多,成为影响系统性能的主要主要因素,所以被称为:Performance Counters for Linux (PCL)。Perf在内核的性能调优方面有其独特的表现。
如果要使用perf跟踪内核,打印内核中的某些变量的值,需要内核安装,debuginfo报文生产/usr/lib/debug/lib/modules/4.18.0-240.1.1.el8_3.x86_64/vmlinux 文件,并获取对应的内核版本的源码包。对应内核的源码包可以通过对应版本的src.rpm包产生。例如:我实验的内核版本为:4.18.0-240.1.1.el8_3.x86_64,通过下面的链接下载sr.rpm包,wget ftp://ftp.pbone.net/mirror/vault.centos.org/8.3.2011/BaseOS/Source/SPackages/kernel-4.18.0-240.1.1.el8_3.src.rpm。然后使用rpm -ivh kernel-4.18.0-240.1.1.el8_3.src.rpm安装,生成/roo/rpmbuild/kernel.spce文件,使用下面的命令安装。rpmbuild -bp kernel.spec。生成对应版本的源码文件:/root/rpmbuild/BUILD/kernel-4.18.0-240.1.1.el8_3/linux-4.18.0-240.1.1.el8.x86_64/。如果没有安装上述两个包,在运行中可能出现下面的错误信息:
在使用perf命令跟踪内核变量可以使用下面的命令,本篇文章还是使用icmp_rcv函数作为跟踪的示例函数:执行下面的命令。
perf probe --source /root/rpmbuild/BUILD/kernel-4.18.0-240.1.1.el8_3/linux-4.18.0-240.1.1.el8.x86_64/ --vmlinux /usr/lib/debug/lib/modules/4.18.0-240.1.1.el8_3.x86_64/vmlinux -L icmp_rcv
执行完上述命令后,列出可以追踪函数的源码以及行号。前面有行号的是可以追踪的内核源码。
使用perf probe -V icmp_rcv:37查看可以跟踪或者打印的内核变量值,上面的命令列出了可打印观察的局部变量的名字。
获取icmp_rcv函数中的icmp type值使用下面的命令:
perf probe --add ‘icmp_rcv:37 tpye=icmph->type’ -f
使用perf record -e probe:icmp_rcv_L37_4 -aR sleep 10 进行记录。这里是捕获跟踪10秒。
假设两台主机:A和B,在A主机上执行perf命令。
下图是在A主机上执行主动的ping命令,输出的type类型为0x00,为主机A收到的reply报文,调用ping_rcv进一步处理。
#define ICMP_ECHOREPLY 0 /* Echo Reply /
下图为在B主机上执行主动的ping命令,输出的type类型为:0x08类型的type报文,为echo request报文。调用icmp_echo函数,
#define ICMP_ECHO 8 / Echo Request */
Perf也能进行一定的内核跟踪,但是局限性也比较大。如果使用perf机制在icmp_rcv函数中打印出报文发送源IP和目的IP地址,其实没有太好的方式。不如使用systemtap和bcc/BPF两种方式方便。Perf更多的使用在对性能进行分析上。是其他两个工具不太具备的能力
perf内核跟踪和探测
最新推荐文章于 2024-03-13 10:57:09 发布