当前位置: 首页 > Linux

kprobe-lf-高延迟内核函数定位分析工具

时间:2023-04-06 05:25:00 Linux

一、什么是kprobe-lfkprobe-lf是一个基于kprobe和中断定时器的高延迟函数定位分析工具。kprobe-lf可以定位和分析大多数核函数。当设置的delay足够小时,kprobe-lf也能观察到正常的delayFunctionStack1.1为什么叫kprobe-lf是因为这个工具有两个重要的设置,一个是LATENCY,一个是FUNCTION,简称LF1.2适配问题目前在kernel4.15.0,5.4.54,5.13.0上测试过,这几个版本都可以适配2.gitclone的使用方法https://git.n.xiaomi.com/chenpu1/kprobe_lf.gitcdkprobe_lfbashstart.sh-f[FUNCTION_NAME]-l[LATENCY_TIME]运行脚本后,使用ctrl+c停止获取日志,并生成火焰图。脚本启动后,会在当前目录下生成三个文件。lf.log是函数运行前的堆栈。lf.svg是函数运行过程的火焰图。File3.为什么需要kprobe-lf3.1寻找高延迟的罪魁祸首kprobe-lf可以定位超时函数,并使其运行栈变成火焰图。比如我们遇到软中断延迟过长的问题,我们可以将函数设置为__do_softirq,设置延迟为1000us,定位分析超时softirqroot@cluster1-worker1:~/kprobe_lf#bashstart.sh-f__do_softirq-l1000FUNCTION:__do_softirq,LATENCY_TIME:1000us(>=1us)findkprobe_lf.koinsmodkprobe_lf.kosavelogtolf.log,ctrl+cstopgettimeout__do_softirqruntimeflamegraphandtimeout__do_softirqpre-runningstack如下runtime火焰图:预运行堆栈:__do_softirqcpu:2PID:0COMMAND:swapper/2LATENCY:5978us__do_softirq+0x1/0x2dcirq_exit+0xd5/0xe0smp_apic_timer_interrupt+0x74/0x130apic_timer_interrupt+0xf/0x20native_safe_halt+0xe/0x10default_idle+0x1c/0x140do_idle+0x1aa/0x250cpu_startup_entry+0x19/0x20start_secondary+0x162/0x1c0通过L6ATE我们可以知道延迟到L6ATE时是通过软中断从火焰图中,我们可以看到所有的高延迟软中断都在运行estimation_timer(IPVSBUG),可以快速定位罪魁祸首函数。3.2内核性能分析我们在分析内核性能的时候,有时候我们想分析修改一个参数对内核性能有什么影响,我们可以利用这个工具来分析相关函数取内核参数/proc/sys/net/ipv4/tcp_tw_reuse为例3.2.1默认设置tcp_tw_reuse=2使用curl发起高并发短连接,观察__sys_connect函数#模拟高并发root@cluster1-worker1:~#whiletrue;docurlxxxxxxx;done#运行工具root@cluster1-worker1:~/kprobe_lf#bashstart.sh-f__sys_connect-l100FUNCTION:__sys_connect,LATENCY_TIME:100us(>=1us)findkprobe_lf.koinsmodkprobe_lf.kosavelogtolf.log,ctrl+c停止运行时火焰图:运行前堆栈:__sys_connectcpu:6PID:26184COMMAND:curlLATENCY:1781us__sys_connect+0x1/0xf0__x64_sys_connect+0x16/0x20do_syscall_64+0x5b/0x1b0entry_SYSCALL_64_ax9...0x9/frame0h4通过运行前端堆栈可以看出__sys_connect的延迟是1.7ms。通过火焰图可以看出__sys_connect90%以上被__inet_hash_connect端口选择函数消耗掉了。情况#模拟高并发root@cluster1-worker1:~#whiletrue;docurlxxxxxxx;done#运行工具root@cluster1-worker1:~/kprobe_lf#bashstart.sh-f__sys_connect-l100FUNCTION:__sys_connect,LATENCY_TIME:100us(>=1us)findkprobe_lf.koinsmodkprobe_lf.kosavelogtolf.log,ctrl+c停止runtimeflamegraph:stackbeforerunning:__sys_connectcpu:26PID:10538COMMAND:curlLATENCY:101us__sys_connect+0x1/0xf0__x64_sys_connect+0x16/0x20do_syscall_64+0x5b/0x1b0entry_SYSCALL_64_after_hwframe+0x44/0xa9...通过运行前的栈可以看出__sys_connect延迟为0.1ms。从火焰图中可以看出__inet_hash_connect端口选择函数已经占了不到1%tcp_tw_re=1对端口选择的提升效果非常明显4.说明火焰图是基于https://github.com/brendangregg/FlameGraph这个工具的灵感来源于字节跳动团队的trace-irqoff工具