在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}
- 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} [<options>]
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
- CPU负载查看
# mpstat 3 表示CPU平均负载,3表示采样间隔
# mpstat -P 0 3 表示查看具体某个核的负载
# top 查看具体哪个进程占用的负载较高
- 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/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.07 0.00 6.58 0.22 268.69 81.65 0.11 16.22 6.10 16.23 0.39 0.26
sda1 0.00 0.00 0.00 0.00 0.00 0.00 153.13 0.00 3.43 3.42 3.51 2.45 0.00
sda2 0.00 0.07 0.00 6.58 0.21 268.69 81.65 0.11 16.22 6.13 16.23 0.39 0.26
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 9.00 0.00 76.00 16.89 0.00 0.28 0.00 0.28 0.11 0.10
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 0.00 9.00 0.00 76.00 16.89 0.00 0.28 0.00 0.28 0.11 0.10
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 24.50 0.00 3398.00 277.39 0.34 8.10 0.00 8.10 0.67 1.65
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 0.00 24.50 0.00 3398.00 277.39 0.37 8.10 0.00 8.10 0.69 1.70
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 46.00 0.00 9076.00 394.61 2.10 48.83 0.00 48.83 1.63 7.50
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 0.00 46.00 0.00 9076.00 394.61 2.07 48.83 0.00 48.83 1.62 7.45
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 1.50 0.00 22.50 0.00 236.00 20.98 0.05 2.07 0.00 2.07 0.44 1.00
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 1.50 0.00 22.50 0.00 236.00 20.98 0.05 2.07 0.00 2.07 0.44 1.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 9.50 0.00 62.00 13.05 0.00 0.16 0.00 0.16 0.11 0.10
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 0.00 9.50 0.00 62.00 13.05 0.00 0.16 0.00 0.16 0.11 0.10
iotop: 查看IO最高的线程
strace: 跟踪系统调用,查看io时,可以先根据iotop确定io最高的线程,strace -p {pid},跟踪此线程的系统调用
iperf3:
打流测试:
客户端:
# iperf3 -c {server_host} -i1 -t60 -p {port}
服务端:
# iperf3 -s -p {port}
关注带宽,Retr: tcp重传次数,窗口值
网友评论