一、nmon 介绍
nmon 是 IBM 开发的轻量级系统性能监控工具,专为 Linux、Unix 系统设计,核心用于实时监控与离线分析系统性能。
它能全面采集服务器关键性能数据,配合 nmon_analyzer 工具解析后,可生成直观图表,让性能变化趋势一目了然,无需手动整理复杂数据。
核心监控指标
- 系统基础:CPU 使用率、内存使用、页面空间与换页速度
- 存储相关:磁盘 IO 性能、文件系统及 NFS 状态
- 系统细节:服务器配置信息、内核统计数据、运行队列状态
- 进程层面:资源消耗 TOP 进程(CPU / 内存 / IO 占用排行)
工具核心优点
- 资源占用低:基于系统自带数据统计能力采集信息,对操作系统性能影响极小,不干扰业务运行
- 监控维度全:覆盖 CPU、内存、磁盘、网络、进程、队列等核心指标,一站式满足性能排查需求
二、nmon下载和安装
下载地址:https://nmon.sourceforge.net/pmwiki.php?n=Site.Download

找到对应的版本进行下载,我的是 almaLinux9.6 下载这个 16p 的版本。
可以在虚拟机中直接复制链接,通过 wget 命令下载:
# 下载
wget https://sourceforge.net/projects/nmon/files/nmon16p_32_binaries_feb_2024.tar.gz
# 解压
tar -zxvf nmon16p_32_binaries_feb_2024.tar.gz

解压后再输入命令:ls,就能看到很多nmon的可执行文件,这些就是nmon工具

almaLinux9.6 版本兼容 centos 的命里命令,可以使用下面命令下载,就只会下载符合当前 Linux 版本的 nmon
dnf install -y nmon
# 或者
yum install -y nmon
启动nmon
执行nmon时,需要选择正确的版本去执行所以我们需要先确定Linux的版本
查看自己linux的版本:uname -a

或者:cat /proc/version

截图中的操作系统是Ubuntu 20.04,具体以实际为准
由于当前的Linux版本是Ubuntu 所以,选择Ubuntu的nmon去执行

选择nmon_x86_64_ubuntu19去执行,选择它的原因:最接近当前的ubuntu 20.04
执行命令:./nmon_x86_64_ubuntu19
![]()
出现这个界面就成功了

almaLinux 下载的 nmon 直接就可以使用 nmon 命令进入到交互页面中,默认帮你创建好了软连接了。
nmon两种运行模式
- 交互模式:不传递任何参数时启动nmon就是交互模式,这种模式可以通过一个固定大小的窗口来收集服务器性能指标。
- 记录模式:如果指定-F,-f 则nmon命令处于记录模式。记录模式下,nmon不会产生固定大小的窗口,而是在后台采集数据并实时保存到数据文件当中。可以通过nmon_analyzer工具分析数据文件
- -f : 监控结果以文件输出,默认机器名_日期_时间.nmon
- -F :监控结果以文件输出,但是没有默认名,需要手动指定名字
交互模式
启动交互模式:
在nmon安装目录输入命令:./nmon_x86_64_ubuntu19
![]()
会看到这个界面

这个界面就是交互模式界面
下面介绍常用交互模式的参数:
cpu :c
在交互界面时,按字母"c":会看到下图中的CPU使用率

- CPU:cpu核心
- User%:用户占用CPU比率
- Sys%:内核占用CPU比率
- Wait%:CPU等待比率;CPU在等待IO时,用Wait指标来衡量
- Idel:空闲CPU比率
内存 m
在交互界面时,按字母"m":会看到下图中出现内存使用率

PageSize:页大小
RAM-Memory:RAM内存大小
Swap-Space:交换内存大小
Active:活动内存大小
Cached:缓存大小
Buffers:Buffers缓存大小;
- Buffer:Buffer Cache 通常用于对IO设备的写缓冲,从内存写入磁盘;
- Cache:Page Cache 通常用于对IO设备的读缓存,为了降低磁盘读取文件的频率
Dirty:脏数据,这里指修改过但是并没有存入内存的数据
Slab:Slab缓存,slab是内存分配机制,其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,用常规方法处理他们时会产生大量碎片,所以使用slab来处理,而slab处理时,会把这些对象缓存起来,这个缓存叫做slab缓存。slab缓存主要是用Page Cache实现的。
Writeback:回写内存,指真正写入硬盘的数据
Commit_AS:表示所有进程已经申请(已经分配)的内存总大小
Active:活跃的内存
Inactive:不活跃的内存
Mapped:映射内存
PageTables:页表,是由页表项(PTE)组成的数组。512个PTE构成一个页表页(Page-table page)。
用来控制物理空间"块"的读写访问权限。
磁盘 d
在交互界面时,按字母“d”:会看到下图中出现磁盘使用率

- DiskName:磁盘名称
- Busy:磁盘平均繁忙程度百分比
- Read :每秒从磁盘读取的数据速度(以千字节为单位)
- Write:每秒向磁盘写入的数据速度(以千字节为单位)
磁盘 D 更加详细
还可以按大写的"D",查看更详细的磁盘情况

- DiskName:磁盘名称
- Busy:磁盘平均繁忙程度百分比
- Read-KB/s:每秒读取数据的数据传输率(以千字节为单位)。
- Write-KB/s:每秒写入数据的数据传输率(以千字节为单位)。
- Xfers:每秒传输数据的速度
- Size:总传输数据大小(以千字节为单位)
- Peak%:平均繁忙程度的峰值百分比
- Peak-RW:读写磁盘峰值大小(以千字节为单位)
网络 n
在交互界面时,按字母“n”:会看到下图中出现网络使用率

- I/F Name:网络接口名称
- Recv=KB/s:在间隔时间内每秒接收的数据(以千字节为单位)。
- Trans=KB/s:在间隔时间内每秒内传输的数据(以千字节为单位)。
- packin:在间隔时间内接收到的package包数
- packout:在间隔时间内发送的package包数
- insize:在间隔时间内接收到的package包的大小。
- outsize:在间隔时间内发送的package包大小。
- Peak->Recv:每秒接收数据的峰值(以千字节为单位)。
- Peak->Trans:每秒发送数据的峰值(以千字节为单位)。
linux 系统访问外部互联网,需要通过网卡来进行传输、接收数据,就能监控网卡查看数据大小,判断是否达到网络规定的要求,假设网络带宽 100Mbit 大概就是 12.5MByte/s,如果监控到网络是 10.MB/s 那么就可能达到网络带宽上限,可以扩展网络带宽,100Mbit 带宽不是一个数据包,而是拆分成很小的数据包,例如每个数据包 4KB,每个场景数据包大小不一定。那么每次发送都只有 4KB 的数据包大小,那么就可以降低网络数据包的大小,数据包的发送有固定的协议和用户发送的真正的数据组成,可以降低真正响应的数据大小。从而节约网络带宽。
进程 t
在交互界面时,按字母“t”:会看到下图中出现进程使用情况

- PID:进程编号
- %CPU Used:CPU资源使用百分比(只统计间隔时间内的CPU使用率)
- Size KB:页面大小(单位千/字节)。
- Res Set:进程的实内存数据与实内存文本大小的和。
- Res Text:进程的实内存文本大小。
- Res Data:进程的实内存数据大小。
- Shared:共享内存大小
- Faults Min:次要故障
- Faults Maj:主要故障
- Command:该进程的主要指令
进程主要分成三大结构,程序、数据、pcb,程序就是代码,数据就是用户的真正值数据也就是这里的 Res Data,pcb 就是控制进程的,有唯一标志符,描述性信息, 管理进程。
文件系统 j
在交互界面时,按字母“j”:会看到下图中出现文件系统使用情况

- FileSystem:文件系统的名称。
- SizeMB:文件系统的大小(以兆字节为单位)。
- FreeMB:文件系统中的可用空间(以兆字节为单位)。
- Use%:使用的文件系统资源百分比。
- Type:文件类型。
- Mount Point:文件系统挂载点。
通过这个可以直观的查看到,哪个文件使用的比较多,例如日志太多,就能通过这个来监控到哪个目录下占用文件大小。清空数据等。
最后常用命令总结表如下:
|
参数 |
作用 |
|
q |
停止并退出 Nmon |
|
h |
查看帮助 |
|
c |
查看 CPU 统计数据 |
|
m |
查看内存统计数据 |
|
k |
查看内核统计数据 |
|
n |
查看网络统计数据 |
|
N |
查看 NFS 统计数据 |
|
j |
查看文件系统统计数据 |
|
t |
查看高耗进程 |
|
V |
查看虚拟内存统计数据 |
|
v |
详细模式 |
记录模式
可以通过命令来启动nmon监控
nmon -f -s 10 -c 60 -m /root/nmon -F test.nmon
作用:在后台每个10秒采集一次数据,一共采集60次,并把采集的结果输出到/root/nmon_data文件中
参数说明
- -f :监控结果以文件形式输出,默认机器名+日期.nmon格式
- -F 指定输出的文件名,比如test.nmon
- -s 指的是采样的频率,单位为毫秒
- -c 指的是采样的次数,即以上面的采样频率采集多少次
- -m 指定生成的文件目录
运行后,会立刻生成一个nmon数据文件,可以通过 ps 观察 nmon 的进度:

结束之后会生成 nmon 的文件,不要使用 vi 命令打开,如果 nmon 有 1G 的话,内存就会被占用 1G,建议使用 head 命令简单查看一下即可

这个数据文件需要用nmon_analyzer工具来解析
三、nmon_analyzer
下载nmon_analyzer:https://nmon.sourceforge.net/pmwiki.php?n=Site.Nmon-Analyser

解压,得到nmon_analyser v66.xlsm
这样,nmon_analyser安装完毕,接下来开始使用它
打开nmon analyser v66.xlsm

打开后发现有点儿像Excel,同时需要安装VBA支持库后才能够使用,所以我们需要安装VBA支持库,这个库只是一个插件,只要下载后就可以使用

解压他们,然后按照顺序运行安装

安装重启WPS,然后再次打开nmon_analyser_v66.xlsm,就能看到有"启用宏"按钮可以点击了

点击"启动宏"
再点击Analyze nmon data,就会弹出选择文件的窗口
在这里可以选择nmon记录模式生成的xxx.nmon文件来解析
这里我们可以试试生成一个:先在Linux中执行nmon记录模式的命令,采集数据
nmon -f -s 5 -c 60 -m /root/ -F my_nmondata.nmon
紧跟着使用stress-ng来给服务器模拟压力:
stress-ng –cpu 20 –timeout 300
然后等待300秒后再从linux中取出生成的 my_nmondata.nmon 文件到本地,这个案例的模式架构是这样的

取出nmon文件:
先看下nmon进程是否还在:ps -ef|grep nmon
下图可以看到,nmon进程不在了,说明nmon已经执行完毕

如果nmon进程还在,它可能会是这样的

nmon采集完毕后,可以在/root目录看到采集到的文件my_nmondata.nmon了

然后把my_nmondata.nmon,传到本地,用本地的nmon_analyzer去打开它
这里大家参考之前的方法打开nmon_analyzer
双击打开后,经过一段时间的加载,还会弹出一个保存窗口,它是选择解析nmon文件后,保存的文件名,这里我们依然保存在性能测试目录
保存成功后,会自动进入解析完成的my_nmondata.nmon.xlsx

同时性能测试目录下,也会生成这个文件
接下来就可以分析 nmon_analyzer 生成的图表了
详细的报告指标在另一篇文章中进行介绍。
链接:https://blog.csdn.net/sinat_28927441/article/details/154951125
四、nmonchart生成html报告
下载:https://nmon.sourceforge.net/pmwiki.php?n=Site.Nmonchart

在linux中,可以直接用wget 下载链接地址来下载
下载完后,用ls看下下载目录

然后创建一个目录nmonchart,接着解压到这个目录
mkdir nmonchart
tar -xvf nmonchart40.tar -C nmonchart
最后CD 进入这个目录,并ls查看内容

然后创建软连接到环境变量
ln -s /root/nmonchart/nmonchart /usr/local/bin/nmonchart
![]()
然后测试一下:

发现提示:-bash: /usr/local/bin/nmonchart: /usr/bin/ksh: bad interpreter: No such file or directory
这是因为没有安装ksh,安装一下
输入命令:yum install ksh -y
就会完成ksh的安装

然后再测试nmonchart命令

这样就正常了,接下来使用nmonchart生成html报告
语法:
nmonchart nmon源文件 生成的html文件
例如:
nmonchart xxx.nmon xxx.html
进入具有.nmon文件的目录(如果没有那么用nmon的记录模式生成一个)

然后可以输入生成html报告的命令:nmonchart my_nmondata.nmon my_nmonhtml.html

可以看到,上图中多了一个my_nmonhtml.html的文件,它就是html文件
五、nmon+nmonchart+tomcat动态展示html报告
首先安装 Java 和 tomcat,安装过程不再描述了。安装好之后,设置 profile 环境变量
接着用souce命令执行/etc/profile文件:source /etc/profile

执行后用echo $PATH检查环境变量,如果发现其中多了/root/jdk1.8.0_361/bin,证明jdk配置成功了

最后输入命令java -version,可以看到版本号,并且版本是1.8.0_361证明jdk安装成功

接着安装tomcat
下载tomcat的地址:https://tomcat.apache.org/whichversion.html
下载时,要注意版本号:这里我们选择tomcat 9 来下载,因为它支持jdk1.8

下载页面

进入root目录并查看下载好的 tomcat

解压tomcat: tar -xvf apache-tomcat-9.0.71.tar.gz

检查tomcat的端口,主要是查看解压的tomcat目录中,conf目录里面的server.xml的端口号。
可以发现有8080、8009、8443、8005这四个端口号,主要对用户提供服务的端口是8080,8009是AJP的端口、8443是SSL的端口、8005是关闭tomcat的端口

然后我们检查一下8080端口是否已经被使用了
输入命令:netstat -anp | grep 8080

输入后,可以看到没有查看任何端口,证明8080没有被使用;如果能查到数据,说明其他进程在用8080端口,那时我们有两个选择,要么干掉占用8080端口的进程,要么换一个端口。这里没有被占用,不用管它
启动tomcat:
先授权:chmod 755 -R apache-tomcat-9.0.71/*
然后启动:apache-tomcat-9.0.71/bin/catalina.sh start

查看Tomcat started,证明tomcat启动了,再次看一下8080端口:netstat -anp | grep 8080

可以看到启动tomcat后,8080端口已经处于LISTEN状态了,证明tomcat成功启动了,并且使用了8080端口
最后跨操作系统访问一下Linux中的tomcat

这样tomcat搭建完成
接着把生成的html文件移动到tomcat的web站点根目录中,tomcat的web站点根目录是:tomcat安装目录/webapps/
进入tomcat的web站点根目录
cd /root/apache-tomcat-9.0.71/webapps
然后创建目录nmon:mkdir nmon
![]()
接着把生成的html文件复制到nmon中
cp /root/my_nmonhtml.html ./nmon/
![]()
看一下新建的nmon中有没有复制的my_nmonhtml.html

最后在本地浏览器,访问tomcat的地址

能看到这个页面,证明使用tomcat能够实时展示nmon生成的html报告了。
后续运行nmon记录模式的命令后,再运行nmonchart nmon数据文件 nmon报告文件,最后把nmon报告文件移动到tomcat的webapps下的nmon目录中,就可以使用tomcat查看html报告了
注意:这个报告需要VPN访问国际网才能够看到具体内容,这是因为nmonchart使用了Google的技术,需要访问国际网才能访问。





