4.5.2 关键指标定义与计算方法
本节聚焦 Linux 运维中常用性能指标的定义、含义与计算方法,统一指标口径,便于基线与容量规划。包含安装、示例、排错与练习。
1. CPU 相关指标#
- CPU 使用率(CPU Utilization)
定义:CPU 实际忙碌时间占总时间比例。
计算:CPU使用率 = 1 - idle%(/proc/stat 或 top)
细分:user%、system%、iowait%、steal%。
安装与采集示例#
# 安装常用工具(iostat/vmstat/sar)
sudo yum install -y sysstat procps-ng
# 或 Debian/Ubuntu
sudo apt-get install -y sysstat procps
# 1) top 观察 CPU 细分
top -bn1 | head -n 5
# 2) 从 /proc/stat 计算 CPU 使用率(差分法)
awk '/^cpu /{print $2,$3,$4,$5,$6,$7,$8}' /proc/stat > /tmp/cpu1
sleep 1
awk '/^cpu /{print $2,$3,$4,$5,$6,$7,$8}' /proc/stat > /tmp/cpu2
python3 - <<'PY'
import numpy as np
a=np.loadtxt('/tmp/cpu1'); b=np.loadtxt('/tmp/cpu2')
delta=b-a
idle=delta[3]+delta[4] # idle + iowait
total=delta.sum()
print("CPU使用率=%.2f%%"%((1-idle/total)*100))
PY
# 3) 负载(Load Average)
uptime
常见排错#
- 负载高但 CPU 利用率低:关注
iowait、磁盘队列或锁竞争。 steal高:虚拟化环境被宿主抢占 CPU。
练习#
- 用
top找出 CPU 使用最高的进程并解释us/sy/wa含义。 - 用差分法计算 1 秒 CPU 使用率并与
top结果对比。
2. 内存相关指标#
- 内存使用率(Mem Utilization)
计算:1 - (MemAvailable / MemTotal)(优先用 MemAvailable) - 缓存命中率(Page Cache Hit Ratio)
计算:1 - (pgmajfault / pgfault)(差分) - 缺页率(Page Faults/s)
计算:Δpgfault / Δt、Δpgmajfault / Δt
示例与命令#
# 1) MemAvailable 计算内存使用率
awk '/MemTotal|MemAvailable/ {print $1,$2}' /proc/meminfo
python3 - <<'PY'
import re
m={}
for line in open('/proc/meminfo'):
k,v=line.split()[:2]; m[k]=int(v)
usage=1-(m['MemAvailable:']/m['MemTotal:'])
print("内存使用率=%.2f%%"%(usage*100))
PY
# 2) 缺页率(差分)
awk '/pgfault|pgmajfault/ {print $2}' /proc/vmstat > /tmp/vm1
sleep 1
awk '/pgfault|pgmajfault/ {print $2}' /proc/vmstat > /tmp/vm2
paste /tmp/vm1 /tmp/vm2
常见排错#
MemAvailable持续过低:检查大进程或泄漏;用smem、pmap辅助定位。pgmajfault飙升:磁盘 IO 压力或缓存命中率下降。
练习#
- 统计系统 10 秒内的
pgmajfault/s,判断是否出现抖动。
3. 磁盘与文件系统指标#
- IOPS
计算:(Δrio + Δwio) / Δt - 吞吐(Throughput)
计算:(Δrbytes + Δwbytes) / Δt - 平均响应时间(Avg await)
iostat 中await代表请求平均完成时间 - 队列长度(Avgqu-sz)
持续高值说明瓶颈
示例与命令#
# iostat 采集(每 1 秒 3 次)
iostat -x 1 3
# 解释关键列:
# r/s w/s -> IOPS
# rkB/s wkB/s -> 吞吐
# await -> 平均响应时间
# avgqu-sz -> 队列长度
常见排错#
await高且util高:磁盘饱和或队列深;考虑升级盘或分流 IO。await高但util不高:可能是存储层抖动或驱动问题。
练习#
- 用
iostat -x 1 5找出 IOPS 最大的设备并解释await。
4. 网络指标#
- 吞吐量(Bandwidth Usage)
计算:(Δrx_bytes + Δtx_bytes) / Δt - 包速率(PPS)
计算:(Δrx_packets + Δtx_packets) / Δt - 丢包率(Packet Loss)
计算:Δdrop / (Δpackets + Δdrop) - 连接数与状态分布
统计ESTABLISHED/TIME_WAIT等
示例与命令#
# 1) 网卡统计(差分)
cat /proc/net/dev | awk 'NR>2{print $1,$2,$3,$10,$11}'
sleep 1
cat /proc/net/dev | awk 'NR>2{print $1,$2,$3,$10,$11}'
# 2) 连接状态分布
ss -s
# 3) 单接口抓包统计(仅查看摘要)
sudo tcpdump -i eth0 -nn -c 20
常见排错#
TIME_WAIT过多:检查短连接频繁、应用连接池、内核参数。- 丢包高:检查网卡错误计数(
ethtool -S)或交换机端口。
练习#
- 统计某网卡 1 秒 PPS,并与
ss -s连接数关联分析。
5. 进程与系统指标#
- 进程数量(Process Count)
计算:ps -e或/proc/stat中processes - 线程数(Threads)
ps -eL | wc -l - 文件句柄使用率
open_files / max_files(/proc/sys/fs/file-nr)
示例与命令#
# 进程数
ps -e --no-headers | wc -l
# 线程数
ps -eL --no-headers | wc -l
# 文件句柄使用率
cat /proc/sys/fs/file-nr
# 输出示例:2144 0 524288
# 解释:已分配 2144,未使用 0,最大 524288
常见排错#
- 句柄耗尽:应用未关闭文件或连接,排查
lsof -p PID。 - 线程数异常:可能线程池失控或死循环创建。
练习#
- 找出当前打开文件最多的进程并记录其数量。
6. 关键指标计算与采样原则#
- 差分采样:大多数指标需两次采样求差分。
- 统一时间窗口:1s/5s/60s 多级采样便于趋势分析。
- 取样同步:CPU/内存/IO/网络同时间窗口采样便于关联。
- 百分位统计:P50/P95/P99 描述延迟分布。
采样脚本示例(1 秒差分)#
#!/bin/bash
# /usr/local/bin/sample_perf.sh
# 采集 CPU/内存/磁盘/网络关键指标(1s 差分)
ts1=$(date +%s)
cpu1=($(awk '/^cpu /{print $2,$3,$4,$5,$6,$7,$8}' /proc/stat))
net1=($(awk '/eth0:/{print $2,$10}' /proc/net/dev))
sleep 1
ts2=$(date +%s)
cpu2=($(awk '/^cpu /{print $2,$3,$4,$5,$6,$7,$8}' /proc/stat))
net2=($(awk '/eth0:/{print $2,$10}' /proc/net/dev))
# CPU使用率
idle=$(( (cpu2[3]+cpu2[4])-(cpu1[3]+cpu1[4]) ))
total=0
for i in {0..6}; do total=$(( total + cpu2[i] - cpu1[i] )); done
cpu_usage=$(awk -v i=$idle -v t=$total 'BEGIN{printf "%.2f", (1-i/t)*100}')
# 网络吞吐(bytes/s)
rx=$(( net2[0] - net1[0] ))
tx=$(( net2[1] - net1[1] ))
echo "time=$ts2 cpu=${cpu_usage}% rx=${rx}B/s tx=${tx}B/s"
排错提示#
- 脚本执行报错
command not found:检查PATH或是否安装procps/sysstat。 - 指标为 0:确认网卡名(如
eth0vsens33)。
练习#
- 修改脚本支持指定网卡名并输出 CSV。
- 将采样间隔改为 5 秒并验证 CPU 使用率变化趋势。
通过上述指标的标准化定义与计算方法,可确保后续基线建立、异常判定与容量规划具备可复用、可对比的指标口径。