在生产环境运行 Ubuntu 服务器时,及时、准确地监控 CPU、内存、磁盘三大核心资源的使用情况,是避免性能瓶颈、提前发现异常、规划扩容的基础。本文按“实时查看 → 历史趋势 → 自动化监控”三个层次,介绍最实用、最常使用的监控方法,适用于 22.04 / 24.04 LTS 及后续版本。
一、实时监控
这些命令适合 SSH 登录后立即执行,判断服务器当前是否“健康”。
1. CPU 使用情况
- top / htop(最常用)
- top:系统自带,按 1 显示每个核心使用率,按 P 按 CPU 排序
- htop:强烈推荐提前安装(sudo apt install htop),界面友好,支持鼠标、颜色、树形进程
- 关注指标:%Cpu(s) 的 us(用户)、sy(系统)、id(空闲)、wa(IO 等待)
- mpstat(查看每个核心)text
sudo apt install sysstat mpstat 1 5 # 每秒刷新一次,共 5 次 - vmstat(简洁概览) vmstat 1 # 每秒刷新,关注 cpu 列的 us/sy/id/wa
2. 内存使用情况
- free -h(最直观) 重点看 available 列(真正可用的内存),而非 free 列 Swap 使用率 > 10% 通常说明内存压力大
- vmstat(内存列 si/so 表示换入/换出) vmstat 1 # si/so 持续 > 0 说明频繁 swap,很危险
- smem(更精确的用户/进程内存占用,需安装 sudo apt install smem)
3. 磁盘性能(I/O 等待 + 使用率)
- iostat(最核心磁盘 IO 工具)text
iostat -x 1 5 # -x 显示扩展统计,每秒一次,共 5 次关注指标:
- %util:磁盘利用率(接近 100% 表示瓶颈)
- await:平均每个 IO 的等待时间(> 10ms 偏高,> 20ms 很严重)
- r/s、w/s:读写 IOPS
- rkB/s、wkB/s:吞吐量
- iotop(类似 top 的磁盘 IO 版) sudo apt install iotop sudo iotop -o # 只显示有 IO 的进程
- df -h / df -i 空间使用率和 inode 使用率(inode 满会导致“磁盘已满但 du 看不出来”)
二、历史趋势与周期性数据(sysstat 套件)
sysstat 是 Ubuntu 上最经典的性能历史记录工具,安装后自动采集 sar 数据。
安装:
Bash
sudo apt install sysstat
sudo systemctl enable --now sysstat常用 sar 命令(历史数据):
| 命令 | 含义 | 关注指标 |
|---|---|---|
| sar -u 1 5 | CPU 使用率(实时) | %user %system %idle %iowait |
| sar -u | 当天 CPU 历史 | 看高峰期 %iowait 是否高 |
| sar -r | 内存使用历史 | %memused kbmemfree kbbuffers kbscached |
| sar -d | 磁盘 IO 历史 | await svctm %util |
| sar -n DEV 1 5 | 网卡流量 | rxkB/s txkB/s |
| sar -q | 负载平均值与运行队列 | runq-sz ldavg-1 ldavg-5 |
小技巧:把 sar 做成每日邮件报告(cron 任务):
Bash
0 8 * * * /usr/bin/sar -u -r -q -n DEV | mail -s "服务器性能日报" your@email.com三、推荐的现代化一键监控方案(生产首选)
1. netdata(最推荐,安装即用)
- 一键安装:Bash
bash <(curl -Ss https://my-netdata.io/kickstart.sh) - 特点:
- 浏览器访问 http://你的IP:19999
- 实时 + 历史(默认保留几天到几个月)
- CPU、内存、磁盘 IO、网卡、进程、温度、Docker 等全覆盖
- 告警功能强大(可接 Slack、邮件、微信)
- 资源占用极低(<1% CPU)
2. prometheus + node_exporter + grafana
适合多台服务器统一监控:
- node_exporter 采集指标
- prometheus 存储 + 查询
- grafana 做漂亮仪表盘
3. 极简脚本监控(适合小型环境)
写一个 shell 脚本,每分钟跑一次,达到阈值发邮件/企业微信:
Bash
#!/bin/bash
LOAD=$(uptime | awk '{print $(NF-2)}' | tr -d ',')
MEM_USED=$(free -m | awk '/Mem/{printf("%.0f"), $3/$2*100}')
DISK_USED=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
if [ ${LOAD%.*} -gt 8 ] || [ $MEM_USED -gt 85 ] || [ ${DISK_USED%?} -gt 90 ]; then
echo "警报!负载:$LOAD 内存:$MEM_USED% 磁盘:$DISK_USED%" | mail -s "服务器资源告警" ops@company.com
fi四、性能监控黄金排查顺序
服务器变慢/卡顿时,按以下顺序 1 分钟内初步定位:
- uptime → 负载是否 > 核心数 × 1.5–2
- free -h → available 内存 < 总内存 20%?
- vmstat 1 5 → wa(iowait)是否持续 > 20–30%?
- iostat -x 1 5 → 磁盘 %util 是否接近 100%?await 是否 > 10–20ms?
- top/htop → 前几名进程是否异常吃 CPU/内存?
- sar -u -r -d(历史)→ 对比平时高峰值
五、总结:不同规模的监控选择
| 服务器规模 | 推荐方案 | 复杂度 | 成本 |
|---|---|---|---|
| 1–5 台 | netdata(单机版) | 低 | 几乎 0 |
| 5–50 台 | netdata(父子云)或 prometheus+grafana | 中 | 低–中 |
| 50+ 台 | prometheus + grafana + alertmanager | 高 | 中–高 |
无论规模,先把 netdata 装上,能覆盖 90% 的日常监控需求。熟练掌握 sar / iostat / vmstat 后,你就能从“感觉卡”变成“数据说话”,大大提升故障定位效率。