文章目录
1. 性能分析
1.1 常用命令
uptime
查询当前系统登录用户,以及系统平均负载(平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数)
uptime
19:11:03 up 147 days, 2:02, 2 users, load average: 0.27, 0.07, 0.02
分别为: 当前时间,系统目前登录用户数,系统 1分钟前,5分钟前,15分钟前的平均负载
比如当平均负载为 2 时,意味着什么呢?
- 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
- 在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。
- 而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。
查看系统有几个CPU
grep 'model name' /proc/cpuinfo | wc -l
一旦平均负载高于70%,就需要去排查一下问题了。
高亮显示负载变化
watch -d uptime
mpstat
查看CPU使用情况,io等待,
# 间隔5s输出一次数据
mpstat -P ALL 5
19时38分09秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
19时38分14秒 all 1.61 0.00 1.01 3.63 0.00 0.20 0.00 0.00 0.00 93.55
19时38分14秒 0 1.61 0.00 1.01 3.63 0.00 0.20 0.00 0.00 0.00 93.55
因为我只有 1 个cup,所以只会有两行,一行是统计,一行是我当前cpu使用
pidstat
输出正在运行的进程的CPU占用率
# 间隔5秒后输出2组数据
pidstat -u 5 2
# 指定某个进程
pidstat -d -p 4344 5 2
- -p:指定进程号
- -d: 输出IO使用情况
top
查看CPU使用率, 按 1 可查看每个CPU的使用率
top - 09:52:28 up 147 days, 16:43, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 101 total, 1 running, 65 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.7 us, 0.7 sy, 0.0 ni, 98.3 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2034368 total, 91912 free, 460872 used, 1481584 buff/cache
KiB Swap: 2097148 total, 1879036 free, 218112 used. 1418440 avail Mem
- user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
- nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
- system(通常缩写为 sys),代表内核态 CPU 时间。
- idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
- iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
- softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
- steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
- guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
- guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。
perf
找出CPU占用最高的函数
安装
yum install perf -y
使用
# 查看性能分析
perf top
# 查看某一个具体的进程
perf top -g -p 进程号
# 收集性能报告
perf record -g
# 查看性能分析报告
perf report
# 收集15秒数据并查看性能分析报告
perf record -ag -- sleep 15;perf report
- Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
- Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
- Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
- Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
execsnop
这是一个用来分析短时进程而设计的一个工具
安装
- 复制 https://github.com/brendangregg/perf-tools/blob/master/execsnoop 里面的内容
- 拷贝到 execsnop文件中
- 为该文件添加可执行权限
使用
./execsnop
strace
追踪系统调用
strace -p 进程号
pstree
寻找进程的父进程
pstree -aps 进程号
sar
查看系统网络收发情况
# -n DEV 表示显示网络收发的报告,间隔1秒输出一组数据
sar -n DEV 1
- 第一列:表示报告的时间。
- 第二列:IFACE 表示网卡。
- 第三、四列:rxpck/s 和 txpck/s 分别表示每秒接收、发送的网络帧数,也就是 PPS。
- 第五、六列:rxkB/s 和 txkB/s 分别表示每秒接收、发送的千字节数,也就是 BPS。
tcpdump
这是一个抓包工具
# -i eth0 只抓取eth0网卡,
# -n不解析协议名和主机名
# tcp port 80表示只抓取tcp协议并且端口号为80的网络帧
tcpdump -i eth0 -n tcp port 80
中断
# 查看软中断
watch -d cat /proc/softirqs
# 查看硬中断
watch -d cat /proc/interrupts
1.2 排查思路
1.2.1 根据指标找工具
1.2.2 根据工具查指标
1.2.3 排查流程
1.3 系统压测
stress
这是一个Linux系统压测工具
安装
yum install stress -y
压测CPU
stress --cpu 1 --timeout 600
压测IO
stress -i 1 --timeout 600
模拟8个进程
stress -c 8 --timeout 600