编辑
2025-01-20
工作知识
0
请注意,本文编写于 137 天前,最后修改于 137 天前,其中某些信息可能已经过时。

目录

一、BCC工具简述
二、搭建环境
2.2 bcc工具包
三、示例
3.1 opensnoop-bpfcc
3.2 exitsnoop-bpfcc
3.3 deadlock-bpfcc
3.4 memleak-bpfcc
3.5 bashreadline-bpfcc
3.6 cachestat-bpfcc
3.7 cpudist-bpfcc
3.8 dcsnoop-bpfcc
3.9 filelife-bpfcc
3.10 llcstat-bpfcc
四、总结

我们在了解内核可观测的eBPF之前,我们需要了解一个最早期的工具BPF,对于BPF,有一个仓库是BCC其全称BPF Compiler Collection,其意思就说其汇总了BPF的各种调试工具。

一、BCC工具简述

我们知道bcc是一系列bpf工具的合集,它非常方便我们对操作系统进行性能定位,其主线仓库地址如下:

https://github.com/iovisor/bcc

其主要包含工具在如下图所示:

image.png 对于这个图,大家第一次看到不需要惊慌,我简单给大家解析一下就方便大家看懂。

图中带颜色的框图是linux系统的主要功能模块 图中带箭头的,如果指向框图的,那么对应一个工具,用于这个模块的调测 这里主要包含两点:

如果框图的模块不熟悉,那属于对操作系统不熟悉,建议可以先巩固操作系统概念,或者过一段时间懂了再来看 如果箭头的字不熟悉,完全没关系,一个一个试着敲就清晰了。 本文针对这个图,截取一下我个人觉得需要的工具演示一下。

二、搭建环境

我们知道bcc工具集要使用,需要两个内容:

内核头文件 bcc工具包 2.1 内核头文件 对于一个内核,我们提取头文件方式其他文章有提到,如:16-内核头文件

对于此,我们只需要如下操作即可:

mkdir /usr/lib/modules/$(uname -r) && cd /usr/lib/modules/$(uname -r) tar xvzf ~/kernel-header.tar.gz -C /usr/lib/modules/$(uname -r) mv kernel-header build

当然如果是标准头文件,直接安装即可。这里就无需介绍

2.2 bcc工具包

对于bcc工具包,直接安装对应包即可

apt instll bpfcc-tools

三、示例

3.1 opensnoop-bpfcc

监听系统的openat事件,如下:

# opensnoop-bpfcc PID COMM FD ERR PATH 309 systemd-journal 47 0 /proc/400/comm 309 systemd-journal 47 0 /proc/400/cmdline 309 systemd-journal 47 0 /proc/400/status

3.2 exitsnoop-bpfcc

监听系统的exit事件

# exitsnoop-bpfcc PCOMM PID PPID TID AGE(s) EXIT_CODE preload 5586 640 5586 0.00 0

3.3 deadlock-bpfcc

监听死锁问题

# deadlock-bpfcc $(pidof kylin-nm) --binary /usr/lib/aarch64-linux-gnu/libpthread.so.0 Tracing... Hit Ctrl-C to end.

3.4 memleak-bpfcc

监听内存申请

# memleak-bpfcc -p $(pidof kylin-nm) Attaching to pid 2444, Ctrl+C to quit. [14:48:56] Top 10 stacks with outstanding allocations: 8 bytes in 1 allocations from stack dbus_malloc+0x28 [libdbus-1.so.3.19.11] [unknown] [libdbus-1.so.3.19.11] dbus_message_copy+0xe0 [libdbus-1.so.3.19.11] [unknown] [libQt5DBus.so.5.12.8] [unknown] [libQt5DBus.so.5.12.8] [unknown] [libQt5DBus.so.5.12.8] [unknown] [libQt5DBus.so.5.12.8] [unknown] [libQt5DBus.so.5.12.8] [unknown] [libQt5DBus.so.5.12.8] QObject::event(QEvent*)+0x200 [libQt5Core.so.5.12.8] QCoreApplication::notifyInternal2(QObject*, QEvent*)+0x154 [libQt5Core.so.5.12.8] QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*)+0x168 [libQt5Core.so.5.12.8] [unknown] [libQt5Core.so.5.12.8] g_main_context_dispatch+0x274 [libglib-2.0.so.0.6400.6] [unknown] [libglib-2.0.so.0.6400.6] g_main_context_iteration+0x34 [libglib-2.0.so.0.6400.6] QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)+0x54 [libQt5Core.so.5.12.8] QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)+0xf8 [libQt5Core.so.5.12.8]

3.5 bashreadline-bpfcc

监听别人bash在敲什么东西

# /usr/sbin/bashreadline-bpfcc TIME PID COMMAND 14:56:38 3372 bash 14:56:40 22469 history 14:56:51 22469 dmesg

3.6 cachestat-bpfcc

查看系统中cache 命中,miss以及buffer和cache大小

# cachestat-bpfcc HITS MISSES DIRTIES HITRATIO BUFFERS_MB CACHED_MB 3 0 0 100.00% 48 849 1 0 0 100.00% 48 849 3 0 0 100.00% 48 849 4070 0 10 100.00% 48 849 2867 0 84 100.00% 48 849

3.7 cpudist-bpfcc

统计cpu上执行时长的分布情况。

# cpudist-bpfcc Tracing on-CPU time... Hit Ctrl-C to end. usecs : count distribution 0 -> 1 : 140 |***** | 2 -> 3 : 113 |**** | 4 -> 7 : 229 |******** | 8 -> 15 : 619 |*********************** | 16 -> 31 : 1009 |************************************** | 32 -> 63 : 1051 |****************************************| 64 -> 127 : 441 |**************** | 128 -> 255 : 351 |************* | 256 -> 511 : 257 |********* | 512 -> 1023 : 459 |***************** | 1024 -> 2047 : 294 |*********** | 2048 -> 4095 : 284 |********** | 4096 -> 8191 : 379 |************** | 8192 -> 16383 : 363 |************* | 16384 -> 32767 : 278 |********** |

3.8 dcsnoop-bpfcc

查看dcache的访问情况,打印进程访问dcache的内容

# /usr/sbin/dcsnoop-bpfcc TIME(s) PID COMM T FILE 1.763159 311 systemd-journal M display 1.763206 311 systemd-journal M display 1.763218 311 systemd-journal M log-extra-fields:dbus.service 3.762189 311 systemd-journal M display 3.762222 311 systemd-journal M display 3.762432 311 systemd-journal M log-extra-fields:dbus.service 4.759580 416 NetworkManager M timestamps.ILLFY2

3.9 filelife-bpfcc

统计系统内文件打开后,读和写的次数和文件内容,如下

15:59:07 loadavg: 0.06 0.08 0.09 1/656 17653 TID COMM READS WRITES R_Kb W_Kb T FILE 17653 clear 2 0 60 0 R xterm 17346 filetop-bpfcc 2 0 15 0 R loadavg 17653 clear 2 0 0 0 R libmali.so.1.9.0 17653 clear 1 0 0 0 R libXau.so.6.0.0 17653 clear 1 0 0 0 R libX11.so.6.3.0 17653 clear 1 0 0 0 R libgcc_s.so.1 17653 clear 1 0 0 0 R libEGL.so.1 17653 clear 1 0 0 0 R libgbm.so.1 17653 clear 1 0 0 0 R libstdc++.so.6.0.28 17653 clear 1 0 0 0 R libGLESv2.so.2

3.10 llcstat-bpfcc

查看进程的缓存命中率

~# llcstat-bpfcc Running for 10 seconds or hit Ctrl-C to end. ^CPID NAME CPU REFERENCE MISS HIT% 415 dbus-daemon 1 20700 9400 54.59% 720 kworker/0:4H 0 19600 9800 50.00% 2351 QThread 2 75300 2700 96.41% 38823 sh 7 33500 12600 62.39% 14 rcuos/0 3 60500 1600 97.36% 53 rcuos/6 0 22700 300 98.68% 2384 QThread 0 39100 2300 94.12% 2822 QThread 3 72400 2900 95.99% 2487 ukui-tablet-des 2 92600 7500 91.90%

四、总结

可以发现bcc收录了很多有用的trace工具,这些工具基于BPF,希望能对大家有帮助