您的位置:首页 > 其它

嵌入式系统的性能测试(2) – iozone篇

2013-09-30 08:38 169 查看
iozone是一个文件系统性能评测工具,可以测试Read, write, re-read,re-write, read backwards, read strided, fread, fwrite, random read, pread, mmap, aio_read, aio_write 等不同模式下不同文件系统的读写性能。本文介绍了它的各种功能,如何针对ARM进行交叉编译,以及如何配置合理参数进行评测。通过在RAMFS上运行iozone,亦可测试内存子系统的性能。

1. 介绍

iozone的web site位于:

http://www.iozone.org/

本文中使用的软件为:

http://www.iozone.org/src/current/iozone3_414.tar

iozone的主要测试内容:

Write: 测试向一个新文件写入的性能。当新文件被写入时,除了文件中的数据,还有被称作“元数据”的额外信息也需要被存储。这些额外信息包括目录信息,所分配的空间和一些与该文件有关但又并非该文件所含数据的其他数据。因为这些额外信息,Write的性能通常会比Re-write的性能低。

Re-write: 测试向一个已存在的文件写入的性能。因为此时元数据已经存在。Re-write的性能通常比Write的性能高。

Read: 测试读一个已存在的文件的性能。

Re-Read: 测试读一个最近读过的文件的性能。因为操作系统通常会缓存最近读过的文件数据,Re-Read性能会高些。

Random Read: 测试读一个文件中的随机偏移量的性能。

Random Write: 测试写一个文件中的随机偏移量的性能。

Random Mix: 测试读写一个文件中的随机偏移量的性能。在随机访问的时候,许多其他因素可能影响测试结果,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。

Backwards Read: 测试使用倒序读一个文件的性能。尽管不常见,但事实上确实有些应用这么干,例如MSC Nastran。

Record Rewrite: 测试写与覆盖写一个文件中的特定块的性能。在跨越L1 cache、L2 cache和操作系统缓存边界时,测试结果会发生突然变化。

Strided Read: 测试跳跃读一个文件的性能。例如:每间隔200Kbytes,读4Kbytes并重复这个模式。文件中使用了数据结构并且访问这个数据结构的特定区域的应用程序常常这样做。

Fwrite: 测试调用库函数fwrite()来写文件的性能。这个测试是针对新文件,所以包括元数据的写入。

Frewrite:测试调用库函数fwrite()来写文件的性能。类似Re-write操作,因为是针对已存在的文件,无元数据操作,测试的性能会高些。

Fread:测试调用库函数fread()来读文件的性能。

Freread: 这个测试与上面的fread 类似,类似Re-Read,因为操作系统缓存了文件数据会导致测试结果比较高。

几个特殊测试:

Mmap: 这个测试就是测量使用mmap()机制完成I/O的性能。许多操作系统支持mmap()的使用来映射一个文件到用户地址空间。映射之后,对内存的读写将同步到文件中去。这对一些希望将文件当作内存块来使用的应用程序来说很方便。一个例子是内存中的一块将同时作为一个文件保存在于文件系统中。mmap 文件的语义和普通文件略有不同。如果发生了对内存的存储,并不是立即发生相应的文件I/O操作。使用MS_SYNC 和MS_ASYNC标志位的 msyc()函数调用将控制内存和文件的一致性。调用msync()
时将MS_SYNC置位将强制把内存里的内容写到文件中去并等待直到此操作完成才返回。而MS_ASYNC 置位则告诉操作系统使用异步机制将内存刷新到磁盘,这样应用程序可以直接返回而不用等待此操作的完成。

Async I/O: 这个测试测量POSIX异步I/O机制的性能。许多操作系统支持的另外一种I/O机制是POSIX 标准的异步I/O。本程序使用POSIX标准异步I/O接口来完成此测试功能。例如: aio_write(), aio_read(), aio_error()。

2. 针对ARM交叉编译:

iozone对交叉编译的支持算是比较好的。打开iozone3_414/src/current/Makefile找到CC和GCC的定义并修改成如下内容。

CC = arm-xilinx-linux-gnueabi-gcc

GCC = arm-xilinx-linux-gnueabi-gcc

注意:这里使用的是PetaLinux 2013.04的tool chain,使用前要先到PetaLinux目录下'source settings.sh’

然后用命令'make linux-arm’即可完成编译。编译成功后 生成可执行文件iozone。

3. 在zc706上运行iozone

可以用以下命令看iozone的详细参数列表和解释:

./iozone –h

iozone有很多参数。在这里我们关注的是如何用iozone通过ramfs来测试和比较内存性能,在zc706上使用的命令如下:

./iozone -Raz -b out.xls -i 0 -i 1 -i 2 -S 512 -g 8M -+r

常用参数说明如下:

-R: 产生EXCEL格式的报告

-a: 全自动模式。生成包括所有测试操作的报告,使用的块 大小从4k到16M,文件大小从64k到512M。

-f filename: 用来指定测试时使用的临时文件的文件名。

-z: 和-a一起,指定测试所有可能的record size

-S: 指定process cache的大小,单位是Kbytes。

-g -n: 指定file size的最大值和最小值。文件越大测试时间越长。测试文件的大小一定要大过cache,否则会使数值非常不真实。

-+r:在打开文件时的flag中包含O_RSYNC和O_SYNC,即同步读和同步写,保证数据真正写到硬件上和真正从硬件上读数据。

可以用以下命令创建ram file system以供测试

mkdir -p /home/root/tmpfs

mount tmpfs /home/root/tmpfs -t tmpfs -O size=32M

mkdir -p /home/root/ramfs

mount -t ramfs none /home/root/ramfs -o maxsize=32768

注意:缺省情况下,Ramfs被限制最多可使用内存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。

mkdir -p /home/root/ramdisk

mke2fs /dev/ram1 -L "ramdisk" -b 1024 -m 0

mount -t ext2 /dev/ram1 /home/root/ramdisk

注意: ramdisk的大小在配置Linux kernel的时候被指定。

进入到相应的目录,执行以下命令完成测试:

tar xvf /mnt/iozone3_414.tar

cd iozone3_414/src/current/

./iozone -Raz -b out.xls -i 0 -i 1 -i 2 -S 512 -g 8M -+r

生成的xls report里面,行是记录大小,列是测试文件大小,单位为Kbytes。表格中的数据是传输速度,单位为Kbytes/s。

从测试结果来看,有如下结论

* 因为是对ram file system测试,是否打开数据同步对性能影响不大。

* 对Write操作,性能ramfs>tmpfs>>ramdisk; 对Read操作,性能ramfs>ramdisk>tmfs。可以认为ramfs的开销更小,更能反映main memory的性能。值得注意的是ramdisk的写性能很差,只有ramfs和tmpfs的1/4左右。

4. 测试PL MIG的性能:

Linux的memory pool缺省是从高地址开始分配的。如果要测试PL MIG的性能,只需要简单的修改Linux的kernel command line即可。在U-BOOT里面运行命令:

setenv bootargs console=ttyPS0,115200 root=/dev/ram rw ip=192.168.1.10 earlyprintk mem=2048M

run sdboot

启动后cat /proc/meminfo可以看到Linux确实使用了2GB的内存。

重新运行benchmarker,即可得到PL DDR的性能数据。

注意:文件大小要大于L2 cache size(512KB)才有意义,否则数据都是在L1/L2 cache里面转来转去。

==END==
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: