深入掌握 Linux 性能监控神器:Nmon 实战完全指南

在 Linux 系统管理员的日常工作中,面对服务器性能突然下降、资源瓶颈不明或者需要生成一份专业的性能报告时,你是否感到过手足无措?虽然我们都有 INLINECODEceace733、INLINECODE8f675b2e 或 iostat 这些老牌工具,但它们往往只能监控单一维度,或者输出的数据难以直接用于可视化分析。尤其是在 2026 年,随着云原生架构和 AI 辅助运维的普及,我们需要更精准的数据来驱动自动化决策。

在这篇文章中,我们将深入探讨 nmon(Nigel‘s Monitor)这一功能强大的 Linux 性能监控工具,并结合现代开发理念,看看如何将它融入当今的可观测性体系。作为一个全功能、交互式的命令行工具,它不仅能帮助我们实时监控 CPU、内存、网络、磁盘等核心资源,还能录制性能数据用于后续的深度分析。我们将一起学习如何安装、使用它进行实时诊断,并生成数据报告,助你从“单点”监控走向“全局”掌控。

什么是 Nmon?

Nmon(Nigel‘s Monitor 的缩写)是 Linux 平台上一个非常轻量级且高效的命令行系统性能监控工具。它最初由 IBM 工程师 Nigel Griffiths 开发,旨在为 AIX 和 Linux 提供一个简洁的性能分析手段。

它最大的优势在于:在一个屏幕内展示所有关键指标。这使得我们可以在一个终端窗口中,通过按不同的按键快速切换和组合查看 CPU、内存、磁盘 I/O、网络带宽、文件系统以及进程信息,而无需在多个终端窗口之间来回切换。

对于系统管理员和开发人员来说,在 2026 年的复杂基础设施中,nmon 依然是以下场景的绝佳选择:

  • 实时故障排查:快速定位是 CPU 飙高、磁盘 I/O 打满还是内存泄漏。
  • 性能基准测试:在进行压力测试时,录制系统的整体负载情况。
  • 长期监控报告:生成 .nmon 数据文件,转化为图表,用于向管理层汇报或进行历史趋势分析。

Nmon 的安装

Nmon 几乎包含在所有主流 Linux 发行版的软件仓库中。根据你使用的系统不同,我们可以使用以下命令轻松安装它。

在 Ubuntu/Debian 上

对于基于 Debian 的系统,我们使用 apt 包管理器:

# 更新软件源列表
sudo apt-get update

# 安装 nmon
sudo apt-get install nmon

在 Fedora/CentOS/RHEL 上

对于基于 RedHat 的系统,我们使用 INLINECODEf2c159f7 或 INLINECODE4ba4f5b7。需要注意的是,在某些 RHEL 或 CentOS 版本中,nmon 可能位于 EPEL (Extra Packages for Enterprise Linux) 仓库中,因此我们需要先安装 EPEL 源。

# 对于 CentOS/RHEL 7 及更早版本
# 1. 安装 EPEL 源
sudo yum install epel-release

# 2. 安装 nmon
sudo yum install nmon

# 对于 Fedora 或较新的 CentOS/RHEL 8
dnf install nmon

安装完成后,我们可以通过在终端输入 nmon 并回车来启动它。如果安装成功,你将看到一个充满字符数据的全屏界面。

$ nmon

Nmon 交互式监控实战

启动 nmon 后,你会发现这是一个纯键盘操作的界面(类似于 vim)。屏幕上方会有提示信息,告诉你哪些按键可以触发什么功能。所有的操作都是“按键即显示”,再次按键通常关闭该显示。

下面我们将详细演示如何使用这些交互功能。

1. 全局概览与 CPU 监控

在启动界面,我们首先关注的是 CPU。按下 c 键,屏幕下方将弹出 CPU 统计区域。

  • USER:用户空间程序占用的 CPU 百分比。
  • SYSTEM:内核空间占用的 CPU 百分比。
  • WAIT:CPU 等待 I/O 操作完成的时间(如果这个值很高,说明磁盘瓶颈严重)。
  • IDLE:CPU 空闲时间。

实战技巧:如果你看到 INLINECODE5950e3b9 值持续很高,而 INLINECODE043a7e37 很低,这意味着 CPU 并不忙,但在等待磁盘读写数据。这是典型的 I/O 密集型负载特征。如果你的服务器是多核的,你可以多次按 c 键来切换显示模式(例如:查看所有核心的独立负载 vs 总体负载)。

2. 内存与交换分区监控

按下 m 键,我们可以查看内存使用情况。这里我们需要特别关注几个指标:

  • Real Total/Used:物理内存的总量和已用量。
  • Swap Total/Used:虚拟内存的使用量。

深度解析:在 Linux 中,看到“内存用光了”并不一定意味着需要惊慌。Linux 内核会利用空闲内存作为文件系统缓存。因此,我们更应关注 Swap 的使用情况。如果 Swap Used 开始增长,说明物理内存确实不足,系统正在进行痛苦的磁盘交换,此时系统性能会急剧下降。

3. Top 进程详情

想要知道哪些进程在“作祟?按下 INLINECODEc75509e9 键。nmon 会列出消耗资源最多的进程列表,类似于 INLINECODE970c1c01 命令,但更整洁。列表通常包含:

  • PID:进程 ID。
  • Command:进程名称或命令。
  • CPU%:该进程占用的 CPU。
  • Res:物理内存占用。

结合 INLINECODE0f94c0bf 和 INLINECODEb4ff3310 键,我们可以快速定位到导致 CPU 飙高的罪魁祸首。例如,当你发现某个 Java 进程 CPU 占用 800% 时,你就可以针对性地进行排查。

4. 磁盘 I/O 图形与统计

这是 nmon 最强大的功能之一。按下 d 键,我们将看到磁盘 I/O 的统计信息,并且是以图形化的 ASCII 字符展示的。

  • Disk Busy %:磁盘繁忙的时间百分比。如果接近 100%,说明磁盘已经满载。
  • Read/Write:每秒的读写速率(KB/s)。

场景分析:如果 INLINECODE8ed8ff31 很高,但 INLINECODE4c723ce9 速率却很低,这可能意味着磁盘面对的是大量随机的小文件读写(IOPS 瓶颈),而不是带宽瓶颈。这对于数据库服务器调优非常关键。

5. 网络统计信息

按下 n 键,我们将看到网络接口的吞吐量。

  • Read/Write:这里指的是接收和发送的数据量。

如果你在排查网络延迟问题,这里的吞吐量数据可以帮你判断网卡是否打满。如果你的网络带宽上限是 1Gbps,而这里显示的速率已经接近 125MB/s,那么网络瓶颈就已经形成了。

进阶功能:录制与离线分析

仅仅在屏幕上查看数据是不够的,我们需要数据留存。nmon 允许我们将系统性能数据录制到一个文件中,然后使用分析工具生成图表。这对于性能测试(例如:在压力测试期间监控服务器)非常有用。

如何录制数据

我们可以使用 INLINECODE2a0e24b8 参数指定输出到文件,使用 INLINECODEcdc7a5ae 参数包含高精度的进程数据,以及 INLINECODEef120747 和 INLINECODE143645a2 来控制采集频率和次数。

示例 1:录制 1 小时的性能数据

假设我们需要录制 1 小时的数据,每 10 秒采集一次。

# -f: 指定输出到文件(文件名通常自动包含时间戳)
# -t: 收集高精度进程信息
# -s 10: 每 10 秒采样一次
# -c 360: 采集 360 次 (10秒 * 360 = 3600秒 = 1小时)
# -m /root/perf_logs: 指定输出文件的目录

nmon -f -t -s 10 -c 360 -m /root/perf_logs

示例 2:结合 nohup 进行后台长期监控

在实际生产环境中,我们通常希望监控命令在 SSH 断开后依然运行。我们可以结合 nohup 使用:

# 使用 nohup 确保进程后台运行,重定向输出
nohup nmon -f -t -s 30 -c 120 -m /root/perf_logs > /dev/null 2>&1 &

如何分析 .nmon 文件

录制得到的 .nmon 文件本质上是一个文本文件,包含了一系列按时间戳记录的快照数据。虽然可以直接用文本编辑器打开查看,但由于数据量巨大,人类很难直接阅读。

  • 使用 nmon Analyzer (Excel)

这是一个非常流行的 Excel 宏工具。你可以下载 nmon_analyser.xlsx

* 打开 Excel 文件(需启用宏)。

* 点击 "Analyze nmon data" 按钮。

* 选择你生成的 .nmon 文件。

Excel 将会自动解析数据,并生成包含 CPU 趋势图、内存曲线图、磁盘 I/O 热力图等多个 Sheet 的报表。

  • 使用 nmonchart (命令行生成 HTML)

如果你需要在 Linux 服务器上直接生成网页报告,nmonchart 是最好的选择。

    # 假设你已经下载了 nmonchart 并赋予执行权限
    ./nmonchart localhost_240510_1200.nmon output_report.html
    

2026 视角:企业级封装与自动化脚本实践

在现代化的运维环境中,我们通常不会手动去一个个服务器上运行 nmon。作为技术专家,我们倾向于编写健壮的封装脚本,使其具备自我管理、错误处理和自动化的能力。让我们来看一个实际项目中的例子,我们如何将 nmon 封装成一个生产级的监控服务。

实战案例:智能监控守护进程

我们需要一个脚本,它能够:自动检测磁盘空间、防止重复启动、优雅地处理信号,并在后台稳定运行。这不仅仅是一个命令,而是一套完整的监控解决方案。

#!/bin/bash
# ============================================================================
# 脚本名称: enterprise_nmon_wrapper.sh
# 功能描述: 生产级 Nmon 监控封装脚本
# 作者: AI Infrastructure Team
# 最后更新: 2026
# ============================================================================

# --- 配置区域 ---
LOG_DIR="/var/log/nmon_logs"
MAX_SNAPSHOTS=288      # 24小时 (每5分钟一次)
COLLECT_INTERVAL=300   # 300秒 = 5分钟
LOCK_FILE="/tmp/nmon_wrapper.lock"
HOSTNAME=$(hostname)
DATE_STAMP=$(date +%Y%m%d)
NMON_BIN=$(which nmon)

# --- 预检查 ---

# 检查 nmon 是否安装
if [ -z "$NMON_BIN" ]; then
    echo "[ERROR] nmon 未安装。正在尝试安装..."
    # 这里可以添加自动安装逻辑,或者简单地退出
    exit 1
fi

# 检查是否已经运行 (防止重复启动)
if [ -f "$LOCK_FILE" ]; then
    echo "[WARNING] 检测到锁文件 $LOCK_FILE。脚本可能已在运行。"
    # 在实际生产中,这里可以添加检查 PID 是否存活的逻辑
    exit 1
else
    touch "$LOCK_FILE"
fi

# --- 核心逻辑 ---

# 创建日志目录
mkdir -p "$LOG_DIR"
echo "[INFO] 启动监控: 日志将保存至 $LOG_DIR"

# 定义清理函数 (trap 信号)
cleanup() {
    echo "[INFO] 收到退出信号,正在清理..."
    rm -f "$LOCK_FILE"
    # 这里可以添加结束 nmon 进程的逻辑,或者让 nmon 自己完成采集
    exit 0
}

# 捕获 INT 和 TERM 信号
trap cleanup SIGINT SIGTERM

# 启动 Nmon
# 参数说明:
# -F : 指定输出文件名(使用 -F 而不是 -f 可以自定义文件名格式)
# -t : 包含高精度进程信息
# -s : 采集间隔
# -c : 采集次数
# -m : 输出目录
#
# 注意:我们使用 $! 获取 nmon 的 PID,以便后续管理
NMON_OUTPUT="${LOG_DIR}/${HOSTNAME}_${DATE_STAMP}.nmon"

$NMON_BIN -F "$NMON_OUTPUT" -t -s $COLLECT_INTERVAL -c $MAX_SNAPSHOTS -m "$LOG_DIR" &
NMON_PID=$!

echo "[SUCCESS] Nmon 已启动 (PID: $NMON_PID)"
echo "[INFO] 执行以下命令查看实时日志: tail -f $NMON_OUTPUT"

# 保持脚本运行(守护进程模式)
# 或者,如果你只是想启动它并退出,可以去掉 wait,但这取决于具体需求
wait $NMON_PID

# 监控结束后自动清理
rm -f "$LOCK_FILE"

#### 代码深度解析

在这段脚本中,我们融入了 2026 年开发范式中强调的“鲁棒性”和“自动化”理念:

  • 锁机制:这是我们在生产环境中防止定时任务(如 cron)重叠执行的关键。没有锁,一次系统维护重启可能导致无数个监控进程在后台争夺资源。

n2. 信号捕获trap cleanup SIGINT SIGTERM 确保了即使管理员手动终止脚本,锁文件也会被清理,不会导致下次启动失败。

  • 环境感知:我们使用了 $(which nmon) 而不是硬编码路径,这增加了脚本在不同 Linux 发行版上的移植性。
  • 数据管理:我们将日志集中存放在 /var/log 下的专门目录,符合 Linux 文件系统层次结构标准 (FHS),便于后续的日志轮转 集成。

融入 AIOps 与现代可观测性

你可能会问,既然 Prometheus 和 Grafana 这类云原生监控栈已经如此成熟,为什么我们还需要 nmon?

在我们的实战经验中,nmon 填补了一个关键的空白:“上下文快照”。云原生监控擅长展示“此刻”的状态或长期聚合趋势,但在故障发生后的“回溯分析”中,nmon 提供的、带有时间戳的细粒度进程和 I/O 数据是无与伦比的。

2026 年的最佳实践是:将 nmon 作为 AIOps 的数据源之一。

我们可以编写一个简单的解析器,将 nmon 的数据实时推送到 Elasticsearch 或 OpenSearch 中,结合 Kibana 进行可视化。甚至,我们可以利用 LLM(大语言模型) 来分析 nmon 的输出日志。

  • 场景:当系统变慢时,AI Agent 可以自动拉取过去 1 小时的 .nmon 文件。
  • 分析:AI 会分析 INLINECODE27e2b94b 指标和 INLINECODEa3cd60d8 的相关性。
  • 结论:AI 生成报告:“从 14:00 到 14:30,CPU Wait 时间与磁盘 sdb 的 Busy 度呈现强正相关(>0.9),判定为磁盘 I/O 瓶颈,建议检查数据库索引。”

这就是我们将 Nmon 这一经典工具赋予新生命的做法。

常见错误与最佳实践

在使用 nmon 的过程中,我们总结了一些经验,希望能帮助你避开坑点:

  • 文件过大问题

如果你设置了 -s 1(1秒采集一次)并运行了一整天,生成的文件可能达到几百 MB 甚至更大。这会导致 Excel 打开时直接卡死。

* 解决方案:根据监控时长合理设置采集间隔。对于长期监控(如数天),建议 -s 300(5分钟)或更长。

  • 磁盘空间写满

nmon 自身非常轻量,但如果你的日志分区空间很小,长时间的监控可能会把空间写满。

* 解决方案:始终使用 INLINECODEe25e17d6 参数将日志输出到空间充足的挂载点(如 INLINECODE4e22de47 或专门的数据盘),并在脚本中增加清理旧日志的逻辑。

  • 权限问题

普通用户运行 nmon 可能无法看到某些内核或进程详细信息。

* 解决方案:在进行深度故障排查时,建议使用 sudo nmon 运行,以确保数据采集的完整性。

总结

Nmon 不仅仅是一个监控工具,它是 Linux 系统管理员手中的“听诊器”。通过它,我们可以实时诊断系统病痛,也可以录制数据作为“病历”进行长期分析。在 2026 年,掌握这种基础层面的工具,能让我们更好地理解系统的底层行为,从而构建出更稳固的监控体系。

在这篇文章中,我们不仅探讨了 Nmon 的基础操作,还深入研究了如何通过企业级脚本封装来解决自动化部署的问题。我们鼓励你尝试编写自己的封装脚本,并将其与你现有的监控工具链结合。

现在,建议你登录到你的测试服务器,试着运行 INLINECODEb516fcb7 并按下 INLINECODE823be7f8 键,看看你的磁盘 I/O 状况如何?或者尝试使用我们提供的脚本模板,部署你的第一个自动化监控任务。掌握这个工具,将让你的系统运维工作如虎添翼。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/45178.html
点赞
0.00 平均评分 (0% 分数) - 0