Linux下你不能不知道的bpftrace介绍

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 这表明__GI___libc_malloc函数花费了总计120.927毫秒的时间,并排名第一。其他函数按照它们的执行时间排序并显示前十项。

bpftrace是一种基于eBPF(Extended BPF)技术的高级动态跟踪工具,它可以在Linux内核中实现轻量级、低性能开销的系统和应用程序监控和分析。bpftrace使用简单易懂的声明式语言进行脚本编写,可以快速创建和运行非常复杂的跟踪脚本,以便捕获并分析各种有关进程、文件系统、网络、内存、CPU等方面的事件和统计信息。


简要概括:Bpftrace 是一个动态的、可编程的跟踪工具,可以用来监控 Linux 系统的各种活动。


bpftrace可以解决许多传统动态跟踪工具的局限性,比如DTrace。它不需要修改内核或重新编译二进制文件。同时,bpftrace提供了灵活的API和库,可以与其他工具和框架集成,例如Prometheus、Grafana、bcc等。bpftrace还拥有丰富的文档和社区支持,并得到了广泛的应用和推广。


如何使用

bpftrace是一种高级动态跟踪工具,可以通过捕获和分析系统和应用程序的事件,提供有关性能、行为和问题的深入洞察。bpftrace基于eBPF技术实现轻量级、低性能开销的监控和分析,使用简单易懂的声明式语言进行脚本编写,可以快速创建和运行复杂的跟踪脚本。bpftrace不需要修改内核或重新编译二进制文件,提供了灵活的API和库,可以与其他工具和框架集成,例如Prometheus、Grafana、bcc等。


要使用bpftrace进行动态跟踪和分析,可以按照以下步骤进行:


安装bpftrace:根据系统版本和发行版,使用适当的方法安装bpftrace。例如,在Ubuntu或Debian上,可以运行sudo apt install bpftrace命令安装。


编写bpftrace脚本:bpftrace使用声明式语言进行脚本编写,可以通过捕获和过滤事件来收集关于应用程序、系统调用、网络流量等方面的信息。脚本中可以包含多个规则,每个规则指定一个事件类型和其处理程序。例如,一个简单的脚本可以捕获所有进程的创建事件,并输出它们的PID和名字:


tracepoint:process:process_create
{
printf(“New process created: %d %s\n”, args->pid, args->comm);
}


运行bpftrace脚本:在终端中输入类似于bpftrace -e 'tracepoint:process:process_create{ printf(“New process created: %d %s\n”, args->pid, args->comm); }'的命令即可运行一个简单的脚本。除此之外,还可以通过文件或管道输入方式运行脚本。


观察输出结果:当脚本开始运行时,它将开始捕获与规则匹配的事件,并在终端中显示输出结果。输出结果可以帮助用户理解应用程序或系统的行为,识别性能瓶颈以及调试问题。


除了上述的基本步骤外,bpftrace还提供了许多高级功能和选项,例如使用内置函数、变量和标准库进行统计分析、聚合和过滤等。用户可以参考bpftrace官方文档和示例,深入了解其功能和用法,并结合实际场景设计和运行更复杂的跟踪脚本。


bpftrace具有许多高级功能,使其成为一种强大的系统和应用程序动态跟踪工具。以下是其中一些功能:


内置函数:bpftrace提供了许多内置函数,用于执行各种操作,例如计算、字符串处理、时间戳生成等。这些函数可用于编写更复杂的跟踪脚本。


变量:bpftrace支持定义变量,可以在脚本中使用来存储临时或持久的数据。变量还可以用于实现聚合和统计分析。


聚合:bpftrace具有灵活的聚合功能,可以对事件和指标进行统计分析,例如计数、平均值、最小/最大值等。聚合可用于监测性能和确定瓶颈。


过滤:bpftrace支持过滤规则,以便只捕获特定类型的事件。过滤规则可以帮助用户关注感兴趣的内容,减少不必要的输出。


输出格式:bpftrace支持多种输出格式,例如文本、JSON、CSV等,可根据需要进行选择。输出格式可以方便地与其他工具进行集成和分析。


动态追踪:bpftrace支持动态追踪,可以在应用程序或系统运行时动态添加和删除跟踪规则。这使得用户可以快速响应变化的需求,并进行实时监测和分析。


其他特性:bpftrace还支持在用户空间和内核空间之间传递数据、访问网络协议栈、使用probe探针等。这些功能扩展了bpftrace的应用场景,使其更具灵活性和可定制性。


下面是一些 Bpftrace 的使用示例代码:


统计系统调用的次数:

$ sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'


这个命令将会追踪所有系统调用,并且在每次调用时记录计数器。


监控进程的 CPU 使用率:

$ sudo bpftrace -e 'profile:hz:99 { @[pid,execname] = count(); }'
1

这个命令将会每秒钟捕获 99 次时钟中断事件,并记录每个进程的执行名称和 PID。


监控网络流量:

$ sudo bpftrace -e 'kprobe:tcp_sendmsg { printf("%d\n", arg5); }'


这个命令将会在 tcp_sendmsg 函数被调用时打印发送数据包的大小。


监控文件访问:

$ sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }'


这个命令将会在每次文件被打开时打印进程名称和文件名。


以上仅是 Bpftrace 的一些简单用法,实际上它还有很多强大的功能,可以帮助监控甚至调试系统的各个方面。


以下是一 示例bpftrace脚本,它捕获每个进程的系统调用并输出其名称和持续时间:


#!/usr/bin/env bpftrace
BEGIN {
    printf("Tracing syscalls... Hit Ctrl-C to end.\n");
}
syscall:entry {
    start[@syscall] = nsecs;
}
syscall:return/ start[@syscall] / {
    printf("%s took %d ns\n", probe, nsecs - start[@syscall]);
}


该脚本首先在BEGIN块中打印一条消息,然后使用两个规则捕获系统调用的进入和返回事件。在进入事件中,它记录当前时间戳,并将其存储在名为start的关联数组中,该数组的键是正在进行的系统调用的名称。在返回事件中,它检查关联数组是否存在与当前事件匹配的键,并计算事件的持续时间(以纳秒为单位)。最后,它使用printf函数输出调用名称和持续时间。


要运行这个脚本,请按照以下步骤进行:


将脚本保存到一个文本文件中(例如,myscript.bt)。


在终端中运行命令:sudo bpftrace myscript.bt。


当前窗口将开始显示捕获的事件和相应的输出结果。


请注意,您需要具有管理员权限才能运行bpftrace脚本。如果你遇到问题,可以参考bpftrace官方文档和示例,并查看输出结果和错误消息以进行调试。


示例脚本其二


bpftrace是一种基于eBPF(Extended BPF)技术的高级动态跟踪工具,它可以在Linux内核中实现轻量级、低性能开销的系统和应用程序监控和分析。bpftrace使用简单易懂的声明式语言进行脚本编写,可以快速创建和运行非常复杂的跟踪脚本,以便捕获并分析各种有关进程、文件系统、网络、内存、CPU等方面的事件和统计信息。


简要概括:Bpftrace 是一个动态的、可编程的跟踪工具,可以用来监控 Linux 系统的各种活动。


bpftrace可以解决许多传统动态跟踪工具的局限性,比如DTrace。它不需要修改内核或重新编译二进制文件。同时,bpftrace提供了灵活的API和库,可以与其他工具和框架集成,例如Prometheus、Grafana、bcc等。bpftrace还拥有丰富的文档和社区支持,并得到了广泛的应用和推广。


如何使用

bpftrace是一种高级动态跟踪工具,可以通过捕获和分析系统和应用程序的事件,提供有关性能、行为和问题的深入洞察。bpftrace基于eBPF技术实现轻量级、低性能开销的监控和分析,使用简单易懂的声明式语言进行脚本编写,可以快速创建和运行复杂的跟踪脚本。bpftrace不需要修改内核或重新编译二进制文件,提供了灵活的API和库,可以与其他工具和框架集成,例如Prometheus、Grafana、bcc等。


要使用bpftrace进行动态跟踪和分析,可以按照以下步骤进行:


安装bpftrace:根据系统版本和发行版,使用适当的方法安装bpftrace。例如,在Ubuntu或Debian上,可以运行sudo apt install bpftrace命令安装。


编写bpftrace脚本:bpftrace使用声明式语言进行脚本编写,可以通过捕获和过滤事件来收集关于应用程序、系统调用、网络流量等方面的信息。脚本中可以包含多个规则,每个规则指定一个事件类型和其处理程序。例如,一个简单的脚本可以捕获所有进程的创建事件,并输出它们的PID和名字:


tracepoint:process:process_create
{
printf(“New process created: %d %s\n”, args->pid, args->comm);
}


运行bpftrace脚本:在终端中输入类似于bpftrace -e 'tracepoint:process:process_create{ printf(“New process created: %d %s\n”, args->pid, args->comm); }'的命令即可运行一个简单的脚本。除此之外,还可以通过文件或管道输入方式运行脚本。


观察输出结果:当脚本开始运行时,它将开始捕获与规则匹配的事件,并在终端中显示输出结果。输出结果可以帮助用户理解应用程序或系统的行为,识别性能瓶颈以及调试问题。


除了上述的基本步骤外,bpftrace还提供了许多高级功能和选项,例如使用内置函数、变量和标准库进行统计分析、聚合和过滤等。用户可以参考bpftrace官方文档和示例,深入了解其功能和用法,并结合实际场景设计和运行更复杂的跟踪脚本。


bpftrace具有许多高级功能,使其成为一种强大的系统和应用程序动态跟踪工具。以下是其中一些功能:


内置函数:bpftrace提供了许多内置函数,用于执行各种操作,例如计算、字符串处理、时间戳生成等。这些函数可用于编写更复杂的跟踪脚本。


变量:bpftrace支持定义变量,可以在脚本中使用来存储临时或持久的数据。变量还可以用于实现聚合和统计分析。


聚合:bpftrace具有灵活的聚合功能,可以对事件和指标进行统计分析,例如计数、平均值、最小/最大值等。聚合可用于监测性能和确定瓶颈。


过滤:bpftrace支持过滤规则,以便只捕获特定类型的事件。过滤规则可以帮助用户关注感兴趣的内容,减少不必要的输出。


输出格式:bpftrace支持多种输出格式,例如文本、JSON、CSV等,可根据需要进行选择。输出格式可以方便地与其他工具进行集成和分析。


动态追踪:bpftrace支持动态追踪,可以在应用程序或系统运行时动态添加和删除跟踪规则。这使得用户可以快速响应变化的需求,并进行实时监测和分析。


其他特性:bpftrace还支持在用户空间和内核空间之间传递数据、访问网络协议栈、使用probe探针等。这些功能扩展了bpftrace的应用场景,使其更具灵活性和可定制性。


下面是一些 Bpftrace 的使用示例代码:


统计系统调用的次数:

$ sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'


这个命令将会追踪所有系统调用,并且在每次调用时记录计数器。


监控进程的 CPU 使用率:

$ sudo bpftrace -e 'profile:hz:99 { @[pid,execname] = count(); }'
1

这个命令将会每秒钟捕获 99 次时钟中断事件,并记录每个进程的执行名称和 PID。


监控网络流量:

$ sudo bpftrace -e 'kprobe:tcp_sendmsg { printf("%d\n", arg5); }'


这个命令将会在 tcp_sendmsg 函数被调用时打印发送数据包的大小。


监控文件访问:

$ sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }'


这个命令将会在每次文件被打开时打印进程名称和文件名。


以上仅是 Bpftrace 的一些简单用法,实际上它还有很多强大的功能,可以帮助监控甚至调试系统的各个方面。


以下是一 示例bpftrace脚本,它捕获每个进程的系统调用并输出其名称和持续时间:


#!/usr/bin/env bpftrace
BEGIN {
    printf("Tracing syscalls... Hit Ctrl-C to end.\n");
}
syscall:entry {
    start[@syscall] = nsecs;
}
syscall:return/ start[@syscall] / {
    printf("%s took %d ns\n", probe, nsecs - start[@syscall]);
}


该脚本首先在BEGIN块中打印一条消息,然后使用两个规则捕获系统调用的进入和返回事件。在进入事件中,它记录当前时间戳,并将其存储在名为start的关联数组中,该数组的键是正在进行的系统调用的名称。在返回事件中,它检查关联数组是否存在与当前事件匹配的键,并计算事件的持续时间(以纳秒为单位)。最后,它使用printf函数输出调用名称和持续时间。


要运行这个脚本,请按照以下步骤进行:


将脚本保存到一个文本文件中(例如,myscript.bt)。


在终端中运行命令:sudo bpftrace myscript.bt。


当前窗口将开始显示捕获的事件和相应的输出结果。


请注意,您需要具有管理员权限才能运行bpftrace脚本。如果你遇到问题,可以参考bpftrace官方文档和示例,并查看输出结果和错误消息以进行调试。


示例脚本其二


以下是一个bpftrace脚本的示例,它将跟踪所有进程中每个函数的执行时间,并显示最长时间前十名的函数:


#!/usr/bin/env bpftrace
/* Trace every function and measure its time spent. */
profile:hz:99
{
  @start[tid,func] = nsecs;
}
profile:hz:99 /@start[tid,probe] != 0/
{
  @times[probefunc] = sum(nsecs - @start[tid,probefunc]);
  @start[tid,probefunc] = 0;
}
/* Print the top functions by total execution time. */
END
{
  printf("Top 10 functions by total execution time:\n");
  print(@times);
}



这个脚本首先在99赫兹下以profiling模式运行。当每个函数开始执行时,它会记录它的tid和函数名称,以及当前的纳秒数作为键值对存储在@start数组中。


然后,在相同的99赫兹下,每当一个函数完成时,该脚本会计算从开始到结束所花费的时间,并将其添加到@times数组中对应函数的值中。同时,@start数组中与此函数调用相对应的键值对将被删除。


最后,当脚本结束时,它会打印出前十个总执行时间最长的函数。


要执行此脚本,请保存脚本内容到文件 function_time.bt 中,然后运行以下命令:


sudo bpftrace function_time.bt


这将输出类似以下内容的结果:


Attaching 1 probe...
Top 10 functions by total execution time:
            __GI___libc_malloc: 120.927 ms
                          mmap: 43.838 ms
                __xstat64_chk: 38.737 ms
                   pthread_create: 31.730 ms
             __GI___pthread_mutex_lock: 25.752 ms
             __GI___pthread_mutex_unlock: 23.045 ms
                      open64: 19.994 ms
                       ioctl: 14.066 ms
                       read: 12.832 ms
                 __cxa_atexit: 12.789 ms


这表明__GI___libc_malloc函数花费了总计120.927毫秒的时间,并排名第一。其他函数按照它们的执行时间排序并显示前十项。


服务器高级架构体系:https://xxetb.xet.tech/s/4DEnTI


#!/usr/bin/env bpftrace
/* Trace every function and measure its time spent. */
profile:hz:99
{
  @start[tid,func] = nsecs;
}
profile:hz:99 /@start[tid,probe] != 0/
{
  @times[probefunc] = sum(nsecs - @start[tid,probefunc]);
  @start[tid,probefunc] = 0;
}
/* Print the top functions by total execution time. */
END
{
  printf("Top 10 functions by total execution time:\n");
  print(@times);
}



这个脚本首先在99赫兹下以profiling模式运行。当每个函数开始执行时,它会记录它的tid和函数名称,以及当前的纳秒数作为键值对存储在@start数组中。


然后,在相同的99赫兹下,每当一个函数完成时,该脚本会计算从开始到结束所花费的时间,并将其添加到@times数组中对应函数的值中。同时,@start数组中与此函数调用相对应的键值对将被删除。


最后,当脚本结束时,它会打印出前十个总执行时间最长的函数。


要执行此脚本,请保存脚本内容到文件 function_time.bt 中,然后运行以下命令:


sudo bpftrace function_time.bt


这将输出类似以下内容的结果:


Attaching 1 probe...
Top 10 functions by total execution time:
            __GI___libc_malloc: 120.927 ms
                          mmap: 43.838 ms
                __xstat64_chk: 38.737 ms
                   pthread_create: 31.730 ms
             __GI___pthread_mutex_lock: 25.752 ms
             __GI___pthread_mutex_unlock: 23.045 ms
                      open64: 19.994 ms
                       ioctl: 14.066 ms
                       read: 12.832 ms
                 __cxa_atexit: 12.789 ms


这表明__GI___libc_malloc函数花费了总计120.927毫秒的时间,并排名第一。其他函数按照它们的执行时间排序并显示前十项。


服务器高级架构体系:https://xxetb.xet.tech/s/4DEnTI

相关实践学习
通过可观测可视化Grafana版进行数据可视化展示与分析
使用可观测可视化Grafana版进行数据可视化展示与分析。
目录
相关文章
|
5月前
|
存储 Prometheus 监控
Linux技术工具:bpftrace介绍
Linux技术工具:bpftrace介绍
163 7
|
3天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
18 3
|
3天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
16 2
|
11天前
|
缓存 监控 Linux
|
14天前
|
Linux Shell 数据安全/隐私保护
|
15天前
|
域名解析 网络协议 安全
|
21天前
|
运维 监控 网络协议
|
22天前
|
监控 Linux Shell
|
3天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
18 3
|
6天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
30 6