2024年6月13日发(作者:)

测试工具的使用说明

1. atop

atop是一个高级的Linux系统

全屏性能监视器,会定期的显示CPU、内存、

磁盘、网络的负载信息。

在终端输入./atop会出现如下界面:

1

在界面中键入‘m’,就会显示每个进程的内存情况,如下图:

2

在界面中键入‘s’, 就会显示与调度有关的进程信息,如下图:

3

在界面中键入‘v’,就会显示每个进程的全部信息,如下图:

4

在界面中键入‘c’,就会显示每个进程的命令行,如下图:

5

2. bonnie++

1.

使用说明

-d:在测试时会生成一些文件,并读或更改这些文件。这个参数是设置测试文件

放置的路径。

-s:单个测试文件的尺寸。这个参数值必须大于等于2倍测试使用的内存。测试

时应该用大文件尺寸。

-m:测试的机器名称

-r:测试需要用多少内存。如果省略这个值,则会用全部的物理内存。

-x:循环几次

-u:指定执行测试的OS用户。当不是以root执行时,必须显式指定。

-g 测试文件的组,默认是执行bonnie++的当前用组。

-b 在每次写文件时调用fsync()函数,对于测试邮件服务器或者数据库服务器这

种通常需要同步操作的情况比较适合,而不使用该参数则比较适合测试copy文

件或者编译等操作的效率。

2.结果分析

下面看一个测试结果,通过这个结果我们解释一下到底bonnie++在测试过程中

都作了什么,而每一个输出的结果又表示了什么。

6

依次解读一下,从Writing with putc()开始到Delete files in random orde…结束,

这是bonnie++作的12项测试,这12项测试依次对应12项结果,而这12项结果

又被分为了5大类,分别是Sequential Output(写测试),Sequential Input(读测

试),Random Seeks(读写测试),Sequential Create(顺序读写文件测试)和Random

Create(随意读写文件测试)。

那么测试步骤和测试结果依次对应的顺序就是:

Writing with putc() -> Sequential Output的Per Chr

Writing intelligently -> Sequential Output的Block

Rewriting -> Sequential Output的Rewrite

Reading with getc() -> Sequential Input的Per Chr

Reading intelligently -> Sequential Input的Block

start 'em -> Random Seeks

Create files in sequential order -> Sequential Create的Create

Stat files in sequential order -> Sequential Create的Read

7

Delete files in sequential order -> Sequential Create的Delete

Create files in random order -> Random Create的Create

Stat files in random order -> Random Create的Read

Delete files in random order -> Random Create的Delete

每个结果中又包括了2项数值,一个是K字节数或者文件数,另一个是%CP,就

是执行这项测试时CPU的平均占用率。对于输出结果的评价,我们认为在相等

CPU的占用率情况下,存取字节数越高表示该存储设备的吞吐量越大,自然性能

也就越好。

Per Chr表示以字符为单位读写文件

Block表示以block为单位读写文件

Rewrite表示修改并重写已经存在的文件的每一个block

K/sec表示每秒读或写文件的速率,以K为单位

%CP表示在某阶段执行操作时平均消耗的CPU

可以看到,该机器的字符写速度可达8909K/sec,block写速度可达

20708K/sec,字符读速度可达27673K/sec,block读速度可达

80684K/sec。

8

3. Dbench Tbench

Dbench和Tbench是用来模拟工业标准的Netbench负载测试工具来评估文

件服务器的测试工具。

Dbench只产生文件系统的IO负载。

-t 设置运行时间,以秒为单位。

-D 测试运行的基本目录 测试时产生的一些文件存放位置,测试完毕后会自动

把这些文件删除

-c 负载文件的位置 Dbench和Tbench 都会读取一个负载描述文件

,这个文件是安装程序自带的,通过读取它来产生负载。

测试结果:

从上图可看到模拟100个client同时运行10秒的吞吐量68.9123MB/sec。

9

Tbench产生TCP负载。

运行Tbench之前首先要在服务器上面启动tbench_srv。

测试结果:

从上图可看到模拟100个client同时运行10秒的吞吐量117.434MB/sec。

10

4. Fdtree

Fdtree是一个用来测试文件系统元数据性能的工具。

参数含义:

-C 只创建目录树

-D 打开调试

-R 只移除目录树

-l 创建目录的递归等级,默认为4

-d 每个等级所要创建的目录个数

-f 每个目录下所要创建的文件个数

-o 开始测试时的路径名

-s 文件大小(是以block计算的,linux下block大小为4096Bytes),默认为10

–d 1 –l 2 –f 10000 –s 10000

这个例子是一个文件压力的测试,创造的目录结构的等级为2,每个等级下创建

1个目录,每个目录下文件的个数为10K,每个文件的大小为

10000*4096Bytes=40.96MB,总的数据大小为2*10000*40.96MB=819.2GB。

11

-d 10000 -l 100

这个例子是一个目录压力的测试,创造的目录结构的等级为100,每个等级下目

录的个数为10K。第一等级下的总目录个数为10K,第二等级下的总目录总个数

为10K*10K,第三等级下的总目录个数为10K*10K*10K,依次类推!

上图显示了一个Fdtree的测试结果,目录等级为4,每个等级下创建目录的个数

为5,每个目录下文件的个数为3,文件大小为40KB。

12

5. Ffsb

Ffsb是一个文件系统性能测试工具,它通过读取可定制的profile文件来产生不

同的工作负载,支持多个线程组访问多个不同的文件系统。

下图内容是一个典型的profile文件的组成形式:

profile文件由三部分组成:global options部分、filesystems部分、threadgroups

部分.

Global options:

在profile文件的开始部分有8个全局变量,其中有三个是必须设置的:

num_filesystems指定文件系统的个数,num_threadgroups指定线程组的个数,time

指定测试运行的时间。

其余的5个变量是可选的,分别为:directio、alignio、bufferredi、verbose、callout:

filesystems:

对于ffsb来说文件系统就是一个目录,所以我们必须确保文件系统挂载到了相应

的目录。在这里,我们可以设置文件系统中文件和目录的个数以及文件大小的最

大值和最小值。

由上图可知,文件系统的挂载位置为/mnt/leofs/,文件的数目为100,目录的数目

13

为0,文件最大为41943040B,文件最小为41943040B。

threadgroups:

在这一部分指定了线程的个数,读写文件的大小和读写块的大小。

如何详细的编写profile文件可参考ffsb软件包中的README文件。

Ffsb的运行方式:./ffsb [profile文件的具体位置]

上图是一条ffsb命令的执行,开始时ffsb会把要执行的profile文件的主要内容

列出到屏幕,如上图。

运行结果见下图:

14

由上图可知,创建100个40MB的文件共需要时间263s,吞吐量为245MB/s,

CPU的利用率为84.6%。

15

6. Fstest

Fstest文件系统的一个测试工具。

参数含义:

-n 设置子进程个数

-f 设置文件数量

-s 设置文件大小

-b 设置块大小

-p 设置测试路径

-l 设置循环次数

-S 使用同步IO

16

7. Locktests

用来测试文件控制锁的功能。

一个主进程在一个文件域(字节范围锁)设置一把锁,几个子进程设法在这个区

域进行操作,比如:读、写、设置新琐等。

-n 进程个数

-f 在一个由-f定义的文件上进行测试

-T 用线程代替进程

测试结果:

每一次测试主进程都会上一把锁(读/写),子进程会在这锁部分执行以下操作:

写、读、设置一个读锁、设置一个写锁。

17

8. Mdtest

Mdtest是一个测试文件系统元数据性能的工具。

经常用到的一些参数的含义:

-d 测试运行的目录

-i 测试循环的次数

-n 每个进程将要创建/统计/删除的目录和文件数目

-w 文件创建以后写入多少bytes

-p 循环前的时间延迟

-D 只针对目录进行测试

-F 只针对文件进行测试

18

上图是一个mdtest的测试结果,测试参数为:测试运行的目录为/mnt/leofs,创

建/统计/删除的目录和文件数为2000,反复执行5次。

从上图可看到目录创建每秒能够完成的操作数最大为492.270次,每秒能够完成

的操作数平均为274.373次;文件创建每秒能够完成的操作数最大为1424.710次,

每秒能够完成的操作数平均为1150.642次。

19

9. Memtest

Memtest是一款免费的内存测试软件,测试准确度比较高,内存的隐性问题也能

检查出来.

> 测试内存的大小,‘all’代表测试所有可用的内存

[runs] 测试的次数

[-l or --log] 保存测试日志到当前目录的

20

如上图,测试100MB的内存,执行一次,结果保存到当前目录的。

Memtest一检测到缺陷位,就会在屏幕底部显示一条出错消息,但是测试还将继

续下去。如果完成几遍测试后,没有任何错误信息,那么我们可以确定内存是稳

定可靠的。如果你的系统有多根内存条,那么就需要单独测试每一根内存,这样

才能分清到底是哪根内存出错。其实 Memtest测试内存并不仅仅局限在测试内

存的好坏上,用它的完全测试模式跑几遍,还能检测内存和系统的稳定性。

21

10. Netperf

Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。

Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传

输(bulk data transfer)模式和请求/应答(request/reponse)模式。

Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送

数据,以及另外一个系统能够以多块的速度接收数据。

Netperf工具以client/server方式工作。server端是netserver,用

来侦听来自client端的连接,client端是netperf,用来向server发起

网络测试。在client与server之间,首先建立一个控制连接,传递有关测

试配置的信息,以及测试的结果;在控制连接建立并传递了测试配置信息以后,

client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模

式,以测试网络的性能。

TCP网络性能:

由于TCP协议能够提供端到端的可靠传输,因此被大量的网络应用程序使用。

但是,可靠性的建立是要付出代价的。TCP协议保证可靠性的措施,如建立并维

护连接、控制数据有序的传递等都会消耗一定的网络带宽。

Netperf可以模拟三种不同的TCP流量模式:

1) 单个TCP连接,批量(bulk)传输大量数据

2) 单个TCP连接,client请求/server应答的交易(transaction)方

3) 多个TCP连接,每个连接中一对请求/应答的交易方式

UDP网络性能:

UDP没有建立连接的负担,但是UDP不能保证传输的可靠性,所以使用UDP的

应用程序需要自行跟踪每个发出的分组,并重发丢失的分组。

22

Netperf可以模拟两种UDP的流量模式:

1) 从client到server的单向批量传输

2) 请求/应答的交易方式

由于UDP传输的不可靠性,在使用netperf时要确保发送的缓冲区大小不大于

接收缓冲区大小,否则数据会丢失,netperf将给出错误的结果。因此,对于

接收到分组的统计不一定准确,需要结合发送分组的统计综合得出结论。

Netperf的命令行参数

当netserver在server端启动以后,就可以在client端运行netperf来测试

网络的性能。netperf通过命令行参数来控制测试的类型和具体的测试选项。根

据作用范围的不同,netperf的命令行参数可以分为两大类:全局命令行参数、

测试相关的局部参数,两者之间使用--分隔:

netperf [global options]-- [test-specific options]

这里我们只解释那些常用的命令行参数:

-H host :指定远端运行netserver的server IP地址。

-l testlen:指定测试的时间长度(秒)

-t testname:指定进行的测试类型,包括TCP_STREAM,UDP_STREAM,

TCP_RR,TCP_CRR,UDP_RR,在下文中分别对它们说明。

Netperf测试网络性能

测试批量(bulk)网络流量的性能

批量数据传输典型的例子有ftp和其它类似的网络应用(即一次传输整个文件)。

根据使用传输协议的不同,批量数据传输又分为TCP批量传输和UDP批量传输。

1. TCP_STREAM

23

Netperf缺省情况下进行TCP批量传输,即-t TCP_STREAM。测试过程中,

netperf向netserver发送批量的TCP数据分组,以确定数据传输过程中的吞

吐量:

从netperf的结果输出中,我们可以知道以下的一些信息:

1) 远端系统(即server)使用大小为87380字节的socket接收缓冲

2) 本地系统(即client)使用大小为16384字节的socket发送缓冲

3) 向远端系统发送的测试分组大小为16384字节

4) 测试经历的时间为60秒

5) 吞吐量的测试结果为88Mbits/秒

在缺省情况下,netperf向发送的测试分组大小设置为本地系统所使用的

socket发送缓冲大小。

TCP_STREAM方式下与测试相关的局部参数如下表所示:

参数 说明

-s size

设置本地系统的socket发送与接收缓冲大小

-S size

设置远端系统的socket发送与接收缓冲大小

-m size

设置本地系统发送测试分组的大小

-M size

设置远端系统接收测试分组的大小

-D

24

对本地与远端系统的socket设置TCP_NODELAY选项

11. IOR

12. Iostat

iostat的语法如下:

其中,-c仅显示CPU的状态;-d仅显示存储设备的状态,不可以与-c一起使用;

-k预设显示的是block,这里可以改成为kilobytes的大小来显示;-t显示日期出

来;-V表示打印出版本信息和用法;-x device指定要统计的设备名称,默认为

所有的设备;interval指每次统计间隔的时间;count指按照这个时间间隔统计的

次数。

tps:平均每秒钟的传送次数,与资料传送次数有关,非容量!

Blk_read/s:开机到现在平均每秒的读取速度。

Blk_wrtn/s:开机到现在平均每秒的写入速度。

Blk_read:开机到现在总共读的数据量。

Blk_wrtn:开机到现在总共写的数据量。

25

上图的命令行含义为每2秒钟检测一次,共检测3次存储设备。

rrqm/s: 每秒进行 merge 的读操作数目,即 delta(rmerge)/s

wrqm/s: 每秒进行 merge 的写操作数目,即 delta(wmerge)/s

r/s: 每秒完成的读 I/O 设备次数,即 delta(rio)/s

w/s: 每秒完成的写 I/O 设备次数,即 delta(wio)/s

rsec/s: 每秒读扇区数,即 delta(rsect)/s

wsec/s: 每秒写扇区数,即 delta(wsect)/s

rkB/s: 每秒读K字节数,是 rsect/s 的一半,因为每扇区大小为512字节。

wkB/s: 每秒写K字节数,是 wsect/s 的一半。

avgrq-sz: 平均每次设备I/O操作的数据大小(扇区),即

delta(rsect+wsect)/delta(rio+wio)。

avgqu-sz: 平均I/O队列长度,即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。

await: 平均每次设备I/O操作的等待时间 (毫秒),即

delta(ruse+wuse)/delta(rio+wio)。

26

svctm: 平均每次设备I/O操作的服务时间 (毫秒),即 delta(use)/delta(rio+wio)

%util: 1秒中有百分之多少的时间用于 I/O 操作,或者说1秒中有多少时间 I/O

队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)。

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁

盘可能存在瓶颈。

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),

svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多

也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及

I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明

I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用

得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑

更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是

按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。

上图的命令行的参数含义为每1秒钟检测一次,共检测3次所有的设备。

27

13. Iozone

iozone()是一个文件系统的benchmark工具,可以测试不同的操

作系统中文件系统的读写性能。

可以测试 Read, write, re-read, re-write, read backwards, read strided, fread, fwrite,

random read, pread, mmap, aio_read, aio_write 等等不同的模式下的硬盘的性能。

测试参数: -i # 用来指定测试内容,我们主要用到以下三种:

0=write/rewrite

1=read/re-read

2=random-read/write

测试格式为-i #,比如测试写:-i 0,测试读和写:-i 0 -i 1。

-R 产生execl格式的输出日志

-b 将产生二进制的execl的日志文件名。

-s 测试的文件大小

-r 文件块大小

-a 在希望的文件系统上测试,不过只有-a的话会进行全面测试,要花费很长时

间,最好用-i指定测试范围。

-g 指定最大测试文件大小

-n 指定最小测试文件大小

-t 启动线程的个数

-f 指定临时测试文件

-F 指定临时测试文件组

-C 显示每个节点的吞吐量。

-c 测试包括文件的关闭时间

-e 测试包括flush时间

-w 测试结束后保留测试时产生的测试文件

28

上图显示了一个iozone的测试结果的一部分,测试文件块的大小为1m,测试文

件的大小2G,线程个数为5,会产生5个2G的临时测试文件,测试时产生的文

件都存放在/mnt/leofs/下面,测试包括文件的关闭时间和flush时间,结果显示每

个节点的吞吐量,测试结束后会保留测试时产生的测试文件,测试内容包含写/

重写、读/重读,测试时产生的二进制日志会保存在中。5个进程总的

写吞吐量为:104750.83 KB/sec.

通常情况下,测试的文件大小要求至少是系统cache的两倍以上,这样,测试的

结果才是真是可信的。如果小于cache的两倍,文件的读写测试读写的将是cache

的速度,测试的结果大打折扣。

29

14. Simul

Simul是一个并行文件系统的测试工具,它可以同时模拟多个结点和进程来执行

文件系统的操作来测试并行文件系统的准确性和一致性。

主要参数含义:

-d 测试将要运行的目录

-f 开始测试时的测试编号(缺省为0)

-l 最后测试时的测试编号(缺省为39)

-i 测试过程中包含的测试编号

-e 测试过程中不包括的测试编号

-n每次测试重复的次数

-N 所有的测试重复的次数

simul –d /mnt/leofs –f 13

测试将从编号13开始,以后运行的测试的编号都大于13。

simul –d /mnt/leofs –l 16

测试将从编号0开始,以后运行的测试的编号不会大于16。

simul –d /mnt/leofs –f 5 –l 8

测试将要运行编号5,6,7,8。

simul –d /mnt/leofs –i 2,4,7,38

测试仅仅执行编号为2,4,7,38的测试。

30

所有可用的测试编号见下图:

由上图可知,测试目录为/mnt/leofs/,测试执行的为5到20,测试结果为All test

passed!

31

15. large_file_test_tools

large_file_test_tools是公司内部自己撰写的测试工具,主要用作文件系统的

正确性测试工具,此工具依赖pthread与MPI库,可用作单机和多机并发的正确

性测试,此工具利用mpirun程序进程正确性测试,测试工具包括单线程和多线

程的顺序读写、随机读写等一系列测试,主要有以下几个测试程序:

工具名称 功能

1 file_wr_pthread

2 file_wr_pthread_nolock

3 file_wr_pthread_random

4 file_wr_pthread_nolock_random

多线程顺序读写正确性测试

多线程顺序(无锁)读写正确性测试

多线程随机读写正确性测试

多线程随机(无锁)读写正确性测试

主要参数含义:

filelen:被测试的文件大小(如:100Kb、100Mb、1Gb)

segment:每次读写的块大小(如:1Kb、1Mb)

optype:程序运行模式(1:只写 2:只读 3:读/写)

dosync:测试时是否采用sync模式(0:不采用 其它:采用)

32

parentpath:文件的读写路径(如:/mnt/leofs/file)

fileno:读写测试时文件总数

threadno:读写的总线程数

结合mpi使用:

a) mpi安装

anode45:~/djp/test_tools#: tar zxvf

anode45:~/djp/test_tools#: ./configure –prefix=/usr/local

anode45:~/djp/test_tools#: make && make install

b)配置rsh(略)

c) mpi配置

需要测试多机时需修改/usr/local/share/,添加所有机

器的主机名,每主机名以单行形式列出

d)运行

其中-np后数字表示cpu个数

16.

33