Ubuntu 22.04.2 LTS下perf分析中nft_pipapo_avx2_scratch_index异常占比及工具显示差异的排查咨询
大家好,我正在排查自己Ubuntu 22.04.2 LTS机器上的性能问题,过程中遇到了一堆摸不着头脑的现象,想请教下社区的大佬们:
我先执行了这条perf录制命令来采集数据:
sudo perf record -g -F max -s --call-graph dwarf -e cycles -e sched:sched_switch --switch-events --sample-cpu
之后用sudo hotspot打开录制文件,发现2秒内只收集了719个样本,精度确实有点拉胯,但还是发现了异常:时间线显示CPU有不少时间花在进程#0(应该是内核进程)上,而且在HotSpot的Top Down视图里,nft_pipapo_avx2_scratch_index这个函数几乎无处不在。
我查了下这个函数的背景,它属于netfilter项目的nf_tables模块,是用来处理IP包过滤、防火墙相关逻辑的(是PIPAPO机制的一部分,专门处理任意范围拼接的规则集)。
本来觉得这事儿还能理解,但当我用同样的perf命令,加上自己的高性能软件二进制文件重新录制后,最新版HotSpot给我整懵了:它显示30%的CPU周期都消耗在这个函数上,时间线里的蓝色块甚至显示这个函数几乎在我所有的业务线程里都有介入。
更诡异的是,我录制前已经把nf_tables、x_tables、ip_tables这几个内核模块加入了黑名单,重启后用lsmod反复确认过这些模块都没有加载,但HotSpot里还是把这个函数归到nf_tables二进制名下。
另外还有个工具兼容的问题:我尝试用perf report打开同一个录制文件,却根本看不到这个函数的相关信息。我已经安装了带调试符号的Linux内核镜像,并且用-k参数指定了调试符号路径,但完全没用。这里我特别疑惑:为什么HotSpot不需要这些内核调试符号就能显示这个函数,而perf-report却不行?
目前我自己琢磨出两个假设,但拿不准哪个对:
- 假设1:perf-report没有显示这些样本,是因为它会根据我指定的目标二进制自动过滤内核相关的样本?
- 假设2:这是HotSpot在样本的CPU周期/时间属性归因上的可视化bug?
有没有大佬能帮忙分析下这到底是怎么回事?
备注:内容来源于stack exchange,提问作者Martijn Courteaux

