用于 Linux ftrace 和 perf_events(又名“perf”命令)的正在开发且不受支持的性能分析工具的各种集合。 ftrace 和 perf 都是核心 Linux 跟踪工具,包含在内核源代码中。您的系统可能已经有 ftrace,而 perf 通常只是一个包添加(请参阅先决条件)。
这些工具旨在易于安装(最少的依赖项)、提供高级性能可观察性并且易于使用:做一件事并做好它。该集合由 Brendan Gregg(DTraceToolkit 的作者)创建。
其中许多工具都采用了变通方法,以便在现有的 Linux 内核上实现功能。因此,许多工具都有警告(请参阅手册页),并且在添加未来的内核功能或新的跟踪子系统之前,它们的实现应被视为占位符。
这些适用于 Linux 3.2 和更新的内核。对于 Linux 2.6.x,请参阅警告。
这些工具在 USENIX LISA 2014 演示中介绍:Linux 性能分析:新工具和旧秘密
使用 ftrace:
使用 perf_events:
使用 eBPF:
显示新流程和参数:
# ./execsnoop 跟踪 exec()。 Ctrl-C 结束。 PID PPID 参数 22898 22004 男人 ls 22905 22898 预转换 -e UTF-8 22908 22898 寻呼机 -s 22907 22898 nroff-mandoc-rLL=164n-rLT=164n-Tutf8 22906 22898 桌 22911 22910 区域设置魅力图 22912 22907 groff -mtty-char -Tutf8 -mandoc -rLL=164n -rLT=164n 22913 22912 troff -mtty-char -mandoc -rLL=164n -rLT=164n -Tutf8 22914 22912 糟糕
测量从队列插入到完成的块设备 I/O 延迟:
# ./iolatency -Q 跟踪块 I/O。每1秒输出一次。 Ctrl-C 结束。 >=(ms) .. <(ms) :I/O |分配| 0 -> 1 : 1913 |##########################################| 1 -> 2 : 438 |########## | 2 -> 4 : 100 |## | 4 -> 8 : 145 |### | 8 -> 16 : 43 |# | 16 -> 32 : 43 |# | 32 -> 64 : 1 |# | [...]
跟踪 block:block_rq_insert 跟踪点,使用内核堆栈跟踪,并且仅用于读取:
# ./tpoint -s block:block_rq_insert 'rwbs ~ "*R*"' cksum-11908 [000] d...7269839.919098:block_rq_insert:202,1 R 0()736560 + 136 [cksum] cksum-11908 [000] d...7269839.919107: => __elv_add_request => blk_flush_plug_list => blk_finish_plug => __do_page_cache_readahead => ondemand_readahead => page_cache_async_readahead => generic_file_read_iter => new_sync_read => vfs_read => SyS_read => 系统调用快速路径 [...]
统计以“bio_”开头的内核函数调用次数,每秒汇总:
# ./funccount -i 1 'bio_*' 跟踪“bio_*”... Ctrl-C 结束。 功能计数 bio_attempt_back_merge 26 Bio_get_nr_vecs 361 生物分配 536 Bio_alloc_bioset 536 生物_endio 536 生物免费536 Bio_fs_析构函数 536 生物初始化536 第536章 536 生物放置 729 生物添加页 1004 [...]
示例目录中还有更多示例。另请参阅手册页。
意图尽可能少。例如,没有 debuginfo 的 Linux 3.2 服务器。有关详细信息,请参阅工具手册页。
FTRACE 在内核中配置。您可能已经在您的内核版本中配置了此配置并可用,因为 FTRACE 是在 2.6.27 中首次添加的。这需要 CONFIG_FTRACE 和其他 FTRACE 选项,具体取决于工具。某些工具(例如 funccount)需要 CONFIG_FUNCTION_PROFILER。
需要安装“perf”命令。它位于 linux-tools-common 包中。安装后,perf 可能会告诉您安装额外的 linux-tools 软件包 (linux-tools- kernel_version )。 perf 也可以在内核源代码中的tools/perf 下构建。有关让 perf_events 充分发挥作用的更多详细信息,请参阅 perf_events 先决条件。
需要启用 CONFIG_DEBUG_FS 选项的内核。与 FTRACE 一样,这可能已经启用(debugfs 已在 2.6.10-rc3 中添加)。还需要安装 debugfs:
# mount -t debugfs none /sys/kernel/debug
其中许多脚本都使用 awk,并且会根据所需的行为尝试使用 mawk 或 gawk:mawk 用于缓冲输出(因为其速度),gawk 用于同步输出(如 fflush() 工作,允许更有效地分组)写道)。
这些只是脚本。要么抓住一切:
git clone --depth 1 https://github.com/brendangregg/perf-tools
或者使用 github 上的原始链接下载单个脚本。例如:
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
这会保留选项卡(复制粘贴可能会弄乱)。
Ftrace 首次添加到 Linux 2.6.27,perf_events 首次添加到 Linux 2.6.31。这些早期版本存在内核错误,并且在 2.6.32 系列内核上报告了锁定和恐慌。这包括 CentOS 6.x。如果您必须分析较旧的内核,这些工具可能仅在容错环境中有用,例如具有模拟问题的实验室。这些工具主要是在 Linux 3.2 及更高版本的内核上开发的。
根据工具的不同,还可能会产生开销。请参阅下一节。
perf_events 正在不断发展。该集合大约在 Linux 3.16 左右开始开发,以 Linux 3.2 服务器为主要目标,当时 perf_events 缺乏某些编程功能(例如,自定义内核聚合)。这些可能会被添加到即将发布的内核版本中。在那之前,许多工具都采用变通方法、技巧和技巧来工作。其中一些工具将事件数据传递到用户空间进行后处理,这比内核聚合的开销要高得多。每个工具的开销在其手册页中进行了描述。
警告:在极端情况下,使用这些工具时您的目标应用程序的运行速度可能会慢 5 倍。根据工具和内核版本的不同,还可能存在内核崩溃的风险。请阅读程序头中的警告,并在使用前进行测试。
如果开销是个问题,可以改进这些工具。如果工具还没有,可以用 C 重写它,以使用 perf_events_open() 和 mmap() 作为跟踪缓冲区。它还可以用 C 语言实现频率计数,并直接对 mmap() 进行操作,而不是使用 awk/Perl/Python。基于 ftrace 的工具还可以进行其他改进,例如使用快照和每个实例缓冲区。
其中一些工具旨在作为短期解决方法,直到出现更多内核功能为止,此时可以对它们进行大幅重写。对于较旧的内核版本,这些工具的较旧版本将保留在此存储库中。
由于我的主要目标是一组没有 debuginfo 的 Linux 3.2 服务器,因此这些工具尽量不需要它。有时,这使得该工具比需要的更脆弱,因为我正在使用变通方法(可能是特定于内核版本和平台的)而不是使用 debuginfo 信息(可以是通用的)。有关每个工具的详细先决条件,请参阅手册页。
我尝试尽可能使用 perf_events (“perf”),因为该界面是为多用户使用而开发的。由于各种原因,我经常需要使用 ftrace。 ftrace 非常强大(感谢 Steven Rostedt!),并且并非它的所有功能都是通过 perf 公开的,或者是常用的。该工具集在某种程度上展示了使用 ftrace 隐藏的 Linux 功能。
由于情况正在发生变化,您很可能会发现某些工具无法在您的 Linux 内核版本上运行。修复它们需要一些专业知识和组装。
案例研究和总结:
相关文章: