nmon 监控工具
轻量级性能监控工具 nmon 的使用方法。可参见:nmon 官网
1 工具简介
nmon(Nigel’s Monitor)是一款广泛应用于 AIX 和 Linux 系统的轻量级性能监控与分析工具。其核心优势体现在:
- 极低开销:运行期间 CPU 占用率通常低于 2%,对被测系统干扰极小。
- 维度全面:实时覆盖 CPU、内存、磁盘 I/O、网络流量、内核统计及进程详情等关键指标。
- 数据留存:支持将监控结果导出为
.nmon文件,配合配套工具进行离线绘图与深度分析,是性能压测和日常运维的利器。
2 参数详解
在命令行启动 nmon 时,可通过以下开关参数控制其行为:
- -f:核心参数。开启文件记录模式,默认生成
[主机名]_[日期]_[时间].nmon文件。 - -s [秒]:设定采样间隔(如
-s 5表示每 5 秒采集一次数据)。 - -c [次数]:设定采样总次数(如
-c 120)。 - -t:在输出文件中包含 Top Processes(资源消耗排名前列的进程统计)。
- -m [目录]:指定输出文件的存储路径。
- -F [文件名]:手动指定输出文件的名称,覆盖默认命名规则。
- -p:启动时在标准输出中打印 nmon 的进程 PID,便于后续通过脚本管理或停止进程。
3 模式用法
nmon 提供三种经典模式,分别对应实时观测、离线分析与自动化运维场景。
3.1 实时监控模式(交互式)
适用于即时性能排查,快速定位当前的资源瓶颈。
- 启动命令:直接输入
nmon。 - 核心快捷键(按键即可切换显示/隐藏):
- C:显示CPU详细信息,包括用户态、系统态、等待态、空闲态利用率等核心数据。
- D:显示磁盘读写状态、IO吞吐量等磁盘相关指标。
- T:显示系统进程列表,同步展示各进程的CPU、内存消耗情况。
- M:显示内存使用详情,涵盖可用内存、缓存大小、交换分区占用率等信息。
- N:显示网络流量、连接状态等网络相关数据。
- H:查看完整快捷键列表,可按需调取更多监控指标。
- 退出方式:按
q键退出。
3.2 后台记录模式(非交互式)
适用于性能测试或长时间压测,旨在留存数据供后续分析。
- 核心命令:
# nmon -f -s 10 -c 360 - 执行效果:每 10 秒采样一次,共采集 360 次,总计监控 1 小时。命令执行后会立即返回 shell,nmon 在后台运行。
- 管理进程:
- 若启动时加了
-p,可根据返回的 PID 直接处理。 - 手动停止:执行
ps -ef | grep nmon找到进程 ID,随后使用kill -USR2 <PID>优雅停止(此时会确保数据完整写入文件)。
- 若启动时加了
- 文件生成:监控文件默认保存在
nmon命令所执行的目录,文件名遵循主机名\_年月日\_时分.nmon规则,例如localhost_20260114_1530.nmon。
3.3 定期监控模式(运维常态化)
通过 crontab 实现定时任务,用于长期跟踪系统健康状况。
- 任务配置:执行
crontab -e并添加以下行:0 8 * * 1-5 /usr/bin/nmon -f -s 30 -c 1200 -m /var/nmon/logs/ - 策略解析:
- 周期:周一至周五,每天早上 8:00 准时启动。
- 时长:每 30 秒采样,持续 1200 次,覆盖 10 小时工作时间(至 18:00)。
- 存储:统一存放至
/var/nmon/logs/目录下(需预先手动创建目录)。
4 分析工具
采集生成 .nmon 原始数据文件后,需借助专用工具将其转化为直观图表,便于分析解读。以下推荐三款实用工具,优先推荐前两款:
-
Nmonchart:
- 特点:工具体积极轻量,生成基于网页的交互式图表,操作简单高效。
- 依赖:需提前安装ksh解释器。
- 使用:
./nmonchart input_file.nmon output_file.html
-
pyNmonAnalyzer:
-
特点:支持批量生成HTML图表或CSV数据文件,适配自动化分析场景。
-
依赖:Python环境及对应的绘图库。
-
使用:
生成HTML报告:
pyNmonAnalyzer -b -o report_dir -i test.nmon生成CSV表格:
pyNmonAnalyzer -c -o data_dir -i test.nmon
-
-
nmon Analyzer (Excel版):经典的 Excel 宏工具,虽然传统,但其生成的报表在分析 CPU 跨核心分布和 I/O 波动方面非常详尽。
5 案例实战
模拟随机CPU负载,使用nmon监控系统资源,并通过分析工具生成报告。
5.1 准备模拟程序
使用以下 C++ 代码生成随机的 CPU 压力脉冲:
// 编译:g++ cpu_load.cpp -o cpu_load -lpthread
#include <iostream>
#include <vector>
#include <thread>
#include <cmath>
#include <chrono>
#include <random> // 引入随机数库
void consume_cpu_random(int thread_id) {
// 每个线程拥有独立的随机数生成器,避免竞争
std::random_device rd;
std::mt19937 gen(rd());
// 定义随机范围:工作 100ms~2000ms,休眠 100ms~1000ms
std::uniform_int_distribution<> work_dist(100, 2000);
std::uniform_int_distribution<> sleep_dist(100, 1000);
while (true) {
int work_ms = work_dist(gen);
int sleep_ms = sleep_dist(gen);
// --- 随机工作阶段 ---
auto start = std::chrono::steady_clock::now();
double x = 1.2345;
while (std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - start).count() < work_ms) {
for (int i = 0; i < 500; ++i) {
x = std::sin(x) * std::cos(x) + std::sqrt(x + 1.0); // 增加计算复杂度
}
}
// --- 随机休眠阶段 ---
std::this_thread::sleep_for(std::chrono::milliseconds(sleep_ms));
}
}
int main() {
unsigned int n = std::thread::hardware_concurrency();
std::cout << "随机负载模拟器已启动,核心数: " << n << std::endl;
std::cout << "负载特征:随机脉冲工作 + 随机间歇休眠" << std::endl;
std::vector<std::thread> threads;
for (unsigned int i = 0; i < n; ++i) {
threads.emplace_back(consume_cpu_random, i);
}
for (auto& t : threads) t.join();
return 0;
}
5.2 监控流程:
启动负载:运行 ./cpu_load。
启动监控:执行 nmon -f -s 1 -c 60 -p > nmon.pid(每秒采样,持续 1 分钟)。
生成报告:监控结束后,执行 ./nmonchart *.nmon report.html。
结果分析:打开 report.html,可以观察到 CPU 利用率曲线呈现出与代码逻辑一致的“锯齿状”脉冲特征,从而验证 nmon 对突发负载的捕获能力。