nmon 是什么?
nmon(Nigel's performance Monitor for Linux)是一种Linux性能监视工具,当前它支持 Power/x86/x86_64/Mainframe/ARM 这五种 CPU 架构的 Linux,能将监控到的数据保存为 JSON 格式便于其他工具进行分析和展示。
为什么要编译安装 nmon?
虽然 nmon 对很多Linux发行版(如Red Hat, SUSE, Ubuntu, Fedora, OpenSUSE 等)进行了支持,你可以在这些发行版的源中找到它的包并安装它。
对于未提供预编译包的发行版就需要编译安装它了。
如何编译安装 nmon?
nmon 官方提供了编译安装指南,即通过修改makefile + 一个源码文件 来编译 nmon,地址如下:
源码一般名称为 lmon版本号.c,如当前最新的是 lmon16n.c,也可以在编译指南列表里取最新的下载
准备好这两个文件是第一步,接下来还需要问自己几个问题,通过以下几个问题就能知道该使用哪几个编译参数如何修改makefile:
- 问题1:makefile 中是否包含我需要的环境的脚本(标签)?
- 问题2:nmon 将运行环境的CPU架构是什么?
- 问题3:nmon 将运行环境的Linux内核版本是否小于2.6.18?
问题1包含所需脚本
问题1中如果是包含,可以直接放到编译环境(安装有gcc*
、ncurses-dev*
、make
的Linux环境,以Ubuntu举例就是 :sudo apt update && sudo apt install -y gcc* ncurses-dev* make
),将源码放到 makefile 同级目录,进入目录执行 ln lmon版本.c lmon.c && make 标签名
。举个例子,需要Ubuntu18.04 x86_64架构的nmon,只需要打开makefile,看看是否可以找到如下图类似脚本:
红框中的标签名由三部分组成,nmon + AMD64 + ubuntu1804,表示 x86_64的ubuntu18.04的 nmon,这个标签名一般与下边cc命名行的-o后的参数名一致,即最终也会打出同名目标文件。
找到需要的脚本,这里用lmon16n.c,则命令如下:
sudo apt update
sudo apt install -y gcc* ncurses-dev* make
ln lmon16n.c lmon.c
make nmon_AMD64_ubuntu1804
编译完成后,会生成名为nmon_AMD64_ubuntu1804的目标文件,可以把它改名为nmon 放到需要使用 nmon 的操作系统上做监控了。
ps: 如果有对应的编译脚本,后边就不用看了。
问题1不包含所需脚本
如果没有对应的脚本,那只好再深入一点点看看makefile的结构,了解下参数都有啥:
如图,红框表示目标文件名或makefile标签名;蓝框表示必需的文件,可不写;黄框表示传入CPU架构参数;绿框指定脚本中对某发行版做的优化。一般-D
和后边紧跟的参数 就相当于 C 语言中的 #define XXX
。所以源码中肯定有条件判断,如下图UBUNTU
既然这些都明白了,我们只需要确认有哪些可用参数,可不就能编译出需要的版本了么。
简单看了下源码,整理下常用的参数。
常用CPU架构参数:
- POWER - PowerPC
- MAINFRAME - Mainframe
- X86 - x86 与 x86_64 通用
- ARM - arm通用
常用发行版参数:
- SLES/SLES12/SLES113 - Suse Linux Enterprise Server
- RHEL6/RHEL7 - RedHat6 和 RedHat7与8
- UBUNTU - Ubuntu全系列
Linux内核版本相关参数:
- PRE_KERNEL_2_6_18/KERNEL_2_6_18 - 用于Linux内核版本等于或低于2.6.18版本,前者用于16j及之后版本,后者用于之前的版本
英伟达显卡相关参数:
- NVIDIA_GPU
再举个编译ARM架构CentOS7.8 内核版本5.4.200的nmon例子:
在makefile脚本最下添加两行:
nmon_ARM_centos7:
cc -o nmon_ARM_centos7 $(FILE) $(CFLAGS) $(LDFLAGS) -D ARM
主要两点考虑,是arm架构 用参数
-D ARM
,内核版本大于2.6.18不用加内核相关参数。注意:cc那行前边不是空格,必须是TAB制表符
目标文件已经编译成功了,可以 mv
改名复制到需要的环境中了,当然不改也行随你。
总结
简单介绍了下 nmon 是什么、编译安装它的原因,以及如何编译 nmon,如果对你有所帮助,欢迎点赞、关注、评论。本文就到这里了。
参考:
- 《跟我一起写 Makefile》 作者:陈皓
- 《GCC 参数详解》菜鸟教程
- 《CompilingNmon nmon for Linux - Compiling from the Source Code》