Linux系统监控指标详解:CPU、内存、IO性能分析实战
一、概述
1.1 背景介绍
系统监控作为运维工作的核心环节,直接关系到业务稳定性和故障响应效率。Linux系统提供了丰富的性能指标采集机制,通过 /proc 和 /sys 虚拟文件系统暴露内核运行时数据,配合各类监控工具实现对CPU、内存、磁盘IO、网络等关键资源的实时观测。
现代云原生架构下,单机监控已演进为分布式可观测性体系的重要组成部分。掌握底层监控指标的含义和采集方法,是构建有效告警策略、进行性能调优、快速定位故障根因的基础能力。本文从SRE工程实践角度,系统梳理Linux核心监控指标的技术原理与分析方法。
1.2 技术特点
- 内核级数据源:所有监控指标均来源于Linux内核通过procfs/sysfs暴露的实时数据,具备高精度和低开销特性
- 多维度覆盖:涵盖CPU调度、内存管理、块设备IO、网络协议栈等核心子系统,支持全栈性能分析
- 工具链成熟:从基础的vmstat、iostat到高级的perf、eBPF,形成完整的监控工具生态
- 标准化输出:指标格式遵循POSIX规范,便于与Prometheus、Grafana等现代监控平台集成
1.3 适用场景
- 容量规划:通过历史监控数据分析资源使用趋势,预测扩容时机,避免资源瓶颈影响业务
- 性能调优:识别CPU密集型或IO密集型工作负载特征,针对性优化系统参数和应用配置
- 故障诊断:结合多维指标关联分析,快速定位系统异常根因,缩短MTTR(平均修复时间)
- SLA保障:建立基于监控指标的告警体系,实现故障预警和自动化响应
1.4 环境要求
| | |
|---|
| CentOS 8+/Ubuntu 20.04+/Debian 11+ | 内核版本建议4.15以上,支持完整的cgroup v2和eBPF特性 |
| | 提供ps、top、vmstat、free等基础工具 |
| | 提供iostat、mpstat、sar等性能统计工具 |
| | |
| | |
| | |
二、详细步骤
2.1 准备工作
2.1.1 系统环境检查
# 检查内核版本,确认支持所需特性
uname -r
# 预期输出:5.15.0-91-generic 或更高版本
# 检查procfs挂载状态
mount | grep proc
# 预期输出:proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
# 验证sysfs可用性
ls /sys/class/block/
# 预期输出:列出所有块设备
# 检查cgroup版本
cat /sys/fs/cgroup/cgroup.controllers 2>/dev/null && echo"cgroup v2" || echo"cgroup v1"
2.1.2 监控工具安装
RHEL/CentOS/Rocky Linux 系统:
# 安装sysstat工具包
dnf install -y sysstat
# 安装htop增强监控
dnf install -y epel-release
dnf install -y htop iotop
# 安装perf性能分析工具
dnf install -y perf
# 启用sysstat数据采集服务
systemctl enable --now sysstat
Debian/Ubuntu 系统:
# 更新软件源
apt update
# 安装完整监控工具集
apt install -y sysstat htop iotop linux-tools-common linux-tools-$(uname -r)
# 启用sysstat定时采集
sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
systemctl restart sysstat
2.1.3 数据源目录结构
Linux监控数据主要来源于以下虚拟文件系统:
# CPU相关信息
/proc/stat# CPU时间统计
/proc/loadavg # 系统负载
/proc/cpuinfo # CPU硬件信息
# 内存相关信息
/proc/meminfo # 内存使用详情
/proc/vmstat # 虚拟内存统计
/proc/buddyinfo # 内存碎片信息
# 磁盘IO相关信息
/proc/diskstats # 块设备IO统计
/sys/block/*/stat# 单设备IO统计
/proc/io # 进程级IO统计(需要root权限)
# 网络相关信息
/proc/net/dev # 网络接口统计
/proc/net/snmp # 协议层统计
2.2 CPU监控指标详解
2.2.1 CPU时间片分布
CPU时间按使用类型划分为多个维度,理解各维度含义是性能分析的基础:
# 查看原始CPU统计数据
cat /proc/stat | head -1
# 输出格式:cpu user nice system idle iowait irq softirq steal guest guest_nice
# 使用mpstat查看格式化输出(每秒刷新,共5次)
mpstat -P ALL 1 5
CPU时间维度说明:
2.2.2 系统负载(Load Average)
系统负载反映运行队列中等待CPU的任务数量,是评估系统繁忙程度的关键指标:
# 查看系统负载
cat /proc/loadavg
# 输出:0.52 0.48 0.45 2/1089 28754
# 含义:1分钟/5分钟/15分钟负载 运行进程数/总进程数 最近创建的PID
# 使用uptime查看负载
uptime
# 输出:10:23:45 up 45 days, 3:21, 2 users, load average: 0.52, 0.48, 0.45
# 获取CPU核心数用于负载评估
nproc
# 或
grep -c processor /proc/cpuinfo
负载评估原则:
- 负载值 > CPU核心数 × 1.5:存在资源争抢,需要关注
- 负载值 > CPU核心数 × 2:系统过载,可能影响响应时间
# 负载趋势分析脚本
#!/bin/bash
CORES=$(nproc)
LOAD=$(awk '{print $1}' /proc/loadavg)
RATIO=$(echo"$LOAD$CORES" | awk '{printf "%.2f", $1/$2}')
echo"CPU Cores: $CORES"
echo"Current Load: $LOAD"
echo"Load Ratio: $RATIO"
if (( $(echo"$RATIO > 1.5" | bc -l) )); then
echo"WARNING: System is overloaded!"
fi
2.2.3 CPU使用率实时监控
# 使用top命令监控(按1键展开各CPU核心)
top -bn1 | head -20
# 使用htop获得更友好的交互界面
htop
# 监控特定进程的CPU使用
pidstat -u 1 5
# 按CPU使用率排序进程
ps aux --sort=-%cpu | head -10
top命令关键字段解读:
top - 10:30:45 up 45 days, 3:28, 2 users, load average: 1.23, 0.98, 0.76
Tasks: 287 total, 2 running, 285 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.2 us, 2.1 sy, 0.0 ni, 91.5 id, 0.8 wa, 0.0 hi, 0.4 si, 0.0 st
MiB Mem : 15896.4 total, 1234.5 free, 8765.4 used, 5896.5 buff/cache
MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 6543.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 mysql 20 0 12.5g 8.2g 12345 S 45.2 52.8 12345:67 mysqld
5678 nginx 20 0 256m 128m 4567 S 12.3 0.8 234:56 nginx
2.3 内存监控指标详解
2.3.1 内存使用全景视图
Linux内存管理涉及物理内存、虚拟内存、缓存等多个层面,/proc/meminfo 提供完整的内存状态信息:
# 查看完整内存信息
cat /proc/meminfo
# 使用free命令查看摘要(-h人性化显示)
free -h
# 输出示例:
# total used free shared buff/cache available
# Mem: 15Gi 8.5Gi 1.2Gi 256Mi 5.8Gi 6.4Gi
# Swap: 4.0Gi 0B 4.0Gi
# 持续监控内存变化(每2秒刷新)
watch -n 2 free -h
关键内存指标解析:
2.3.2 内存使用率计算
# 正确的内存使用率计算方法
#!/bin/bash
# 文件名:mem_usage.sh
# 从/proc/meminfo提取关键值(单位:kB)
MEM_TOTAL=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
MEM_AVAILABLE=$(awk '/MemAvailable/ {print $2}' /proc/meminfo)
MEM_BUFFERS=$(awk '/Buffers/ {print $2}' /proc/meminfo)
MEM_CACHED=$(awk '/^Cached/ {print $2}' /proc/meminfo)
# 计算实际使用内存
MEM_USED=$((MEM_TOTAL - MEM_AVAILABLE))
# 计算使用率
USAGE_PERCENT=$(echo"scale=2; $MEM_USED * 100 / $MEM_TOTAL" | bc)
echo"Total Memory: $((MEM_TOTAL / 1024)) MB"
echo"Available Memory: $((MEM_AVAILABLE / 1024)) MB"
echo"Used Memory: $((MEM_USED / 1024)) MB"
echo"Memory Usage: ${USAGE_PERCENT}%"
2.3.3 vmstat内存监控
# vmstat综合监控(每秒采样,共10次)
vmstat 1 10
# 输出字段说明:
# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
# r b swpd free buff cache si so bi bo in cs us sy id wa st
# 1 0 0 1234567 89012 5678901 0 0 12 34 567 890 5 2 92 1 0
vmstat内存相关字段:
# 监控Swap活动(si/so非零表示内存压力)
vmstat 1 | awk 'NR>2 {if($7>0 || $8>0) print "SWAP Activity Detected: si="$7" so="$8}'
2.4 磁盘IO监控指标详解
2.4.1 iostat基础监控
# 查看所有磁盘IO统计(扩展模式,每秒刷新)
iostat -xz 1
# 输出示例:
# Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
# sda 12.34 56.78 123.45 567.89 0.12 1.23 0.96 2.12 1.23 2.34 0.12 10.00 10.00 0.56 12.34
# nvme0n1 234.56 123.45 2345.67 1234.56 0.00 0.00 0.00 0.00 0.12 0.23 0.01 10.00 10.00 0.12 5.67
iostat关键指标解析:
2.4.2 块设备原始统计
# 查看块设备原始IO统计
cat /proc/diskstats
# 字段说明(以sda为例):
# 8 0 sda 12345 678 901234 5678 90123 4567 890123 4567 0 8901 23456 0 0 0 0
# 主设备号 次设备号 设备名 读完成数 读合并数 读扇区数 读耗时(ms) 写完成数 写合并数 写扇区数 写耗时(ms) 当前IO数 IO耗时(ms) 加权IO耗时(ms)
# 单设备统计
cat /sys/block/sda/stat
2.4.3 iotop进程级IO监控
# 实时监控进程IO(需要root权限)
iotop -o # 仅显示有IO活动的进程
# 批处理模式输出
iotop -b -n 5 -d 1
# 按IO排序进程
iotop -o -P -a
三、示例代码和配置
3.1 完整配置示例
3.1.1 Prometheus Node Exporter配置
Node Exporter是采集Linux系统指标的标准组件,以下为生产环境推荐配置:
# 文件路径:/etc/systemd/system/node_exporter.service
[Unit]
Description=PrometheusNodeExporter
Documentation=https://prometheus.io/docs/guides/node-exporter/
After=network-online.target
[Service]
Type=simple
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter\
--web.listen-address=:9100\
--web.telemetry-path=/metrics\
--collector.filesystem.mount-points-exclude="^/(sys|proc|dev|host|etc)($$|/)"\
--collector.netclass.ignored-devices="^(veth|docker|br-).*"\
--collector.diskstats.device-exclude="^(ram|loop|fd|dm-).*"\
--collector.cpu.info\
--collector.meminfo\
--collector.diskstats\
--collector.netdev\
--collector.loadavg\
--collector.vmstat\
--collector.filesystem\
--collector.pressure\
--no-collector.wifi\
--no-collector.nvme\
--no-collector.infiniband
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
配置参数说明:
--collector.filesystem.mount-points-exclude:排除虚拟文件系统,减少无效指标--collector.diskstats.device-exclude:排除虚拟磁盘设备--collector.pressure:启用PSI(Pressure Stall Information)采集,内核4.20+支持--no-collector.wifi:禁用不需要的采集器,降低资源消耗
3.1.2 Prometheus告警规则配置
# 文件路径:/etc/prometheus/rules/node_alerts.yml
groups:
-name:node_resource_alerts
interval:30s
rules:
# CPU使用率告警
-alert:HighCpuUsage
expr:|
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for:5m
labels:
severity:warning
annotations:
summary:"CPU使用率过高 (实例: {{ $labels.instance }})"
description:"CPU使用率持续5分钟超过85%,当前值: {{ $value | printf \"%.1f\" }}%"
# 内存使用率告警
-alert:HighMemoryUsage
expr:|
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
for:5m
labels:
severity:warning
annotations:
summary:"内存使用率过高 (实例: {{ $labels.instance }})"
description:"内存使用率持续5分钟超过90%,当前值: {{ $value | printf \"%.1f\" }}%"
# 磁盘空间告警
-alert:DiskSpaceLow
expr:|
(1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes) * 100 > 85
for:10m
labels:
severity:warning
annotations:
summary:"磁盘空间不足 (实例: {{ $labels.instance }})"
description:"磁盘 {{ $labels.mountpoint }} 使用率超过85%,当前值: {{ $value | printf \"%.1f\" }}%"
# 磁盘IO延迟告警
-alert:HighDiskLatency
expr:|
rate(node_disk_read_time_seconds_total[5m]) / rate(node_disk_reads_completed_total[5m]) * 1000 > 50
or
rate(node_disk_write_time_seconds_total[5m]) / rate(node_disk_writes_completed_total[5m]) * 1000 > 50
for:5m
labels:
severity:warning
annotations:
summary:"磁盘IO延迟过高 (实例: {{ $labels.instance }})"
description:"磁盘 {{ $labels.device }} IO延迟超过50ms"
# 系统负载告警
-alert:HighLoadAverage
expr:|
node_load15 / count without(cpu, mode) (node_cpu_seconds_total{mode="idle"}) > 1.5
for:15m
labels:
severity:warning
annotations:
summary:"系统负载过高 (实例: {{ $labels.instance }})"
description:"15分钟负载与CPU核心数比值超过1.5,当前值: {{ $value | printf \"%.2f\" }}"
# Swap使用告警
-alert:SwapUsageHigh
expr:|
(node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes * 100 > 50
for:10m
labels:
severity:warning
annotations:
summary:"Swap使用率过高 (实例: {{ $labels.instance }})"
description:"Swap使用率超过50%,可能存在内存压力,当前值: {{ $value | printf \"%.1f\" }}%"
3.2 实际应用案例
案例一:MySQL数据库服务器性能诊断
场景描述:生产环境MySQL服务器响应变慢,需要通过系统监控指标定位瓶颈。
诊断脚本:
#!/bin/bash
# 文件名:mysql_server_diagnosis.sh
# 功能:MySQL服务器性能快速诊断
echo"========== MySQL Server Performance Diagnosis =========="
echo"Time: $(date '+%Y-%m-%d %H:%M:%S')"
echo""
# 1. 系统负载检查
echo">>> System Load Average"
uptime
CORES=$(nproc)
LOAD1=$(awk '{print $1}' /proc/loadavg)
echo"CPU Cores: $CORES, Load/Core Ratio: $(echo "scale=2; $LOAD1/$CORES" | bc)"
echo""
# 2. CPU使用分布
echo">>> CPU Usage Distribution (5s sample)"
mpstat 1 5 | tail -1
echo""
# 3. 内存状态
echo">>> Memory Status"
free -h
echo""
echo"MySQL Process Memory:"
ps aux | grep -E "^mysql|^USER" | head -2
echo""
# 4. IO状态检查
echo">>> Disk IO Status"
iostat -xz 1 3 | grep -E "^Device|^sd|^nvme|^vd"
echo""
# 5. MySQL进程IO
echo">>> MySQL Process IO (requires root)"
if [ $(id -u) -eq 0 ]; then
iotop -b -n 3 -d 1 -P | grep -i mysql
else
echo"Skip: requires root privilege"
fi
echo""
# 6. Swap活动检查
echo">>> Swap Activity Check"
vmstat 1 5 | awk 'NR==1 || NR==2 || NR>2 {print}'
echo""
# 7. 网络连接状态
echo">>> MySQL Network Connections"
ss -tn state established '( dport = :3306 or sport = :3306 )' | wc -l
echo"Active MySQL connections: $(ss -tn state established '( dport = :3306 or sport = :3306 )' | wc -l)"
echo""
echo"========== Diagnosis Complete =========="
运行结果分析:
========== MySQL Server Performance Diagnosis ==========
Time: 2026-01-15 14:30:45
>>> System Load Average
14:30:45 up 120 days, 5:23, 3 users, load average: 8.52, 7.89, 6.45
CPU Cores: 8, Load/Core Ratio: 1.06
>>> CPU Usage Distribution (5s sample)
Average: all 2.34 0.00 12.56 0.00 45.67 0.12 1.23 0.00 38.08
>>> Memory Status
total used free shared buff/cache available
Mem: 62Gi 58Gi 512Mi 1.2Gi 3.8Gi 2.1Gi
Swap: 8.0Gi 2.3Gi 5.7Gi
>>> Disk IO Status
Device r/s w/s rkB/s wkB/s r_await w_await %util
sda 456.78 234.56 4567.8 2345.6 12.34 45.67 89.12
诊断结论:
- **CPU iowait高达45.67%**:表明存在严重IO等待,CPU大量时间消耗在等待磁盘
- 内存可用仅2.1GB:62GB总内存几乎耗尽,已开始使用Swap
- **磁盘利用率89.12%**:接近饱和,写延迟45.67ms远超正常值
- 根因判断:内存不足导致MySQL buffer pool无法完全缓存热数据,频繁磁盘读取造成IO瓶颈
优化建议:扩展内存至128GB,或优化MySQL innodb_buffer_pool_size配置
案例二:Web应用服务器CPU飙升排查
场景描述:Nginx+PHP-FPM架构的Web服务器CPU突然飙升至95%以上,需要快速定位问题进程。
排查步骤:
# 步骤1:查看整体CPU状态
top -bn1 | head -15
# 步骤2:按CPU排序查看进程
ps aux --sort=-%cpu | head -20
# 步骤3:查看PHP-FPM进程状态
ps aux | grep php-fpm | grep -v grep | wc -l
echo"PHP-FPM worker count: $(ps aux | grep 'php-fpm: pool' | wc -l)"
# 步骤4:检查是否存在异常进程
ps aux --sort=-%cpu | awk '$3>50 {print $0}'
# 步骤5:使用pidstat定位具体进程
pidstat -u 1 10 | sort -k8 -rn | head -20
实际输出:
# ps aux --sort=-%cpu | head -10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
www-data 23456 98.2 2.1 456789 123456 ? R 14:25 15:23 php-fpm: pool www
www-data 23457 95.6 2.0 456123 121234 ? R 14:25 14:56 php-fpm: pool www
www-data 23458 94.8 1.9 455678 119876 ? R 14:26 14:12 php-fpm: pool www
nginx 12345 5.2 0.3 98765 34567 ? S 09:00 2:34 nginx: worker
进一步分析:
# 使用strace追踪高CPU进程的系统调用
strace -c -p 23456 -f -e trace=all 2>&1 | head -30
# 查看进程打开的文件
ls -la /proc/23456/fd | wc -l
# 检查进程当前执行的PHP脚本
cat /proc/23456/cmdline
根因定位:通过strace发现进程在执行大量正则匹配操作,结合访问日志分析,确认是某个API接口存在正则表达式性能问题(ReDoS漏洞)。
四、最佳实践和注意事项
4.1 最佳实践
4.1.1 监控指标采集优化
合理的采集策略能够平衡监控精度与系统开销:
# 优化sysstat采集频率配置
# 文件:/etc/cron.d/sysstat
# 生产环境推荐:每分钟采集一次
*/1 * * * * root /usr/lib64/sa/sa1 1 1
# 每天23:53生成日报
53 23 * * * root /usr/lib64/sa/sa2 -A
采集频率建议:
- 实时告警指标:10-30秒采集间隔,用于快速故障发现
# Node Exporter采集性能优化
# 限制采集器数量,减少不必要的指标
node_exporter \
--collector.disable-defaults \
--collector.cpu \
--collector.meminfo \
--collector.diskstats \
--collector.filesystem \
--collector.loadavg \
--collector.netdev
4.1.2 告警阈值设置原则
避免告警风暴和漏报的关键在于合理的阈值设计:
4.1.3 监控数据保留策略
# Prometheus存储配置示例
# 文件:/etc/prometheus/prometheus.yml
global:
scrape_interval:15s
evaluation_interval:15s
storage:
tsdb:
path:/var/lib/prometheus/data
retention.time:30d# 原始数据保留30天
retention.size:100GB# 存储空间上限
# 配合Thanos实现长期存储
# 降采样后的数据可保留1年以上
4.2 注意事项
4.2.1 监控盲区规避
常见的监控盲区及应对策略:
- 短时峰值遗漏:采集间隔过长可能错过瞬时异常,关键指标建议10秒级采集
- 聚合数据失真:平均值掩盖极端情况,应同时监控P95/P99分位数
- 容器环境特殊性:cgroup限制下的资源视图与宿主机不同,需使用容器感知的采集方式
# 容器内正确获取CPU限制
cat /sys/fs/cgroup/cpu.max # cgroup v2
# 输出:100000 100000 表示可用100%的1个CPU核心
# 容器内正确获取内存限制
cat /sys/fs/cgroup/memory.max # cgroup v2
4.2.2 常见误区
4.2.3 虚拟化环境注意事项
虚拟机和容器环境下的监控存在特殊性:
# 检测是否运行在虚拟化环境
systemd-detect-virt
# 输出:kvm/vmware/xen/docker/lxc 等
# 虚拟机环境关注steal时间
mpstat 1 5 | awk '{print $NF}'# 查看%steal列
# 容器环境使用cAdvisor采集
docker run -d \
--name=cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
gcr.io/cadvisor/cadvisor:latest
五、故障排查和监控
5.1 故障排查
5.1.1 日志查看
# 查看系统日志(systemd环境)
journalctl -xe --no-pager | tail -100
# 按时间范围查看日志
journalctl --since "2026-01-15 10:00:00" --until "2026-01-15 12:00:00"
# 查看内核日志(OOM、硬件错误等)
dmesg -T | tail -50
# 查看OOM Killer记录
dmesg -T | grep -i "out of memory"
journalctl -k | grep -i oom
5.1.2 CPU问题排查
问题一:CPU使用率持续100%
# 诊断命令:定位高CPU进程
top -bn1 -o %CPU | head -15
# 查看进程线程级CPU使用
top -H -p $(pgrep -f "进程名")
# 使用perf分析热点函数
perf top -p $(pgrep -f "进程名")
解决方案:
- 用户态高:检查应用代码逻辑,使用profiler定位热点
- 内核态高:检查系统调用频率,可能存在锁竞争或驱动问题
问题二:iowait异常升高
# 诊断命令:确认IO等待来源
iostat -xz 1 5
# 定位产生IO的进程
iotop -o -b -n 5
# 查看进程IO详情
cat /proc/$(pgrep -f "进程名")/io
解决方案:
5.1.3 内存问题排查
问题一:OOM Killer触发
# 查看OOM事件详情
dmesg -T | grep -A 20 "Out of memory"
# 分析被杀进程
journalctl -k | grep -E "Killed process|oom-kill"
# 查看当前内存压力
cat /proc/pressure/memory
解决方案:
问题二:内存泄漏检测
# 监控进程内存增长趋势
pidstat -r 60 1440 > /tmp/mem_trend.log &
# 查看进程内存映射详情
pmap -x $(pgrep -f "进程名") | tail -1
# 使用smaps分析内存组成
cat /proc/$(pgrep -f "进程名")/smaps_rollup
5.2 性能监控
5.2.1 关键指标监控
# 综合性能监控脚本
#!/bin/bash
# 文件名:system_health_check.sh
echo"===== System Health Check ====="
echo"Time: $(date '+%Y-%m-%d %H:%M:%S')"
echo""
# CPU状态
echo"[CPU]"
mpstat 1 1 | tail -1 | awk '{printf "User: %.1f%% System: %.1f%% IOWait: %.1f%% Idle: %.1f%%\n", $3, $5, $6, $12}'
# 内存状态
echo"[Memory]"
free -h | awk 'NR==2 {printf "Total: %s Used: %s Available: %s\n", $2, $3, $7}'
# 磁盘IO
echo"[Disk IO]"
iostat -xz 1 1 | awk '/^[sv]d|^nvme/ {printf "%s: util=%.1f%% await=%.1fms\n", $1, $NF, $10}'
# 系统负载
echo"[Load]"
cat /proc/loadavg | awk '{printf "1min: %s 5min: %s 15min: %s\n", $1, $2, $3}'
5.2.2 监控指标说明
5.2.3 Grafana仪表盘配置
{
"dashboard": {
"title": "Linux System Metrics",
"panels": [
{
"title": "CPU Usage",
"type": "timeseries",
"targets": [
{
"expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
"legendFormat": "CPU Usage %"
}
]
},
{
"title": "Memory Usage",
"type": "gauge",
"targets": [
{
"expr": "(1 - node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes) * 100",
"legendFormat": "Memory %"
}
]
}
]
}
}
5.3 备份与恢复
5.3.1 监控数据备份策略
#!/bin/bash
# 文件名:prometheus_backup.sh
# 功能:Prometheus TSDB数据备份
BACKUP_DIR="/backup/prometheus"
DATA_DIR="/var/lib/prometheus/data"
DATE=$(date +%Y%m%d)
# 创建快照
curl -X POST http://localhost:9090/api/v1/admin/tsdb/snapshot
# 获取快照目录
SNAPSHOT=$(ls -t ${DATA_DIR}/snapshots/ | head -1)
# 压缩备份
tar -czf ${BACKUP_DIR}/prometheus_${DATE}.tar.gz \
-C ${DATA_DIR}/snapshots ${SNAPSHOT}
# 清理7天前的备份
find ${BACKUP_DIR} -name "prometheus_*.tar.gz" -mtime +7 -delete
# 清理快照
rm -rf ${DATA_DIR}/snapshots/${SNAPSHOT}
echo"Backup completed: prometheus_${DATE}.tar.gz"
5.3.2 恢复流程
# 1. 停止Prometheus服务
systemctl stop prometheus
# 2. 解压备份数据
tar -xzf /backup/prometheus/prometheus_20260115.tar.gz \
-C /var/lib/prometheus/data/
# 3. 验证数据完整性
promtool tsdb analyze /var/lib/prometheus/data/
# 4. 重启服务
systemctl start prometheus
# 5. 验证恢复结果
curl -s http://localhost:9090/api/v1/query?query=up | jq .
六、总结
6.1 技术要点回顾
- CPU监控核心:区分user/system/iowait/steal等时间维度,结合负载评估系统繁忙程度,iowait高需关注IO子系统
- 内存监控要点:使用MemAvailable而非MemFree评估可用内存,关注Swap活动作为内存压力信号
- IO监控关键:await延迟和util利用率是核心指标,NVMe设备需结合IOPS和吞吐量综合判断
- 工具链选择:基础监控使用vmstat/iostat/free,深度分析使用perf/eBPF,生产环境推荐Prometheus+Grafana体系
6.2 进阶学习方向
- 学习资源:BPF Performance Tools (Brendan Gregg著)
- 实践建议:从bcc工具集入手,逐步掌握bpftrace编写自定义追踪脚本
- 实践建议:结合Jaeger/Zipkin实现跨服务调用链追踪
- 实践建议:基于历史监控数据训练异常检测模型,实现智能告警
6.3 参考资料
- Linux Kernel Documentation - procfs - 内核官方procfs文档
- Brendan Gregg's Linux Performance - Linux性能分析权威资源
- Prometheus Documentation - Prometheus官方文档
- Node Exporter GitHub - Node Exporter项目主页
- sysstat Documentation - sysstat工具集文档
附录
A. 命令速查表
# CPU监控
mpstat -P ALL 1 5 # 查看各CPU核心使用率
pidstat -u 1 10 # 进程级CPU监控
perf top # 实时热点函数分析
# 内存监控
free -h # 内存使用摘要
vmstat 1 10 # 内存和Swap活动
pmap -x <pid> # 进程内存映射
# 磁盘IO监控
iostat -xz 1 5 # 磁盘IO统计
iotop -o # 进程级IO监控
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT # 块设备列表
# 系统综合
top -bn1 # 系统概览快照
htop # 交互式进程监控
sar -A # 历史性能数据
dmesg -T | tail -50 # 内核日志
B. /proc文件系统关键文件
C. 术语表
| | |
|---|
| | 运行队列中等待CPU的平均任务数,反映系统繁忙程度 |
| | |
| | |
| | |
| | |
| Pressure Stall Information | |
| I/O Operations Per Second | |
| | |
| | |
| | |