1.背景

在性能测试过程中,往往需要监控服务器的性能情况,并记录这些性能指标结果。不论是云下数据库服务器还是应用服务器,都可以通过nmon来进行监控,设定打点间隔和打点次数,将性能指标情况保存成nmon文件,并通过工具,如Excel插件Nmon_Analyzer、Java GUI工具nmon visualizer等读取nmon文件内容,分析采集结果。但当监控的服务器数量较多时,依次采集多个nmon文件中的性能指标结果会耗费时间,同时,人工读取和记录数据也可能会出现记录错误的偶然误差。因此我们可以尝试使用自己熟悉的编程语言,如Python等,来开发一款简单易实现的小工具,用于自动采集性能测试nmon文件中的性能测试指标。

python 作为服务运行 python写服务器性能_字符串

2. 工具介绍与设计

工具实现的基本思想是逐个扫描指定路径下的nmon文件,根据nmon文件的内部格式,提取出目标性能指标数据,再对提取出来的数据进行加工处理,得到结果,并将结果自动保存到新生成的结果Excel文件中。为了更直观地获取用户输入的nmon文件路径及结果保存路径,我们可以编写GUI界面,利用界面上的文本输入框来获取用户的输入,并采用界面上的按钮来触发这一采集事件。

python 作为服务运行 python写服务器性能_python 作为服务运行_02

图1 工具设计流程图

3. 工具实现

(1)导入所需模块

由于我们的工具中包含对文件和路径进行操作,这需要依赖os模块实现。在逐行读取nmon文件内容时,用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode。re模块是python独有的匹配字符串的模块,利用正则表达式对字符串进行模糊匹配,提取自己需要的字符串部分,使用该模块可以实现逐行扫描进行模糊匹配查找到CPU和内存的相关性能指标。xlwt库的作用是将数据写入Excel表格中。Tkinter 是 Python 的标准 GUI 库,导入 Tkinter 模块后可以使用控件快速的创建 GUI 应用程序。 tkinter.StringVar 能自动刷新的字符串变量,可用set和get方法进行传值和取值,以此来接收用户输入。

python 作为服务运行 python写服务器性能_数据_03

图2 代码-导入所需模块

(2)窗口的实现

利用Tkinter模块创建窗口并插入输入框控件用来获取用户输入的路径信息,输入框的内容存储到StringVar当中,设置按钮Button用于和鼠标点击事件绑定。

python 作为服务运行 python写服务器性能_输入框_04

图3 代码-窗口的实现

python 作为服务运行 python写服务器性能_字符串_05

图3 窗口的实现图

(3)编写事件代码——求CPU平均利用率的函数

不同版本的nmon文件内部格式略有不同,因此在编写程序时,要先了解目标版本的内部结构,用来确定字符串模式匹配时,需要利用nmon文件中性能指标相关内容的哪些特征。

为了计算均值,需要获取nmon文件中记录的打点次数。通过了解nmon文件中AAA参数是关于操作系统以及nmon本身的一些信息,可以查找该行来进行提取。

python 作为服务运行 python写服务器性能_python 作为服务运行_06

图4 代码-获取打点次数和打点间隔

CPU_ALL参数是对所有CPU的概述,显示所有CPU平均占用情况,将记录的CPU占用率逐个取出存放在数组里,并求数组元素的平均值,即为整个监控期间CPU的平均利用率,函数将该值返回。

python 作为服务运行 python写服务器性能_字符串_07

图5 代码-求CPU平均利用率

(4)编写事件代码——求内存均占用率的函数

类似地,通过MEM参数获取内存占用情况,与CPU情况不同的是,该参数行包括多项内存相关指标,而在监控性能指标时,我们常用公式1来计算内存的占用率,因此需要从MEM参数中提取相关指标,包括memtotal、memfree、cached、buffers,按照公式进行计算,并返回内存占用率。

公式1 内存占用率常用计算公式

python 作为服务运行 python写服务器性能_采集服务器的一些性能数据库_08

图6 代码-求内存占用率

(5)编写事件代码——鼠标点击事件

该事件用于和界面上的按钮Button进行绑定,实现当点击按钮后的一系列操作:从输入框取nmon文件路径和目标保存路径,生成Excel文件并创建工作表,写入默认的表头内容,调用求CPU平均利用率的函数和求内存均占用率的函数,将返回的值写入Excel文件并保存。

python 作为服务运行 python写服务器性能_字符串_09

图7 代码-鼠标点击事件

4. 总结

该工具是基于Python语言的简单实践,可以实现批量自动提取nmon文件中的性能指标结果,并且可以沿用本思路根据需要对工具的功能进行修改或扩展。使用本工具进行性能结果的自动采集相比人工读取数值更加节省时间,并且避免了记录时出现错误的偶然误差,有助于提升准确度和测试效率。