系统监控工具指南 / 第10章:dstat与nmon
第10章:dstat与nmon
10.1 概述
工具定位
| 工具 | 全称 | 主要用途 |
|---|---|---|
| dstat | Disk Statistics | 多维度系统监控,替代vmstat/iostat/netstat |
| nmon | Nigel’s Monitor | 系统性能监控,支持交互和批处理 |
为什么选择这两个工具
- dstat - 多维度实时监控,插件丰富,CSV导出
- nmon - 交互式界面,详细报告,适合AIX/Linux
与其他工具对比
| 特性 | dstat | nmon | vmstat | iostat |
|---|---|---|---|---|
| CPU监控 | ✓ | ✓ | ✓ | ✗ |
| 内存监控 | ✓ | ✓ | ✓ | ✗ |
| 磁盘监控 | ✓ | ✓ | ✓ | ✓ |
| 网络监控 | ✓ | ✓ | ✗ | ✗ |
| CSV导出 | ✓ | ✓ | ✗ | ✗ |
| 插件系统 | ✓ | ✗ | ✗ | ✗ |
| 交互界面 | ✗ | ✓ | ✗ | ✗ |
10.2 dstat详解
10.2.1 安装
# Debian/Ubuntu
sudo apt update
sudo apt install dstat
# CentOS/RHEL
sudo yum install dstat
# Fedora
sudo dnf install dstat
# Arch Linux
sudo pacman -S dstat
# pip安装
pip install dstat
10.2.2 基本用法
# 默认输出(CPU、磁盘、网络、分页、系统)
dstat
# 每2秒刷新,共10次
dstat 2 10
# 持续监控
dstat 1
10.2.3 输出解读
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
5 2 92 1 0 0| 123k 456k| 0 0 | 0 0 | 234 1234
8 3 88 1 0 0| 234k 567k| 123k 456k| 0 0 | 345 2345
6 2 91 1 0 0| 345k 678k| 234k 567k| 0 0 | 456 3456
字段详解:
| 面板 | 字段 | 含义 |
|---|---|---|
| total-cpu-usage | usr | 用户空间 |
| sys | 内核空间 | |
| idl | 空闲 | |
| wai | IO等待 | |
| hiq | 硬件中断 | |
| siq | 软件中断 | |
| dsk/total | read | 磁盘读取 |
| writ | 磁盘写入 | |
| net/total | recv | 网络接收 |
| send | 网络发送 | |
| paging | in | 页面换入 |
| out | 页面换出 | |
| system | int | 中断数 |
| csw | 上下文切换 |
10.2.4 常用选项
CPU选项:
dstat -c # CPU统计
dstat -C 0,1,total # 指定CPU核心
磁盘选项:
dstat -d # 磁盘统计
dstat -D sda,sdb # 指定磁盘
网络选项:
dstat -n # 网络统计
dstat -N eth0,eth1 # 指定接口
内存选项:
dstat -m # 内存统计
dstat -g # 页面统计
dstat -s # Swap统计
系统选项:
dstat -y # 系统统计(中断/上下文切换)
dstat -l # 负载统计
dstat -p # 进程统计
输出选项:
dstat --output output.csv # 输出到CSV
dstat -t # 带时间戳
dstat --nocolor # 无颜色
10.2.5 高级选项
组合选项:
# CPU + 磁盘 + 网络
dstat -c -d -n
# 所有统计
dstat -cdnmsgypl
# 指定间隔和次数
dstat -cdn 2 10
输出格式:
# CSV格式
dstat --output output.csv
# 带时间戳
dstat -t --output output.csv
# 无颜色(适合文件输出)
dstat --nocolor --output output.csv
10.2.6 插件系统
查看可用插件:
dstat --list
常用插件:
# CPU详细信息
dstat --cpu-adv
# 磁盘详细信息
dstat --disk-adv
# 网络详细信息
dstat --net-adv
# 内存详细信息
dstat --mem-adv
# top CPU消耗进程
dstat --top-cpu
# top 内存消耗进程
dstat --top-mem
# top IO消耗进程
dstat --top-io
# top 延迟进程
dstat --top-latency
# 电池状态
dstat --battery
# 温度
dstat --thermal
# NFS统计
dstat --nfs3
插件组合:
# CPU + 磁盘 + top进程
dstat -c -d --top-cpu --top-io
# 网络 + 内存 + top进程
dstat -n -m --top-mem
# 全面监控
dstat -cdnmsg --top-cpu --top-mem --top-io
10.2.7 CSV导出
基本导出:
# 导出到CSV
dstat --output /tmp/dstat.csv
# 带时间戳
dstat -t --output /tmp/dstat.csv
# 指定间隔
dstat -cdn 5 --output /tmp/dstat.csv
高级导出:
# 导出5分钟数据,每秒采样
dstat -cdn -t 1 300 --output /tmp/dstat_5min.csv
# 后台运行
nohup dstat -cdn -t 60 --output /tmp/dstat_hourly.csv &
CSV分析:
# 查看CSV文件
head -20 /tmp/dstat.csv
# 使用awk分析
awk -F',' '{print $1, $2}' /tmp/dstat.csv
# 使用Python分析
python3 << EOF
import pandas as pd
df = pd.read_csv('/tmp/dstat.csv', skiprows=5)
print(df.describe())
EOF
10.2.8 实战场景
场景1:CPU瓶颈分析
# 监控CPU和IO
dstat -c -d --top-cpu --top-io
场景2:内存使用监控
# 监控内存和Swap
dstat -m -s --top-mem
场景3:网络流量分析
# 监控网络流量
dstat -n -N eth0,total
场景4:磁盘IO分析
# 监控磁盘IO
dstat -d -D sda,total --top-io
场景5:性能基准测试
# 记录10分钟性能数据
dstat -cdnmsg -t 1 600 --output /tmp/benchmark.csv
10.3 nmon详解
10.3.1 安装
# Debian/Ubuntu
sudo apt update
sudo apt install nmon
# CentOS/RHEL
sudo yum install nmon
# Fedora
sudo dnf install nmon
# Arch Linux
sudo pacman -S nmon
# 从源码编译
wget http://sourceforge.net/projects/nmon/files/nmon16e_x86.tar.gz
tar xzf nmon16e_x86.tar.gz
chmod +x nmon16e_x86_linux
sudo mv nmon16e_x86_linux /usr/local/bin/nmon
10.3.2 基本使用
# 交互式界面
nmon
# 后台采集模式
nmon -f -s 10 -c 360
# 参数说明
# -f: 输出到文件
# -s 10: 每10秒采集一次
# -c 360: 采集360次(共1小时)
10.3.3 交互界面
┌───────────────────────────────────────────────────────────────────────┐
│ nmon - [H for help] 14:32:15 │
├───────────────────────────────────────────────────────────────────────┤
│ CPU │ Memory │ Disk │ Network │ Top Processes │
│ ┌───┐ │ ┌─────┐ │ ┌───┐ │ ┌─────┐ │ ┌───────────────────────┐ │
│ │███│ │ │████ │ │ │██ │ │ │████ │ │ │ PID CPU% MEM% CMD │ │
│ │███│ │ │████ │ │ │██ │ │ │████ │ │ │ 1234 45.2 12.3 nginx│ │
│ │███│ │ │████ │ │ │██ │ │ │████ │ │ │ 5678 23.1 34.5 mysqld│ │
│ └───┘ │ └─────┘ │ └───┘ │ └─────┘ │ └───────────────────────┘ │
└───────────────────────────────────────────────────────────────────────┘
交互命令:
| 按键 | 功能 |
|---|---|
h | 帮助 |
q | 退出 |
c | CPU统计 |
m | 内存统计 |
d | 磁盘统计 |
n | 网络统计 |
k | 内核统计 |
j | 文件系统 |
t | top进程 |
l | 长期CPU |
. | 只显示忙碌磁盘 |
+ | 增加刷新间隔 |
- | 减少刷新间隔 |
0 | 重置峰值 |
10.3.4 详细统计
CPU统计:
# 按c显示CPU
# 显示每个CPU核心的使用率
内存统计:
# 按m显示内存
# 显示物理内存、虚拟内存、Swap
磁盘统计:
# 按d显示磁盘
# 显示每个磁盘的读写速率、使用率
网络统计:
# 按n显示网络
# 显示每个接口的流量
Top进程:
# 按t显示top进程
# 显示CPU/内存消耗最高的进程
10.3.5 批处理模式
采集数据:
# 采集1小时数据,每10秒一次
nmon -f -s 10 -c 360
# 采集24小时数据,每60秒一次
nmon -f -s 60 -c 1440
# 采集到指定文件
nmon -f -s 10 -c 360 -F /tmp/perf.nmon
参数说明:
| 参数 | 含义 | 示例 |
|---|---|---|
-f | 输出到文件 | nmon -f |
-s | 采集间隔(秒) | -s 10 |
-c | 采集次数 | -c 360 |
-F | 指定文件名 | -F perf.nmon |
-t | 包含top进程 | -t |
-T | 包含线程 | -T |
-d | 磁盘统计 | -d |
-g | 用户定义组 | -g group |
10.3.6 输出文件
文件命名:
# 默认命名格式
hostname_YYMMDD_HHMM.nmon
# 示例
server1_260510_1432.nmon
文件位置:
# 默认在当前目录
ls *.nmon
# 指定位置
nmon -f -F /var/log/nmon/perf.nmon
文件内容:
# 查看nmon文件
head -100 hostname_YYMMDD_HHMM.nmon
# 包含以下部分
# CPU_ALL - CPU统计
# MEM - 内存统计
# DISKREAD - 磁盘读
# DISKWRITE - 磁盘写
# NET - 网络统计
# TOP - top进程
10.3.7 数据分析工具
nmon analyser(Excel):
1. 下载nmon analyser Excel模板
2. 将.nmon文件导入Excel
3. 自动生成图表和报告
nmonchart:
# 安装
pip install nmonchart
# 生成HTML图表
nmonchart hostname_YYMMDD_HHMM.nmon
# 生成的HTML文件可以在浏览器中查看
nmon2web:
# 安装
git clone https://github.com/agoel00/nmon2web.git
cd nmon2web
pip install -r requirements.txt
# 生成Web报告
python nmon2web.py hostname_YYMMDD_HHMM.nmon
10.3.8 定时采集
cron配置:
# 编辑crontab
crontab -e
# 每天凌晨1点开始采集24小时数据
0 1 * * * /usr/bin/nmon -f -s 60 -c 1440 -F /var/log/nmon/$(hostname)_$(date +\%Y\%m\%d).nmon
# 每小时采集10分钟数据
0 * * * * /usr/bin/nmon -f -s 10 -c 60 -F /var/log/nmon/$(hostname)_$(date +\%Y\%m\%d_\%H).nmon
systemd服务:
# /etc/systemd/system/nmon.service
[Unit]
Description=NMON Performance Monitor
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/nmon -f -s 60 -c 1440 -F /var/log/nmon/%H_%Y%m%d.nmon
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
# 启用服务
sudo systemctl enable nmon
sudo systemctl start nmon
10.3.9 高级配置
自定义统计项:
# 只采集CPU和内存
nmon -f -s 10 -c 360 -c -m
# 只采集磁盘
nmon -f -s 10 -c 360 -d
# 只采集网络
nmon -f -s 10 -c 360 -n
包含线程信息:
nmon -f -s 10 -c 360 -T
包含top进程:
nmon -f -s 10 -c 360 -t
10.3.10 实战场景
场景1:长期性能监控
# 采集24小时数据
nmon -f -s 60 -c 1440 -F /var/log/nmon/perf_24h.nmon
# 分析数据
nmonchart /var/log/nmon/perf_24h.nmon
场景2:性能基准测试
# 采集10分钟数据
nmon -f -s 1 -c 600 -F /tmp/benchmark.nmon
# 运行测试
./benchmark_test
# 分析结果
nmonchart /tmp/benchmark.nmon
场景3:问题排查
# 采集1小时数据
nmon -f -s 10 -c 360 -F /tmp/troubleshoot.nmon
# 复现问题
# ...
# 分析数据
nmonchart /tmp/troubleshoot.nmon
场景4:容量规划
# 每天采集数据
# cron: 0 0 * * * nmon -f -s 60 -c 1440 -F /var/log/nmon/$(date +\%Y\%m\%d).nmon
# 月度分析
# 分析每天的数据,识别趋势
10.4 dstat vs nmon对比
| 特性 | dstat | nmon |
|---|---|---|
| 界面 | 终端文本 | 交互式 |
| 实时监控 | ✓ | ✓ |
| 历史数据 | CSV | nmon文件 |
| 插件系统 | ✓ | ✗ |
| 图表生成 | ✗ | ✓ |
| 资源消耗 | 低 | 低 |
| 适用场景 | 实时监控 | 历史分析 |
选择建议
选择dstat:
- 需要实时监控
- 需要插件扩展
- 需要CSV导出
- 轻量级需求
选择nmon:
- 需要历史分析
- 需要图表报告
- AIX/Linux混合环境
- 长期数据采集
10.5 综合应用
10.5.1 dstat + nmon组合
# 实时监控用dstat
dstat -cdn --top-cpu --top-io
# 历史数据用nmon
nmon -f -s 60 -c 1440
# 结合使用
# dstat用于实时排查
# nmon用于长期记录
10.5.2 自动化脚本
#!/bin/bash
# perf_monitor.sh
LOG_DIR="/var/log/performance"
mkdir -p $LOG_DIR
# 启动nmon(后台记录)
nmon -f -s 60 -c 1440 -F $LOG_DIR/$(hostname)_$(date +%Y%m%d).nmon
# 启动dstat(实时显示)
dstat -cdn --top-cpu --top-io
10.5.3 数据整合
#!/bin/bash
# perf_report.sh
# 收集dstat数据
dstat -cdn -t 1 60 --output /tmp/dstat.csv
# 收集nmon数据
nmon -f -s 1 -c 60 -F /tmp/perf.nmon
# 生成报告
nmonchart /tmp/perf.nmon /tmp/report.html
echo "报告生成完成: /tmp/report.html"
10.6 性能开销
| 工具 | CPU占用 | 内存占用 | 磁盘占用 |
|---|---|---|---|
| dstat | <1% | <10MB | 取决于输出 |
| nmon | <1% | <10MB | ~1MB/小时 |
10.7 故障排查
问题1:dstat命令未找到
# 检查是否安装
which dstat
# 安装
sudo apt install dstat # Debian/Ubuntu
sudo yum install dstat # CentOS/RHEL
问题2:nmon输出文件为空
# 检查权限
ls -la /var/log/nmon/
# 手动运行测试
nmon -f -s 1 -c 10
# 检查输出
ls -la *.nmon
问题3:dstat插件不可用
# 列出可用插件
dstat --list
# 检查插件路径
ls /usr/share/dstat/
问题4:nmon文件分析失败
# 检查文件完整性
head -20 perf.nmon
# 使用nmonchart
nmonchart perf.nmon
# 检查错误
nmonchart perf.nmon 2>&1 | grep error
10.8 扩展阅读
10.9 快速参考
dstat快速参考
# 基本用法
dstat # 默认统计
dstat 2 10 # 2秒间隔,10次
dstat -cdn # CPU、磁盘、网络
# 详细统计
dstat --cpu-adv # CPU详细
dstat --disk-adv # 磁盘详细
dstat --net-adv # 网络详细
# Top进程
dstat --top-cpu # top CPU进程
dstat --top-mem # top 内存进程
dstat --top-io # top IO进程
# 输出
dstat --output file.csv # CSV输出
dstat -t # 带时间戳
dstat --nocolor # 无颜色
nmon快速参考
# 交互模式
nmon # 启动交互界面
# 批处理模式
nmon -f # 输出到文件
nmon -f -s 10 -c 360 # 10秒间隔,360次
nmon -f -F perf.nmon # 指定文件名
# 交互键
h # 帮助
q # 退出
c # CPU
m # 内存
d # 磁盘
n # 网络
t # top进程
10.10 本章小结
本章详细介绍了dstat和nmon的使用:
dstat - 多维度实时监控
- 替代vmstat/iostat/netstat
- 插件系统扩展
- CSV导出功能
- 轻量级实时监控
nmon - 系统性能监控
- 交互式界面
- 批处理数据采集
- 图表报告生成
- 长期历史分析
综合应用:
- 实时监控:dstat
- 历史分析:nmon
- 组合使用效果最佳
实战场景:
- 性能基准测试
- 问题排查
- 容量规划
dstat适合实时监控,nmon适合历史分析,两者结合使用能满足大多数监控需求。
上一章: 第9章:Glances详解 下一章: 第11章:Docker容器监控