1. Linux服务器利用率监控全指南
作为运维工程师,我们每天都要面对这样的灵魂拷问:服务器到底跑得怎么样?CPU是不是在摸鱼?内存有没有偷偷吃紧?磁盘IO是不是在暗中较劲?今天我就结合10年运维经验,手把手教你用Linux自带工具把服务器扒个底朝天。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心监控指标解析
2.1 CPU利用率:不只是看百分比
top命令的%Cpu(s)行里:
- us:用户态CPU时间(重点监控)
- sy:内核态CPU时间(超过20%要警惕)
- wa:IO等待时间(磁盘瓶颈的晴雨表)
- id:空闲时间(看起来美好但可能暗藏玄机)
经验之谈:当wa值持续>30%,说明磁盘IO已经成为瓶颈,这时候加CPU根本没用,得先解决存储性能问题。
2.2 内存使用:free -h背后的真相
code复制$ free -h
total used free shared buff/cache available
Mem: 62G 5.2G 512M 1.3G 56G 55G
Swap: 8.0G 1.2G 6.8G
关键看available列,这才是真正可用的内存。Linux会主动用空闲内存做磁盘缓存(buff/cache),所以free值小不用慌。
2.3 磁盘IO:iostat的火眼金睛
code复制$ iostat -x 1
Device r/s w/s rkB/s wkB/s await svctm %util
vda 0.00 5.00 0.00 28.00 0.20 0.20 0.10
重点关注:
- %util:设备繁忙百分比(超过80%告警)
- await:IO平均响应时间(ms)
- svctm:IO服务时间(应该<await)
3. 高级监控三板斧
3.1 vmstat:系统健康快照
code复制$ vmstat 1
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 1248256 526304 102332 58472236 0 0 0 5 0 1 3 1 96 0 0
关键指标:
- r:运行队列长度(超过CPU核数说明饱和)
- b:阻塞进程数
- si/so:交换区换入换出(非零说明内存不足)
3.2 sar:历史数据回溯
code复制$ sar -u 1 3
Linux 3.10.0-1160.el7.x86_64 (hostname) 2024年03月15日 _x86_64_ (32 CPU)
15时30分01秒 CPU %user %nice %system %iowait %steal %idle
15时30分02秒 all 3.02 0.00 0.88 0.00 0.00 96.09
安装:yum install sysstat(CentOS)或apt install sysstat(Ubuntu)
3.3 dstat:全能型选手
code复制$ dstat -tcmnd --disk-util
----system---- ----total-cpu-usage---- ------memory-usage----- -net/total- -dsk/total-
time |usr sys idl wai hiq siq| used buff cach free| recv send| read writ
15-03 15:30:01| 3 1 96 0 0 0|5583M 100M 55G 512M| 0 0 | 0.0 5.0
彩色显示+实时刷新,支持插件扩展,我的最爱!
4. 生产环境实战技巧
4.1 快速定位CPU瓶颈
code复制$ ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
PID PPID CMD %MEM %CPU
12345 1 /usr/lib/jvm/java-11-openj 12.3 180
配合top -H -p [PID]查看具体线程,再用jstack分析Java线程栈(如果是Java应用)。
4.2 内存泄漏排查流程
free -h观察内存变化趋势vmstat 3看si/so是否持续增加smem -s swap -r找出占用swap最多的进程pmap -x [PID]分析进程内存分布
4.3 磁盘IO问题定位
code复制$ iotop -oP
Total DISK READ: 0.00 B/s | Total DISK WRITE: 29.89 K/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
456 be/4 mysql 0.00 B/s 28.00 K/s 0.00 % 1.23 % mysqld
5. 监控数据可视化方案
5.1 使用Grafana+Prometheus
- 安装node_exporter采集数据
- Prometheus配置抓取规则
- Grafana导入Linux监控仪表盘(ID:8919)
5.2 轻量级方案:Glances
code复制$ pip install glances
$ glances
WEB版访问:glances -w,支持REST API和告警规则。
6. 性能调优黄金法则
- 先监控再优化,没有数据支撑的优化都是耍流氓
- 遵循USE法则(Utilization、Saturation、Errors)
- 一次只改一个参数,改完立即验证效果
- 优先解决瓶颈最严重的子系统
- 记得记录每次变更和对应效果
血泪教训:曾经有台服务器CPU利用率长期100%,各种调优无效,最后发现是BIOS里开了节能模式...
7. 常用命令速查表
| 监控目标 | 基础命令 | 进阶命令 | 关键指标 |
|---|---|---|---|
| CPU | top | pidstat | us% >70% |
| 内存 | free | smem | available |
| 磁盘 | df | iotop | %util |
| 网络 | iftop | nethogs | RX/TX |
| 综合 | vmstat | dstat | 多维度 |
8. 避坑指南
- 不要迷信
free -h的free值,要看available - CPU负载高不一定是计算型任务,可能是IO等待(wa)
- 容器环境要用
docker stats或cAdvisor - 云服务器要注意厂商的监控指标(如阿里云的CloudMonitor)
- 长期运行
top时记得用-b批处理模式
最后分享我的监控脚本模板:
bash复制#!/bin/bash
LOG_DIR=/var/log/server_monitor
mkdir -p $LOG_DIR
# 记录时间戳
date > $LOG_DIR/monitor.log
# 基础监控
echo "===== CPU TOP10 =====" >> $LOG_DIR/monitor.log
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 10 >> $LOG_DIR/monitor.log
echo "===== MEM TOP10 =====" >> $LOG_DIR/monitor.log
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -n 10 >> $LOG_DIR/monitor.log
# 系统状态
echo "===== VMSTAT =====" >> $LOG_DIR/monitor.log
vmstat 1 5 >> $LOG_DIR/monitor.log
echo "===== IOSTAT =====" >> $LOG_DIR/monitor.log
iostat -x 1 5 >> $LOG_DIR/monitor.log
