BCC – 用于 Linux 性能监控、网络等的动态跟踪工具
如果您是 Linux 用户或管理员,您可能听说过"BCC 工具"或"BPF 编译器集合"。BCC 是一套功能强大的动态跟踪工具,它提供了一种简单而有效的方法来监控系统性能、网络等。在本文中,我们将通过示例讨论 BCC 工具的定义、它们的优势以及如何使用它们。
什么是 BCC 工具?
BCC(BPF 编译器集合)是一套基于 Linux 内核中的 eBPF(扩展伯克利包过滤器)技术构建的动态跟踪工具。 eBPF 是一个运行在内核中的虚拟机,可以高效灵活地跟踪系统事件,无需修改内核或重新编译。
BCC 工具旨在提供简单易用的界面,方便用户使用 eBPF 跟踪和分析各种系统事件。它们使用 Python 和 C 语言编写,可用于执行各种任务,包括系统性能监控、网络分析、安全等等。
BCC 工具的优势
BCC 工具为 Linux 用户和管理员提供了许多优势。其中包括:-
低开销
BCC 工具旨在最大限度地减少对系统性能的影响。它们使用 eBPF 技术直接在内核内部跟踪事件,从而减少了上下文切换的需求以及与传统系统监控工具相关的其他开销。
灵活性
BCC 工具可用于各种任务,从监控系统性能到网络分析等等。它们高度灵活且可定制,使其成为 Linux 用户和管理员的强大工具。
用户友好的界面
BCC 工具提供了一个简单易用的界面,用于使用 eBPF 跟踪系统事件。它们易于使用,无需具备内核内部或编程方面的专业知识。
活跃的开发社区
BCC 工具由庞大的开发者社区积极开发和维护。这意味着新功能和改进会不断添加,错误也会得到快速解决。
如何使用 BCC 工具
BCC 工具可用于各种任务,包括系统性能监控、网络分析、安全等等。在本节中,我们将通过示例讨论如何使用一些最常用的 BCC 工具。
BPFtrace
BPFtrace 是一种用于 eBPF 的高级跟踪语言,旨在简化 eBPF 程序的编写和读取。它提供了一个简单易用的界面,用于跟踪系统事件和分析性能。
要使用 BPFtrace,您首先需要在您的系统上安装它。您可以使用您发行版的包管理器来执行此操作。例如,在 Ubuntu 上,您可以通过运行以下命令安装 BPFtrace -
sudo apt-get install bpftrace
安装 BPFtrace 后,您可以使用它编写 eBPF 程序并跟踪系统事件。例如,以下 BPFtrace 程序将在每次进程启动时打印一条消息 -
tracepoint:process:process_start
{
printf("process %s started
", args->comm);
}
您可以将此程序保存到文件(例如"process_start.bt"),并使用以下命令运行它 -
sudo bpftrace process_start.bt
运行此命令后,BPFtrace 将开始跟踪进程事件,并在每次进程启动时打印一条消息。
BCC 工具
BCC 工具为 Linux 系统提供了广泛的跟踪和监控功能。一些最常用的 BCC 工具包括 -
Execsnoop
execsnoop 工具用于跟踪系统上新进程的执行情况。它可用于监控哪些进程正在运行以及它们何时启动。要使用 execsnoop,只需运行以下命令:-
sudo execsnoop
这将开始跟踪进程执行事件,并在新进程启动时打印有关它们的信息。
Opensnoop
Opensnoop 工具跟踪文件系统事件,包括文件打开、关闭和读取。它可用于监控文件系统活动并追踪性能瓶颈。要使用 opensnoop,请运行以下命令:-
sudo opensnoop
这将开始跟踪文件系统事件,并在文件活动发生时打印有关它们的信息。
Tcptracer
Tcptracer 工具跟踪系统上的 TCP 连接,包括与远程主机及其关联端口的连接。它可用于监控网络活动并诊断网络相关问题。要使用 tcptracer,请运行以下命令 -
sudo tcptracer
这将开始跟踪 TCP 连接,并在发生连接事件时打印相关信息。
BCC 脚本示例
BCC 工具还可用于编写更复杂的脚本,以监控和分析系统性能。在本节中,我们将提供一些可用于监控 CPU 使用率、磁盘 I/O 和网络活动的 BCC 脚本示例。
CPU 使用率
以下 BCC 脚本可用于监控系统的 CPU 使用率 -
#!/usr/bin/python
from bcc import BPF
# 加载 BPF 程序
bpf_text = """
#include <uapi/linux/ptrace.h>
int count_sched(struct pt_regs *ctx) {
u64 ts = bpf_ktime_get_ns();
bpf_trace_printk("Hello, world! %d\
", ts);
return 0;
}
"""
# 初始化 BPF 程序
bpf = BPF(text=bpf_text)
# 将 BPF 程序附加到 sched_switch 跟踪点
bpf.attach_tracepoint(tp="sched:sched_switch", fn_name="count_sched")
# 打印跟踪消息
bpf.trace_print()
此脚本将在 CPU 调度程序每次切换系统任务时打印一条消息。
磁盘 I/O
以下 BCC 脚本可用于监控系统上的磁盘 I/O 活动 -
#!/usr/bin/python
from bcc import BPF
# 加载 BPF 程序
bpf_text = """
#include <uapi/linux/ptrace.h>
int count_disk_io(struct pt_regs *ctx, const char *rwflag) {
u64 ts = bpf_ktime_get_ns();
bpf_trace_printk("Disk I/O %s %d\
", rwflag, ts);
return 0;
}
"""
# 初始化 BPF 程序
bpf = BPF(text=bpf_text)
# 将 BPF 程序附加到 blk_account_io_done 跟踪点
bpf.attach_tracepoint(tp="block:block_rq_complete", fn_name="count_disk_io", ctx="R")
# 打印发生的跟踪消息
bpf.trace_print()
此脚本将在系统每次完成磁盘 I/O 操作时打印一条消息。
网络活动
以下 BCC 脚本可用于监控系统上的网络活动 -
#!/usr/bin/python
from bcc import BPF
# 加载 BPF 程序
bpf_text = """
#include <uapi/linux/ptrace.h>
int count_network(struct pt_regs *ctx, int protocol) {
u64 ts = bpf_ktime_get_ns();
bpf_trace_printk("Network %d %d\
", protocol, ts);
return 0;
}
"""
# 初始化 BPF 程序
bpf = BPF(text=bpf_text)
# 将 BPF 程序附加到 tcp_v{4,6}_connect 跟踪点
bpf.attach_tracepoint(tp="tcp_v4_connect", fn_name="count_network", ctx="R")
bpf.attach_tracepoint(tp="tcp_v6_connect", fn_name="count_network", ctx="R")
print trace messages as they occur
bpf.trace_print()
此脚本将在系统每次建立 TCP 连接时打印一条消息。
除了我们提供的示例之外,BCC 工具还有许多其他用例。例如,BCC 工具可用于监控系统调用、跟踪用户级事件以及诊断内核级问题。其他一些有用的 BCC 工具包括:-
csysdig - 一款提供图形界面的工具,用于使用 eBPF 分析系统活动。
funccount - 一款统计指定函数调用次数的工具。
tcpconnect - 一款跟踪系统 TCP 连接的工具。
biosnoop - 一款在 BIOS 级别跟踪块 I/O 操作的工具。
syncsnoop - 一款跟踪系统同步事件的工具。
BCC 工具还可以与其他系统监控工具(例如 prometheus、grafana 和 nagios)结合使用,以提供更全面的系统视图。性能。
值得注意的是,社区正在不断开发和改进 BCC 工具,因此会定期添加新的特性和功能。因此,保持 BCC 工具的更新以充分利用最新的改进至关重要。
结论
总而言之,BCC 工具提供了一套强大的动态跟踪工具,用于监控和分析 Linux 系统上的系统性能、网络等。它们界面友好、开销低、灵活性高,是 Linux 用户和管理员的必备工具。无论您是系统管理员、开发人员还是安全分析师,BCC 工具都可以帮助您深入了解系统,并快速有效地诊断性能问题。如果您还没有尝试过 BCC 工具,不妨尝试一下,看看它们如何为您和您的 Linux 系统带来益处。
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

