目录

nmon 监控工具

轻量级性能监控工具 nmon 的使用方法。可参见:nmon 官网

nmon(Nigel’s Monitor)是一款广泛应用于 AIX 和 Linux 系统的轻量级性能监控与分析工具。其核心优势体现在:

  • 极低开销:运行期间 CPU 占用率通常低于 2%,对被测系统干扰极小。
  • 维度全面:实时覆盖 CPU、内存、磁盘 I/O、网络流量、内核统计及进程详情等关键指标。
  • 数据留存:支持将监控结果导出为 .nmon 文件,配合配套工具进行离线绘图与深度分析,是性能压测和日常运维的利器。

在命令行启动 nmon 时,可通过以下开关参数控制其行为:

  • -f核心参数。开启文件记录模式,默认生成 [主机名]_[日期]_[时间].nmon 文件。
  • -s [秒]:设定采样间隔(如 -s 5 表示每 5 秒采集一次数据)。
  • -c [次数]:设定采样总次数(如 -c 120)。
  • -t:在输出文件中包含 Top Processes(资源消耗排名前列的进程统计)。
  • -m [目录]:指定输出文件的存储路径。
  • -F [文件名]:手动指定输出文件的名称,覆盖默认命名规则。
  • -p:启动时在标准输出中打印 nmon 的进程 PID,便于后续通过脚本管理或停止进程。

nmon 提供三种经典模式,分别对应实时观测、离线分析与自动化运维场景。

适用于即时性能排查,快速定位当前的资源瓶颈。

  1. 启动命令:直接输入 nmon
  2. 核心快捷键(按键即可切换显示/隐藏):
    • C:显示CPU详细信息,包括用户态、系统态、等待态、空闲态利用率等核心数据。
    • D:显示磁盘读写状态、IO吞吐量等磁盘相关指标。
    • T:显示系统进程列表,同步展示各进程的CPU、内存消耗情况。
    • M:显示内存使用详情,涵盖可用内存、缓存大小、交换分区占用率等信息。
    • N:显示网络流量、连接状态等网络相关数据。
    • H:查看完整快捷键列表,可按需调取更多监控指标。
  3. 退出方式:按 q 键退出。

适用于性能测试或长时间压测,旨在留存数据供后续分析。

  1. 核心命令# nmon -f -s 10 -c 360
  2. 执行效果:每 10 秒采样一次,共采集 360 次,总计监控 1 小时。命令执行后会立即返回 shell,nmon 在后台运行。
  3. 管理进程
    • 若启动时加了 -p,可根据返回的 PID 直接处理。
    • 手动停止:执行 ps -ef | grep nmon 找到进程 ID,随后使用 kill -USR2 <PID> 优雅停止(此时会确保数据完整写入文件)。
  4. 文件生成:监控文件默认保存在 nmon命令所执行的目录,文件名遵循 主机名\_年月日\_时分.nmon 规则,例如 localhost_20260114_1530.nmon

通过 crontab 实现定时任务,用于长期跟踪系统健康状况。

  1. 任务配置:执行 crontab -e 并添加以下行: 0 8 * * 1-5 /usr/bin/nmon -f -s 30 -c 1200 -m /var/nmon/logs/
  2. 策略解析
    • 周期:周一至周五,每天早上 8:00 准时启动。
    • 时长:每 30 秒采样,持续 1200 次,覆盖 10 小时工作时间(至 18:00)。
    • 存储:统一存放至 /var/nmon/logs/ 目录下(需预先手动创建目录)。

采集生成 .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 波动方面非常详尽。

模拟随机CPU负载,使用nmon监控系统资源,并通过分析工具生成报告。

使用以下 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;
}

启动负载:运行 ./cpu_load启动监控:执行 nmon -f -s 1 -c 60 -p > nmon.pid(每秒采样,持续 1 分钟)。 生成报告:监控结束后,执行 ./nmonchart *.nmon report.html结果分析:打开 report.html,可以观察到 CPU 利用率曲线呈现出与代码逻辑一致的“锯齿状”脉冲特征,从而验证 nmon 对突发负载的捕获能力。