感谢支持
我们一直在努力

Linux基础教程:关于Linux IO性能测试的实验

开发环境系统配置如下:

Intel SR1625 server , 2 CPU, 32GB内存, 用主板自带卡做了raid1+0,8个7200转SATA硬盘

操作系统是RHEL 5.3 64位

因为物理内存是32GB,因此整个过程都选用了60GB+的数据量来测试,以避免cache的影响

1. 首先用自带的dd命令先测一下, 块大小为8k

dd只能提供一个大概的测试结果,而且是连续IO而不是随机IO

读测试

# time dd if=/dev/sda2 f=/dev/null bs=8k count=8388608

8388608+0 records in

8388608+0 records out

68719476736 bytes (69 GB) copied, 516.547 seconds, 133 MB/s

Linux 如何测试 IO 性能(磁盘读写速度)

这几天做MySQL性能测试,偌大一个公司,找几台性能测试机器都很纠结,终于协调到两台,IO的性能如何还不知道。
 数据库属于IO密集型的应用,所以还是先评估下Server的IO性能,看看是否能和线上的机器匹配上。

 之前一直知道用dd(device to device)命令可以简单测试磁盘的IO读写速度,但没有深究。
 但这次做性能测试的关系,需要得到一个相对精确的值(之前的测试吃过这方面的亏,插个题外话,性能测试一定要首先确认好测试环境。)
 网上常见的方法是使用hdparm和dd命令来测试,但实际的使用起来都有问题,而且测试结果总感觉有偏差,心里没底。
 于是还是安心研究了下这两个命令,也做了一些测试和分析,简单做下总结。

用法:
1.测试IO读
    hdparm -t –direct /dev/sda3

      IO读用上面的命令测试即可,不过 hdparm 这个工具需要自己安装,而且需要root用户去执行。

2.测试IO写
    sync;/usr/bin/time -p bash -c “(dd if=/dev/zero of=test.dd  bs=1000K count=20000;sync)”

    dd bs=1M count=20000 if=/dev/zero of=test.dd conv=fdatasync  dd命令测试是IO的顺序写和读方式。

3.查看文件系统块大小

  tune2fs -l /dev/sda1 | grep Block

上面的命令行有些复杂,做下详细的解释:
 (1)sync 命令用来刷新文件系统的缓冲区,执行sync命令实际的作用是把内存中的数据缓冲写入到磁盘中。
        先执行下sync命令,是为了减少对后面测试的影响。也可以使用 echo 3 > /proc/sys/vm/drop_caches 来清除缓存。
 (2)time 命令用来测试命令的执行时间,shell内建还有一个time命令,我们这里使用全路径来指定使用的是非内建命令。
        -p 选项设置时间的输出格式为POSIX缺省时间格式,单位是秒,在后面的测试小节可以看到time -p 的输出形式。
 (3)bash 命令 -c 选项的作用是将后面的字符串参数当作bash脚本来执行,看起来有些画蛇添足,好像直接执行也是可行的,
        其实不然,因为后面字符串中包含了两条命令行,而time命令需要统计这两条命令行的执行时间。
 (4)小括号的意思是另起一个子进程来执行括号中的脚本,dd 这条命令行这里就不讲了,不知道的话Baidu吧。
        重点是sync命令,因为当dd退出时,这条命令行提交的大部分内容都在内存缓冲区(写缓存),甚至如果机器的内存相比于你提交的数据要大得多,
        那可能数据都在内存中,而再执行sync才能将内存中的数据写入到磁盘中,否则就成了测试内存的写速度,那显然不是你想要的结果。

测试实践:
 在一台内存64G,SAS硬盘上做了一些测试。
 测试过程中,需要关注两点,磁盘的读写速度和IO使用率,我们分别使用iopp和iostat工具来观察。

测试写速度:
 测试写入20G数据,数据量越大,测试值应该更精确。
# sync;/usr/bin/time -p bash -c “(dd if=/dev/zero of=test.dd  bs=1M count=20000)”
 20000+0 records in
 20000+0 records out
 real 92.87
 user 0.00
 sys 18.08

写入20000M的时间是92.87s,所以磁盘的写速度为 215.35MB/sec (20000M/92.87)。
 使用iostat观测,%util 一直处于100%的状态,而iopp 显示的dd命令写入速度基本和上面计算出的值是一致的(取样时间设置为5s)
 # iostat -x 5
 Device:        rrqm/s  wrqm/s    r/s    w/s  rsec/s  wsec/s avgrq-sz avgqu-sz  await  svctm  %util
 sda              0.00    0.00    0.20  864.00    1.60 449004.80  519.56  143.61  163.46  1.16 100.00

 # iopp -i -k 5
 pid    rchar    wchar    syscr    syscw      rkb      wkb    cwkb command
 32566  1033216  1033216        0        0        0  1034868        0 dd

注:命令行的当前工作目录在分区/dev/sda3上,所以test.dd这个文件也创建在这个分区上,下面的读测试会使用到这个文件。

测试读速度:
 将dd 和 hdparm的做一个对比:
#  hdparm -t –direct /dev/sda3
 /dev/sda3:
  Timing O_DIRECT disk reads: 2108 MB in  3.00 seconds = 702.34 MB/sec

 hdparm的测试结果为,3s读取了2108MB,读速度为702.34MB。

 由于hdparm测试时间太短,iostat和iopp取样时间调整为1s。

iostat -x 1
 Device:        rrqm/s  wrqm/s    r/s    w/s  rsec/s  wsec/s avgrq-sz avgqu-sz  await  svctm  %util
 sda              0.00    0.00 2752.00    1.00 1409024.00    8.00  511.82    4.64    1.69  0.35  96.10

iopp -i -k 1
 pid    rchar    wchar    syscr    syscw      rkb      wkb    cwkb command
 32349  733184        0        0        0  733184        0        0 hdparm

使用dd做读取测试
# echo 3 > /proc/sys/vm/drop_caches ; /usr/bin/time -p dd if=test.dd of=/dev/null  bs=1M
 20000+0 records in
 20000+0 records out
 real 35.69
 user 0.00
 sys 9.81

读取了20G,读速度为560.38MB/sec。

 读取会比写入要快,iostat和iopp的取样时间调整为每3s。
Device:        rrqm/s  wrqm/s    r/s    w/s  rsec/s  wsec/s avgrq-sz avgqu-sz  await  svctm  %util
 sda            106.67    0.00 5851.00    0.33 1434256.00    2.67  245.12    1.62    0.28  0.16  93.60

 pid    rchar    wchar    syscr    syscw      rkb      wkb    cwkb command
 17004  1449984  1449984        1        1  1450760        0        0 dd

结论:

dd测试出的读速度和hdparm 是存在区别的,
 通过 bs 选项 设置不通的读写块大小测试(默认512字节,测试使用1M),
 可以看出 dd 的测出的速度与读写块的大小有关系,还可能受到系统中有IO读写的进程的影响。
hdparm的测试原理没做深入研究,可能是和dd的测试方法存在差别,需要知道这一点。

 整体上看,IO的实际测试速度是受到很多因素影响的,包括读写的方式(随机还是顺序,hdparm和dd测试是都是采用顺序读写)、缓存机制、测试的取样等等。
 所以不太可能得到一个确定的值(相同的命令行多次测试也不一样,不过差别要小些),以上的方法中读测试还是推荐使用hdparm。
 以上的数据虽然存在偏差,但还是能大体分析出机器的IO性能。只是需要明确,这些测试值是在什么样的环境下获得的。


real 8m36.926s


user 0m0.117s


sys 0m55.216s


写测试


# time dd if=/dev/zero f=/opt/iotest bs=8k count=8388608


8388608+0 records in


8388608+0 records out


68719476736 bytes (69 GB) copied, 888.398 seconds, 77.4 MB/s


real 14m48.743s


user 0m3.678s


sys 2m47.158s


读写测试


# time dd if=/dev/sda2 f=/opt/iotest bs=8k count=8388608


8388608+0 records in


8388608+0 records out


68719476736 bytes (69 GB) copied, 1869.89 seconds, 36.8 MB/s


real 31m10.343s


user 0m2.613s


sys 3m25.548s

2. 接下来用Oracle 《www.linuxidc.com》的orion 《http://www.oracle.com/technology/software/tech/orion/index.html》工具来测一下


解压即可使用


# gzip orion_linux_x86-64.gz


测异步IO时需要libaio库


# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64


# echo $LD_LIBRARY_PATH


:/opt/oracle/product/10.2.0/lib:/usr/lib64


创建配置文件mytest.lun,列出要测试的分区即可。 注意文件名前缀要跟下面的 testname一致


# vi mytest.lun


查看mytest.jun内容


# cat mytest.lun


/dev/sda2


先来个simple test


# 。/orion_linux_x86-64 -run simple -testname mytest -num_disks 8

查看测试结果


# cat mytest_20081111_1431_summary.txt


ORION VERSION 11.1.0.7.0


Commandline:


-run simple -testname mytest -num_disks 8


This maps to this test:


Test: mytest


Small IO size: 8 KB


Large IO size: 1024 KB


IO Types: Small Random IOs, Large Random IOs


Simulated Array Type: CONCAT


Write: 0%


Cache Size: Not Entered


Duration for each Data Point: 60 seconds


Small Columns:, 0


Large Columns:, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16


Total Data Points: 38


Name: /dev/sda2 Size: 629143441920

1 FILEs found.


Maximum Large MBPS=56.97 @ Small=0 and Large=7


Maximum Small IOPS=442 @ Small=40 and Large=0


Minimum Small Latency=14.62 @ Small=1 and Large=0


最大MBPS为56.97,最大IOPS为442


再测一下8k随机读操作


# 。/orion_linux_x86-64 -run advanced -testname mytest -num_disks 8 -size_small 8 -size_large 8 -type rand &


看看结果


# cat mytest_20081111_1519_summary.txt


ORION VERSION 11.1.0.7.0


Commandline:


-run advanced -testname mytest -num_disks 8 -size_small 8 -size_large 8 -type rand


This maps to this test:


Test: mytest


Small IO size: 8 KB


Large IO size: 8 KB


IO Types: Small Random IOs, Large Random IOs


Simulated Array Type: CONCAT


Write: 0%


Cache Size: Not Entered


Duration for each Data Point: 60 seconds


Small Columns:, 0


Large Columns:, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16


Total Data Points: 38


Name: /dev/sda2 Size: 629143441920


1 FILEs found.


Maximum Large MBPS=3.21 @ Small=0 and Large=13


Maximum Small IOPS=448 @ Small=38 and Large=0


Minimum Small Latency=15.16 @ Small=1 and Large=0

最大MBPS为3.21(这么低??),最大IOPS为448


再测一下1M顺序读操作, 失败了, 原因不明。..


# 。/orion_linux_x86-64 -run advanced -testname mytest -num_disks 8 -size_small 1024 -size_large 1024 -type seq


ORION: Oracle IO Numbers — Version 11.1.0.7.0


mytest_20081114_1349


Test will take approximately 73 minutes


Larger caches may take longer


rwbase_run_test: rwbase_reap_req failed


rwbase_run_process: rwbase_run_test failed


rwbase_rwluns: rwbase_run_process failed


orion_warm_cache: Warming cache failed. Continuing


看看结果


# cat mytest_20081111_1620_summary.txt


ORION VERSION 11.1.0.7.0


Commandline:


-run advanced -testname mytest -num_disks 8 -size_small 1024 -size_large 1024 -type seq


This maps to this test:


Test: mytest


Small IO size: 1024 KB


Large IO size: 1024 KB


IO Types: Small Random IOs, Large Sequential Streams


Number of Concurrent IOs Per Stream: 4


Force streams to separate disks: No


Simulated Array Type: CONCAT


Write: 0%


Cache Size: Not Entered


Duration for each Data Point: 60 seconds


没结果,失败

3. 用iozone 来测一下


安装


# tar -xvf iozone3_345.tar


# make linux-AMD64


指定64G的文件,只测read/reread和write/rewrite,记录大小从4k-16k.同时生成一个excel文件iozone.wks


# 。/iozone -Rab iozone.wks -s64G -i 0 -i 1 -y 4k -q 16k


Iozone: Performance Test of File I/O


Version $Revision: 3.345 $


Compiled for 64 bit mode.


Build: linux-AMD64


Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins


Al Slater, Scott Rhine, Mike Wisner, Ken Goss


Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,


Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,


Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,


Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,


Fabrice Bacchella, Zhenghua Xue, Qin Li.


Run began: Tue Nov 11 10:23:25 2008


Excel chart generation enabled


Auto Mode


File size set to 67108864 KB


Using Minimum Record Size 4 KB


Using Maximum Record Size 16 KB


Command line used: 。/iozone -Rab iozone.wks -s64G -i 0 -i 1 -y 4k -q 16k


Output is in Kbytes/sec


Time Resolution = 0.000001 seconds.


Processor cache size set to 1024 Kbytes.


Processor cache line size set to 32 bytes.


File stride size set to 17 * record size.


random random bkwd record stride


KB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread


67108864 4 72882 69470 104898 125512


67108864 8 72083 69256 133689 109061


67108864 16 73375 69155 142019 116034


iozone test complete.


Excel output is below:


“Writer report”


“4” “8” “16”


“67108864” 72882 72083 73375


“Re-writer report”


“4” “8” “16”


“67108864” 69470 69256 69155


“Reader report”


“4” “8” “16”


“67108864” 104898 133689 142019


“Re-Reader report”


“4” “8” “16”


“67108864” 125512 109061 116034


可以看到,8k的写是72M/s左右,读是133M/s左右,跟dd的结果比较接近


测一下64G文件8k随机读写


# 。/iozone -Rab iozone.wks -s64G -i 2 -y 8k -q 8k


Iozone: Performance Test of File I/O


Version $Revision: 3.345 $


Compiled for 64 bit mode.


Build: linux-AMD64


Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins


Al Slater, Scott Rhine, Mike Wisner, Ken Goss


Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,


Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,


Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,


Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,


Fabrice Bacchella, Zhenghua Xue, Qin Li.


Run began: Fri Nov 14 15:52:01 2008


Excel chart generation enabled


Auto Mode


File size set to 67108864 KB


Using Minimum Record Size 8 KB


Using Maximum Record Size 8 KB


Command line used: 。/iozone -Rab iozone.wks -s64G -i 2 -y 8k -q 8k


Output is in Kbytes/sec


Time Resolution = 0.000001 seconds.


Processor cache size set to 1024 Kbytes.


Processor cache line size set to 32 bytes.


File stride size set to 17 * record size.


random random bkwd record stride


KB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread


67108864 8


Error reading block at 6501007360


read: Success


出错了(??)

赞(0) 打赏
转载请注明出处:服务器评测 » Linux基础教程:关于Linux IO性能测试的实验
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏