1、WWW.VOLCENGINE.COMCopyright 2022 北京火山引擎科技有限公司 All rights reserved.2022/10 首届中国eBPF大会bcc应用最佳实践应用最佳实践皮振伟皮振伟CONTENTS目录目录Copyright 2022 北京火山引擎科技有限公司 All rights reserved.PART 01虚拟化虚拟化IO案例案例PART 02TLB Shootdown案例案例PART 03bcc的社区贡献的社区贡献PART 04bcc工具集成工具集成01虚拟化虚拟化IO案例案例典型的虚拟化典型的虚拟化IO路径路径virt queuevirtio blkbl
2、k layerKernelUservirt queuedata planelibiscsiQEMUTCPKernelNICTCPKernelNICVFIONVMeSPDKswitchuser processesIO slow?diagnosis in guestvirt queuevirtio blkblk layerKernelUseruser processessyscount-p PID-L-i 1biolatency-D-e 1iostat-x 1/dev/vdbvirtiostat 1lsblk-virtioirqtop-d 1syscountsyscount作用于TRACEPOIN
3、T_PROBE(raw_syscalls,sys_enter),用于分析目标进程的系统调用的频率和延迟,界定问题来自于用户态、内核态。对于Direct IO,pread/pwrite的延迟则直接反映IO延迟。iostatiostat命令用于分析磁盘设备的IO概况,其中util不再准确,但是能反映一部分问题。biolatencybiolatency基于Linux block layer,作用于内核函数blk_account_io_start&blk_account_io_done,用于统计每一个IO的发起、完成时间,精确统计每个IO请求的延迟,并查看延迟直方图。lsblk&virtiostat&
4、irqtoplsblk-virtio展示队列数;virtiostat命令查看virtio设备的多队列是否数据均匀;irqtop展示中断是否均匀。diagnosis in host initiatorvirt queuedata planelibiscsiQEMUTCPKernelNICatoprunqslower-Ptcprtt-p LPORT-a LADDRtcpretransnetqtop-i 1-n eth0atop在atop主面板上按y键,观察iothread的RDELAY,用于判断IO线程是否出现了CPU抢占。在有些场景下,per thread的RDELAY非常必要,例如:一个进程有
5、40个threads,平均RDELAY是1%似乎问题不明显。但是如果所有的RDELAY时间来自于一个thread,就会出现较严重的问题。runqslower通过runqslower-P,可以分析出来IO线程的精确的调度延迟,以及同一个CPU上运行的上一个任务,大概率可以抓取到是哪个进程影响的。tcprtt&tcpretrans使用tcprtt判断网络延迟,如果tcprtt稳定且较低,那么可以排除网络因素;如果网络延迟较高,或者存在延迟突刺,那么IO延迟也会受到响应的影响。接下来则可以使用tcpretrans查看TCP重传情况。特别需要注意的是,tcprtt不等同于ping延迟,因为有ECMP的
6、缘故。netqtop&irqtop使用irqtop-softirq分析网络RX,以及网卡的中断情况。分析是否存在热点、硬件中断、softirq是否均匀等。使用netqtop可以观察网卡队列的流量情况。diagnosis in targetTCPKernelNICVFIONVMeSPDKtcprtt-p PORT-byraddr-i 1netqtop-i 1-n eth0tcprtttcprtt-p PORT-byraddr-i 1通常使用在server/target端。例如iSCSI场景下,在target端执行:tcprtt-p 3260-byraddr