性能定位工具

在Linux中,当程序出现性能问题时,需要定位其性能瓶颈在哪里,以下是几个定位性能问题的工具:
可以先用top查看cpu 耗时,top -> 1;查看每个core的耗时情况;us是用户态调用,sy是内核态。
1、strace: 汇总内核态系统调用的时间
strace -f -cp PID: -c 汇总各个操作的总耗时,不加c输出详细信息,-f表示跟踪其子进程。
strace {command}: 跟踪命令对文件的操作,如df -h卡死,strace df -h跟踪命令在哪一步卡死。
strace可以看到系统调用性能,但无法看到调用栈。可以利用pstack查看进程的调用栈:
pstack {pid}

  1. top 查看所有进程cpu内核态和用户态耗时,perf查看cpu总的耗时
    perf top : 查看哪个系统调用的时间最高.
    perf top -e {event}; event 是指可追踪的event事件
    对内核参数的调用栈进行取样
    #perf record -a -g -F 1000 sleep 60
    “-g'的意思是按照调用关系存储数据;“-F 1000 sleep 60”表示按照每秒取1000个样本的频率取一分钟。
    取完样后,使用perf report -g打开取样的数据
event: perf list 列出所有可选择的event. perf stat [-e {event}] [{command}] [{options}]: 收集此command运行的的一些性能数据. perf stat report [-i file]: 生成汇报数据. perf lock {record | report | script | info} : 记录内核锁的性能分析 perf-kmem: slab分配器的性能分析。 perf kmem {record | stat} [] perf-probe: 可以自定义探测点。

【性能定位工具】使用例子
  • Display which lines in schedule() can be probed
    # perf probe --line schedule#前面有行号的可以探测。

  • Add a probe on schedule() function 12th line.
    #perf probe -a schedule:12

在schedule函数的12处增加一个探测点。
2、ltrace:汇总用户态的调用时间
ltrace -p PID
3、trace: strace类似
4、lsof:查看文件的占用情况。
Python性能定位工具 由于strace只能进行系统调用的分析。对于python程序本身一些用户态的函数性能无法查看。可以采用pyflame,生成火焰图进行查看。生产火焰图的工具FlameGraph。
安装pyflame:
yum install autoconf automake gcc-c++ python-devel python3-devel libtool -y ./autogen.sh ./configure# Plus any options like --prefix. make make check# Optional, test the build! Should take < 1 minute. make install# Optional, install into the configure prefix.

火焰图工具:
cp flamegraph.pl /usr/bin/
chmod +x /usr/bin/flamegraph.pl
数据收集:
#pyflame -p {pid} | flamegraph.pl > myprofile.svg 浏览器打开myprofile.svg

  1. CPU负载查看
# mpstat 3 表示CPU平均负载,3表示采样间隔 # mpstat -P 0 3 表示查看具体某个核的负载# top 查看具体哪个进程占用的负载较高

  1. IO负载查看
iostat:间隔2s,产生6分关于device的报告。-d/-c: device report/cpu的使用情况; -x: 扩展记录 2: 2s; 6:6个报告#iostat -d-x -p sda 2 6 Linux 3.10.0-862.11.6.1.el7.x86_64 (ceph01)10/14/2020_x86_64_(40 CPU)Device:rrqm/swrqm/sr/sw/srkB/swkB/s avgrq-sz avgqu-szawait r_await w_awaitsvctm%util sda0.000.070.006.580.22268.6981.650.1116.226.1016.230.390.26 sda10.000.000.000.000.000.00153.130.003.433.423.512.450.00 sda20.000.070.006.580.21268.6981.650.1116.226.1316.230.390.26Device:rrqm/swrqm/sr/sw/srkB/swkB/s avgrq-sz avgqu-szawait r_await w_awaitsvctm%util sda0.000.000.009.000.0076.0016.890.000.280.000.280.110.10 sda10.000.000.000.000.000.000.000.000.000.000.000.000.00 sda20.000.000.009.000.0076.0016.890.000.280.000.280.110.10Device:rrqm/swrqm/sr/sw/srkB/swkB/s avgrq-sz avgqu-szawait r_await w_awaitsvctm%util sda0.000.000.0024.500.003398.00277.390.348.100.008.100.671.65 sda10.000.000.000.000.000.000.000.000.000.000.000.000.00 sda20.000.000.0024.500.003398.00277.390.378.100.008.100.691.70Device:rrqm/swrqm/sr/sw/srkB/swkB/s avgrq-sz avgqu-szawait r_await w_awaitsvctm%util sda0.000.000.0046.000.009076.00394.612.1048.830.0048.831.637.50 sda10.000.000.000.000.000.000.000.000.000.000.000.000.00 sda20.000.000.0046.000.009076.00394.612.0748.830.0048.831.627.45Device:rrqm/swrqm/sr/sw/srkB/swkB/s avgrq-sz avgqu-szawait r_await w_awaitsvctm%util sda0.001.500.0022.500.00236.0020.980.052.070.002.070.441.00 sda10.000.000.000.000.000.000.000.000.000.000.000.000.00 sda20.001.500.0022.500.00236.0020.980.052.070.002.070.441.00Device:rrqm/swrqm/sr/sw/srkB/swkB/s avgrq-sz avgqu-szawait r_await w_awaitsvctm%util sda0.000.000.009.500.0062.0013.050.000.160.000.160.110.10 sda10.000.000.000.000.000.000.000.000.000.000.000.000.00 sda20.000.000.009.500.0062.0013.050.000.160.000.160.110.10iotop: 查看IO最高的线程 strace: 跟踪系统调用,查看io时,可以先根据iotop确定io最高的线程,strace -p {pid},跟踪此线程的系统调用iperf3: 打流测试: 客户端: # iperf3 -c {server_host} -i1 -t60 -p {port}服务端: # iperf3 -s -p {port}关注带宽,Retr: tcp重传次数,窗口值

    推荐阅读