《4.bcc应用最佳实践.pdf》由会员分享,可在线阅读,更多相关《4.bcc应用最佳实践.pdf(26页珍藏版)》请在三个皮匠报告上搜索。
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对访问本地3260端口的TCP连接进行区
7、分,每个连接单独输出tcprtt信息。那么则可以清晰地看到每个连接的tcprtt延迟情况:如果部分连接的tcprtt异常,则可以尝试寻找规律,是不是在同一个TOR下(同一个S1交换机下);如果所有的tcprtt异常,则可以尝试分析一下本地的网络情况。killsnoopkillsnoop作用于kill syscall,用来追踪source PID向target PID发送Sig信号。用于发现进程被异常杀掉的问题。在实际使用中,服务器上通常具有128甚至更多的CPU数量,进程数量也异常多。为了避免log flood,增加killsnoop-T PID,用于过滤特定的target PID。只对我们关
8、心的某进程进行观测。例如killsnoop观察target服务的异常退出。02TLB Shootdown案例案例TLB Shootdown原理原理ProcessP中包含3个线程:TaskX、TaskY和TaskZ。CPU0、CPU1和CPU2使用同一个页表(PGD为PageP)。TaskX执行madvise(,MADV_DONTNEED)释放内存时,除释放内存页面外,还需要刷新TLB:使用invlpg指令清理TLB缓存项。使用IPI,清理CPU1和CPU2的TLB缓存项。频繁的TLB shootdwon严重影响性能!CPU0MMUTaskXCPU1MMUTaskYCPU2MMUTaskZMem
9、oryPagePfunccountirqtop命令可以观测到整机的TLB shootdown的频率,再进一步使用funccount判断TLB shootdown:/usr/share/bcc/tools/funccount-i 1 zap_page_range或者对特定的PID追踪:/usr/share/bcc/tools/funccount-i 1 zap_page_range-p PID再或者对特定的CPU追踪:/usr/share/bcc/tools/funccount-i 1 zap_page_range-c CPUtrace确认TLB shootdown问题后,进一步抓取madvis
10、e的用户态trace:/usr/share/bcc/tools/trace-U c:madvise-p PID-M 10PID TID COMM FUNC 20119 20123 jemalloc_bg_thd madvise b_GI_madvise+0 x0 libc-2.31.sotrace也支持dump内核态stack,同时使用-A参数对堆栈进行聚合,更好的分析热点函数。03火山引擎对火山引擎对bcc的社区贡献的社区贡献火山引擎对火山引擎对bcc的社区贡献的社区贡献贡献了tcprtt、virtiostat和kvmexit。增强了funccount、trace、tcpretrans、runqlen、runqslower等工具。修复了工具中的若干BUG。04bcc工具集成工具集成veLinux对对bcc更好的支持更好的支持veLinux 是字节跳动在操作系统技术上的长期积累和沉淀,旨在给客户提供稳定、高性能、安全、易用的云上操作系统,同时输出系统安装、部署、升级和补丁修复等全生命周期的完整解决方案。同时,在基础工具支持上,始终保持了大量的投入和开发。在veLinux上,支持最新的稳定版本bcc,体验bcc的新功能,提升debug效率。Thanks!