前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LINUX 性能专家 Brendan Gregg博文拜读系列<1>-附九张性能图片

LINUX 性能专家 Brendan Gregg博文拜读系列<1>-附九张性能图片

作者头像
五分钟学SRE
发布2024-04-10 08:37:48
1670
发布2024-04-10 08:37:48
举报
文章被收录于专栏:五分钟学SRE五分钟学SRE

在深入Linux系统的复杂世界中,性能优化始终是SRE关注的热点。最近在拜读国际著名的 LINUX 性能专家 Brendan Gregg 的个人博客和技术书籍。他的工作不仅涵盖了系统性能的监控和分析,还深入探讨了性能问题的根源及其解决方案。通过他的个人博客和技术书籍,我们可以窥见Linux性能优化的精髓,学习到如何利用各种工具和方法来提升系统效率,确保应用的顺畅运行。将会结合 Brendan Gregg博文与个人理解 出一个拜读系列博文。

这期我们将介绍几个由Brendan Gregg开发或推广的性能分析工具,包括perf、eBPF工具、perf-toolsbccbpftrace,以及如何使用它们来提升系统性能。

perf

运用场景:性能调优、系统分析、代码优化等。

常见命令:

  • perf record: 记录一段时间内发生的系统性能事件,如CPU周期、缓存命中/失效等。
  • perf report: 展示性能记录的结果,帮助分析程序的性能瓶颈。
  • perf top: 实时监控系统性能,动态显示最耗时的函数和指令。

具体案例:在Linux系统中,可以使用perf record命令对特定程序进行性能采样分析。例如,对于一个编译过的C++程序,可以使用以下命令进行采样:

代码语言:javascript
复制
perf record -F 99 -a -g -- sleep 10

这里,-F 99设置了采样频率为99Hz,-a表示对整个系统进行采样,-g启用调用图形记录,--后面跟随的是被采样的命令,这里是让系统休眠60秒。采样完成后,使用perf report命令生成性能报告,分析程序的热点函数和性能瓶颈。

eBPF工具

运用场景:系统跟踪、网络分析、安全监控等。

常见命令:

  • bpftrace: 使用BPF跟踪器执行跟踪脚本,如监控文件系统调用、网络包等。
  • bpftool: 是一个BPF程序和映射的管理工具,可以用来创建、查询和删除BPF程序。

具体案例:可以使用bpftrace脚本来跟踪所有的系统调用,并使用bpftool将结果导出到一个跟踪文件中。例如,以下是一个简单的bpftrace脚本,用于跟踪并打印所有的open系统调用:

代码语言:javascript
复制
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("open: %s\n", str(args->filename)); }'

运行此脚本将打印出每个open调用尝试打开的文件名。通过分析这些数据,可以识别频繁发生的系统调用,进而优化系统性能。

perf-tools

工具安装

代码语言:javascript
复制
git clone --depth 1 https://github.com/brendangregg/perf-toolsOr use the raw links on github to download individual scripts. Eg:wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop

运用场景:系统性能分析、内核跟踪等。

常见命令:

  • iosnoop: 跟踪并报告磁盘I/O活动,帮助识别I/O密集型进程。
  • tcptracer: 跟踪TCP连接的建立、传输和终止过程。

具体案例:使用iosnoop监控磁盘I/O操作,可以通过以下命令启动:

先从github 同步脚本

代码语言:javascript
复制
https://github.com/brendangregg/perf-tools/blob/master/iosnoop

参数查看

代码语言:javascript
复制
./iosnoop -h
USAGE: iosnoop [-hQst] [-d device] [-i iotype] [-p PID] [-n name]
               [duration]
                 -d device       # device string (eg, "202,1)
                 -i iotype       # match type (eg, '*R*' for all reads)
                 -n name         # process name to match on I/O issue
                 -p PID          # PID to match on I/O issue
                 -Q              # use queue insert as start time
                 -s              # include start time of I/O (s)
                 -t              # include completion time of I/O (s)
                 -h              # this usage message
                 duration        # duration seconds, and use buffers
  eg,
       iosnoop                   # watch block I/O live (unbuffered)
       iosnoop 1                 # trace 1 sec (buffered)
       iosnoop -Q                # include queueing time in LATms
       iosnoop -ts               # include start and end timestamps
       iosnoop -i '*R*'          # trace reads
       iosnoop -p 91             # show I/O issued when PID 91 is on-CPU
       iosnoop -Qp 91            # show I/O queued by PID 91, queue time

案例

代码语言:javascript
复制
./iosnoop -ts
Tracing block I/O. Ctrl-C to end.
STARTs          ENDs            COMM         PID    TYPE DEV      BLOCK        BYTES     LATms
26269565.311980 26269565.312218 kworker/0:1H 90     WM   8,0      4722696      20480      0.24
26269565.312027 26269565.312242 kworker/0:1H 90     WM   8,0      4730760      4096       0.22
26269565.312031 26269565.312243 kworker/0:1H 90     WM   8,0      4730896      4096       0.21
代码语言:javascript
复制

bcc

代码语言:javascript
复制
工具仓库
代码语言:javascript
复制
https://github.com/iovisor/bcc#tools
代码语言:javascript
复制
代码语言:javascript
复制
在linux 系统的位置
代码语言:javascript
复制
cd /usr/share/bcc/tools

运用场景:内核跟踪、性能调优、网络分析等。

常见命令

  • biolatency: 监控块设备的I/O延迟,分析延迟的来源。
  • tcptop: 实时显示TCP连接的状态,包括传输速率和重传信息。

具体案例:通过biolatency分析块设备的I/O延迟,可以使用以下命令:

代码语言:javascript
复制
./biolatency
Tracing block device I/O... Hit Ctrl-C to end.
^C
     usecs               : count     distribution
         0 -> 1          : 0        |                                        |
         2 -> 3          : 0        |                                        |
         4 -> 7          : 0        |                                        |
         8 -> 15         : 5        |                                        |
        16 -> 31         : 76       |*****                                   |
        32 -> 63         : 280      |********************                    |
        64 -> 127        : 538      |****************************************|
       128 -> 255        : 204      |***************                         |
       256 -> 511        : 92       |******                                  |
       512 -> 1023       : 63       |****                                    |
      1024 -> 2047       : 22       |*                                       |
      2048 -> 4095       : 16       |*                                       |
      4096 -> 8191       : 98       |*******                                 |
      8192 -> 16383      : 200      |**************                          |
     16384 -> 32767      : 103      |*******                                 |
     32768 -> 65535      : 11       |                                        |
     65536 -> 131071     : 1        |                                        |
    131072 -> 262143     : 1        |                                        |
代码语言:javascript
复制

bpftrace

安装

代码语言:javascript
复制
https://github.com/bpftrace/bpftrace/blob/master/INSTALL.md

运用场景:内核跟踪、性能分析、安全监控等。

常见命令

  • trace: 执行BPF跟踪脚本,如监控内核函数的执行。
  • profile: 执行BPF性能分析脚本,统计函数的执行频率和耗时。

具体案例:编写一个bpftrace脚本,跟踪系统调用的执行情况,并统计每个调用的执行次数和耗时。例如,以下脚本统计了readwrite系统调用的发生次数:

代码语言:javascript
复制
bpftrace -e 'tracepoint:syscalls:sys_enter_read,sys_enter_write { @[comm] = count(); }'
代码语言:javascript
复制

通过profile命令,可以生成一个性能报告,识别潜在的性能问题:

代码语言:javascript
复制
bpftrace -e 'profile:hz:99 { @[comm] = count(); }'
代码语言:javascript
复制

这将每99Hz采样一次,统计并输出每个进程的readwrite调用次数。

火焰图(Flame Graphs)

文章链接

代码语言:javascript
复制
https://www.brendangregg.com/flamegraphs.html

运用场景:CPU分析、内存分析等。

常见命令:通过perf和其他性能分析工具生成火焰图,如使用perf scriptperf record的输出转换为火焰图。

具体案例:使用perf record对程序进行采样,然后通过perf scriptflamegraph工具生成CPU火焰图。例如,对一个C程序进行分析的命令如下:

代码语言:javascript
复制
代码语言:javascript
复制
git clone https://github.com/brendangregg/FlameGraph  # or download it from github
 cd FlameGraph
 perf record -F 99 -a -g -- sleep 60
 perf script | ./stackcollapse-perf.pl > out.perf-folded
 ./flamegraph.pl out.perf-folded > perf.svg
代码语言:javascript
复制
 使用chrome 打开

这里,-F 999设置了非常高的采样频率,-a表示对整个系统进行采样,./a.out是要分析的程序。perf script将采样数据转换为文本格式,然后使用flamegraph.pl脚本生成火焰图flamegraph.svg,可视化地显示应用程序中的CPU使用情况,快速定位热点函数。

Linux 性能工具全景图

  1. Linux Observability Tools:展示了Linux可观测性工具的地图,这些工具用于监控和理解系统的行为和性能。
  1. Linux Static Performance Analysis Tools:提供了用于静态性能分析的工具地图,这些工具帮助分析代码和系统配置。
  1. Linux Benchmarking Tools:介绍了用于基准测试的工具地图,用于评估系统在特定负载下的性能。
  1. Linux Tuning Tools:展示了用于系统性能调优的工具地图,包括各种参数调整和优化技术。
  1. Linux sar:提供了系统活动记录(sar)工具的地图,这是一个用于收集系统活动数据的工具。
  1. Hi-res diagram combining observability, static performance tuning, and perf-tools/bcc:这是一张高分辨率图,结合了可观测性、静态性能调优和perf-tools/bcc工具的信息。
  1. Linux eBPF:介绍了Linux eBPF技术及其应用。
  1. bcc: Taming Linux 4.3+ Tracing Superpowers:展示了bcc工具如何帮助管理和利用Linux 4.3及以上版本的追踪功能。
  1. Linux eBPF Off-CPU Flame Graph:提供了使用bcc工具生成的Linux eBPF离CPU火焰图,帮助分析系统在非CPU使用时间的性能开销。

推荐博文:

https://www.brendangregg.com/blog/2016-01-20/ebpf-offcpu-flame-graph.html

https://github.com/brendangregg/FlameGraph

https://www.brendangregg.com/linuxperf.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学SRE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Linux 性能工具全景图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档