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 持续过低:检查大进程或泄漏;用 smempmap 辅助定位。
  • pgmajfault 飙升:磁盘 IO 压力或缓存命中率下降。

练习#

  • 统计系统 10 秒内的 pgmajfault/s,判断是否出现抖动。

3. 磁盘与文件系统指标#

  • IOPS
    计算:(Δrio + Δwio) / Δt
  • 吞吐(Throughput)
    计算:(Δrbytes + Δwbytes) / Δt
  • 平均响应时间(Avg await)
    iostat 中 await 代表请求平均完成时间
  • 队列长度(Avgqu-sz)
    持续高值说明瓶颈

示例与命令#

# iostat 采集(每 13 次)
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/statprocesses
  • 线程数(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:确认网卡名(如 eth0 vs ens33)。

练习#

  • 修改脚本支持指定网卡名并输出 CSV。
  • 将采样间隔改为 5 秒并验证 CPU 使用率变化趋势。

通过上述指标的标准化定义与计算方法,可确保后续基线建立、异常判定与容量规划具备可复用、可对比的指标口径。