调试工具
在软件开发过程中,我们不可避免地会遇到各种性能问题、系统故障或其他预料之外的挑战。要有效地诊断和解决这些问题,选用合适的工具是关键。下面介绍3个出色的Linux性能分析和调试工具的世界:strace、Perf以及eBPF。
strace
strace是一个强大的Linux命令行工具,可以用于跟踪系统调用(System Calls)和信号(Signals)。它主要用于调试、诊断、分析程序执行时的行为。
使用strace可以做到以下几点:
- 诊断程序错误:通过分析程序与操作系统之间的交互,可以帮助找到错误和异常的原因。
- 性能分析:通过查看系统调用的时间、数量和类型,可以识别潜在的性能瓶颈。
- 安全分析:检查程序是否进行恶意行为,如不当访问文件、套接字等。
- 学习和理解:通过观察系统调用,可以加深对Linux操作系统、库函数和系统调用之间关系的理解。
- 调试:在没有源代码的情况下,可以通过查看系统调用的顺序和参数来了解程序的执行流程。
常用功能
strace的常用功能有以下4个:
- 定位配置文件:如果需要更改程序的配置文件,但不知道该文件的位置,strace可以帮助我们。虽然可能有多种方法来指示从哪里读取配置文件,但是实际上只有一个系统调用会真正打开它。
strace -f -e trace=open <program>
- 诊断性能问题:通过使用strace来运行程序,可以查看它执行了哪些系统调用。使用-t选项还可以显示每个系统调用的执行时间。
- 确定文件依赖:如果程序无法运行,那么可能是因为缺少某个库或库版本不匹配。strace可以帮助我们识别这些依赖。
- 解决权限问题:strace也可以用于确定是否因为权限问题而无法访问某个文件。
strace -f -e trace=write <program>
strace的常用附加选项如下:
-o :将输出重定向到一个文件,例如strace-out.txt。
strace -f -o strace-out.txt -e trace=execve <program>
Perf
Perf(Performance Counters for Linux,性能计数器子系统)是一个Linux性能分析工具,用于分析系统和应用程序的运行时性能。Perf可以帮助开发人员和系统管理员了解CPU性能计数器、内核跟踪点和硬件事件等信息,从而找到性能瓶颈,优化软件性能并诊断问题。
Perf工具通过Linux内核中的perf_event子系统收集性能数据,该子系统提供了一个统一的框架来访问CPU性能计数器和其他硬件事件。这些事件包括:
- CPU周期。
- 指令计数。
- 缓存命中或缓存未命中。
- 分支预测错误。
- 内存访问等。
Perf提供了多种子命令来收集、分析和报告性能数据。以下是一些常用的Perf子命令:
(1) perf stat:提供高级统计信息,如CPU周期、指令计数等。
(2) perf record:记录事件样本以供进一步分析。
(3) perf report:分析记录的事件样本并生成报告。
(4) perf list:列出可用的事件和跟踪点。
(5) perf top:实时显示系统中最耗费CPU的函数。
eBPF
eBPF(Extended Berkeley Packet Filter,扩展的伯克利包过滤器)是一种内核技术,它为Linux内核提供了一种高度可定制、可编程的沙箱执行环境。它主要被用于安全、网络和性能监控等领域。
eBPF程序可以在内核中执行,对内核对象和数据结构进行访问,然后根据运行结果修改eBPF程序在内核空间的执行。它们具有较低的性能开销,相较于传统的用户空间解决方案,其性能更为优越。
eBPF程序以事件驱动的方式运行,在遇到内核或应用程序内的特定hook时执行代码。这些hook可以是各种各样的事件,例如系统调用、函数的进入或退出、内核跟踪点、网络事件等。如果预定义的hook无法满足特定需求,可以创建内核探针(kprobe)或用户探针(uprobe),以便在内核或用户应用程序的几乎任何位置附加eBPF程序。eBPF hook概览如图所示。