性能定位工具
在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} []
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
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/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重传次数,窗口值
推荐阅读
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 孩子不是实现父母欲望的工具——林哈夫
- 最有效的时间管理工具(赢效率手册和总结笔记)
- 工具|后天就是七夕节,你准备好了吗(送上几个七夕代码,展示你技能的时候到了!)
- 三国谋略22(找准你的定位)
- 工具分享|5个有趣好玩的网站,拒绝无聊!
- 数据库|SQL行转列方式优化查询性能实践
- 工具人的一天
- 性能测试中QPS和TPS的区别
- jvm常见分析工具