Linux文件系统读写性能测试
负责处理Linux服务器的系统管理员有时会被告知对文件系统性能进行基准测试时感到困惑。
但是发生这种混乱的主要原因是,无论使用哪种工具来测试文件系统的性能都没有关系,重要的是确切的要求。
文件系统的性能取决于以下某些因素。
- 硬盘的最大转速
- 文件系统的已分配块大小
- 寻求时间
- 文件系统元数据的性能比率
- 读/写的类型
认真地说,认识到由不同人员甚至不同制造的各种不同技术正在一个盒子中协同工作是一件很奇妙的事情,我们称该盒子为计算机。
认识到硬盘存储几乎以数字格式存储了世界上所有可用的信息,这甚至更加奇妙。
了解硬盘如何真正安全地存储我们的数据是一件非常复杂的事情。
解释硬盘及其上的文件系统如何协同工作的不同方面超出了本文的范围(但是我一定会尝试一些有关它们的文章,以进行尝试
。
因为dd向我们报告的速度是数据缓存到内存而不是磁盘的速度。
因此,我们需要让dd命令仅在数据与磁盘同步后才报告速度,为此我们需要运行以下命令。
[root@theitroad2 ~]# dd if=/dev/zero of=speetest bs=1M count=100 conv=fdatasync 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 2.05887 seconds, 50.9 MB/s
我们可以清楚地看到,使用属性fdatasync,dd命令仅在将数据完全写入磁盘后才会显示状态速率。
因此,现在我们有了实际的顺序写入速度。
让我们看一下大于内存的数据量。
让我们以64kb的块大小接收200MB的数据。
[root@theitroad2 ~]# dd if=/dev/zero of=speedtest bs=64k count=3200 conv=fdatasync 3200+0 records in 3200+0 records out 209715200 bytes (210 MB) copied, 3.51895 seconds, 59.6 MB/s
我们可以清楚地看到速度达到了59 MB/s。
我们需要注意,如果未指定块大小,则默认情况下ext3将使用由mke2fs之类的程序确定的块大小进行格式化。
我们可以使用以下命令来验证身份。
tune2fs -l /dev/sda1 dumpe2fs /dev/sda1
要使用dd命令测试顺序读取速度,需要运行以下命令,如下所示。
[root@myvm1 sarath]# dd if=speedtest of=/dev/null bs=64k count=24000 5200+0 records in 5200+0 records out 340787200 bytes (341 MB) copied, 3.42937 seconds, 99.4 MB/s
使用HDPARM进行性能测试
现在让我们使用dd命令以外的其他工具进行测试。
我们将从hdparm命令开始测试速度。
在大多数linux发行版中,Hdparm工具也都可用。
[root@myvm1 ~]# hdparm -tT /dev/sda1 /dev/sda1: Timing cached reads: 5808 MB in 2.00 seconds = 2908.32 MB/sec Timing buffered disk reads: 10 MB in 3.12 seconds = 3.21 MB/sec
在上面的hdparm结果中,有很多事情要理解。
-t选项将向我们显示从缓存缓冲区读取的速度(这就是为什么它要高得多)的原因。
-T选项将显示不带预缓存缓冲区的读取速度(如上图所示,从上面的输出中读取速度为3.21 MB/sec。
)
hdparm输出将分别显示缓存读取和磁盘读取。
如前所述,硬盘寻道时间对速度也很重要,我们可以使用以下linux命令检查硬盘寻道时间。
寻道时间是硬盘到达存储数据的扇区所需的时间。
现在让我们使用此寻道器工具通过简单的seek命令找出寻道时间。
[root@theitroad2 ~]# seeker /dev/sda1 Seeker v3.0, 2009-06-17, http://www.linuxinsight.com/how_fast_is_your_disk.html Benchmarking /dev/sda1 [81915372 blocks, 41940670464 bytes, 39 GB, 39997 MB, 41 GiB, 41940 MiB] [512 logical sector size, 512 physical sector size] [1 threads] Wait 30 seconds.............................. Results: 87 seeks/second, 11.424 ms random access time (26606211 < offsets < 41937280284) [root@theitroad2 ~]#
它清楚地提到,我的磁盘执行了86次每秒搜索包含数据的扇区的操作。
对于台式机Linux机器来说可以,但是对于服务器来说则完全不行。
使用IOZONE进行读写基准测试:
现在,Linux中有一个工具可以一次性完成所有这些测试。
多数民众赞成在“ IOZONE”。
我们将在iozone的帮助下对我的/dev/sda1进行一些基准测试。
始终在购买计算机或者服务器时牢记某些目的。
一些服务器需要明智地提高性能,有些服务器需要顺序读取快速,而另一些服务器则需要考虑随机读取的顺序。
IOZONE将对驱动器进行大量性能基准测试非常有帮助。
iozone产生的输出太简短了。
默认命令行选项-a用于全自动模式,其中iozone将测试4k至16M的块大小和64k至512M的文件大小。
让我们使用-a选项进行测试,看看会发生什么。
[root@myvm1 ~]# iozone -a /dev/sda1 Auto Mode Command line used: iozone -a /dev/sda1 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. creditors you never heard random random bkwd record stride KB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 64 4 172945 581241 1186518 1563640 877647 374157 484928 240642 985893 633901 652867 1017433 1450619 64 8 25549 345725 516034 2199541 1229452 338782 415666 470666 1393409 799055 753110 1335973 2071017 64 16 68231 810152 1887586 2559717 1562320 791144 1309119 222313 1421031 790115 538032 694760 2462048 64 32 338417 799198 1884189 2898148 1733988 864568 1421505 771741 1734912 1085107 1332240 1644921 2788472 64 64 31775 811096 1999576 3202752 1832347 385702 1421148 771134 1733146 864224 942626 2006627 3057595 128 4 269540 699126 1318194 1525916 390257 407760 790259 154585 649980 680625 684461 1254971 1487281 128 8 284495 837250 1941107 2289303 1420662 779975 825344 558859 1505947 815392 618235 969958 2130559 128 16 277078 482933 1112790 2559604 1505182 630556 1560617 624143 1880886 954878 962868 1682473 2464581 128 32 254925 646594 1999671 2845290 2100561 554291 1581773 723415 2095628 1057335 1049712 2061550 2850336 128 64 182344 871319 2412939 609440 2249929 941090 1827150 1007712 2249754 1113206 1578345 2132336 3052578 128 128 301873 595485 2788953 2555042 2131042 963078 762218 494164 1937294 564075 1016490 2067590 2559306
注意:我们在上面看到的所有输出以KB /秒为单位
第一列显示使用的文件大小,第二列显示使用的记录的长度。
让我们了解某些列中的输出
第三列写:此列显示在Linux下在任何文件系统中创建新文件时的速度。
元数据存储涉及更多的开销。
例如,文件的索引节点及其在日志中的条目等。
因此,在文件系统中创建新文件总是比覆盖已创建的文件要慢。
第四列:重新写入:这显示了覆盖已创建文件时报告的速度
第五列-读取:这将报告读取现有文件的速度。
第六列“重新读取”:报告重新读取已读取文件的速度。
在所有操作系统中,都缓存了磁盘位置以加快访问速度。
因此,重新读取已读取的文件会更快。
第七列随机读取:这将显示访问单个文件的随机区域时的速度。
有时速度较慢。
第八列-随机写入:随机写入类似于随机读取。
而是通过访问文件中的随机区域来写入一个已经存在的文件。
第九列-随机混合:此列说明随机读取速度和随机写入速度的组合。
向后读取:此列报告进行向后读取的速度。
例如,从文件的末尾开始读取。
有关更多信息,请转至:url = http://www.iozone.org/我们可以使用iozone中可用的-b选项保存iozone的输出,如下所示。
[root@myvm1 ~]# iozone -a -b speedtest.xls
其中“ speedtest.xls”是输出文件。
现在,我们可以使用Open Office在excel工作表中打开此输出文件,并获得有关速度测试的完整详细报告。
iozone中提供的-s选项可用于指定要用于iozone测试的文件大小。
如下所示。
[root@theitroad2 ~]# iozone -a -s 4048 -i 0
上面的命令将以文件大小4MB运行iozone实用程序,并且仅会执行写入和重写测试,因为我们给了它0选项。
我们可以传递数字选项来仅进行选择性测试。
例如,0用于写入和重写,1用于1读取和重新读取,2用于随机读取和写入等(我们需要在数字选项之前使用-i选项)。
可以用于文件系统性能测试的另一个工具是bonnie
使用Bonnie进行读写性能测试
Bonnie还是一个非常不错的工具,可用于对Hardisk进行性能基准测试。
可以通过启用rpmforge repo进行安装。
现在运行如下所示的命令进行测试。
在安装了所需分区的目录中运行命令。
例如正在测试/dev/sda1(这是我的/)。
[root@theitroad2 ~]# bonnie Bonnie: Warning: You have 503MiB 内存, but you test with only 100MiB datasize! Bonnie: This might yield unrealistically good results, Bonnie: for reading and seeking and writing. Bonnie 1.5: File './Bonnie.4614', size: 104857600, volumes: 1 Writing with putc()... done: 24712 kiB/s 98.2 %CPU Rewriting... done: 789544 kiB/s 83.3 %CPU Writing intelligently... done: 253001 kiB/s 80.5 %CPU Reading with getc()... done: 26101 kiB/s 99.5 %CPU Reading intelligently... done: 3723094 kiB/s 101.8 %CPU Seeker 1...Seeker 2...Seeker 3...start 'em...done...done...done... Estimated seek time: raw 0.006ms, eff 0.001ms ---Sequential Output (nosync)--- ---Sequential Input-- --Rnd Seek -Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --04k (03) Machine MB kiB/s %CPU kiB/s %CPU kiB/s %CPU kiB/s %CPU kiB/s %CPU /sec %CPU slashr 1* 100 24712 98.2253001 80.5 789544 83.3 26101 99.53723094 102 173145.2 95.2
以上输出的最后一行显示了顺序输出,顺序输入和随机查找等。
我们需要传递-y选项以将数据同步到磁盘。
我们可以使用-s选项指定用于测试的文件大小。
[root@theitroad2 ~]# bonnie -y -s 1000
如何使用FIO进行IO基准测试
Fio还是另一个不错的小型工具,可用于基准测试特定驱动器的IO使用情况。
与我们看到的以前的工具不同,fio工具不与命令行方法一起运行。
将创建一个包含有关测试类型的完整参数的文件。
然后将此文件作为参数传递给“ fio”命令。
因此,让我们开始制作我们的fio测试文件及其参数。
将作为参数传递的文件将以
; -- start job file -
并将以
; -- end job file -
让我们用FIO和一个带有参数作为参数的文件进行测试。
[root@myvm1 sarath]# cat fiotest ; -- start job file - [random-writers] rw=randrw size=50m numjobs=1 ; -- end job file -
fio命令的输出描述性太强..但是(完全有不同的文档可以理解fio命令的输出)
在带有“参数文件”的fio命令末尾,我们将看到测试的总结。
Run status group 0 (all jobs): READ: io=25708KB, aggrb=306KB/s, minb=306KB/s, maxb=306KB/s, mint=83860msec, maxt=83860msec WRITE: io=25492KB, aggrb=303KB/s, minb=303KB/s, maxb=303KB/s, mint=83860msec, maxt=83860msec Disk stats (read/write): sda: ios=6422/5964, merge=0/238, ticks=81457/2073064, in_queue=2173820, util=98.75%
总结显示以下内容。
Aggrb:测试中使用的所有进程线程的总带宽
Minb:最小带宽
Maxb:最大带宽
Ios:使用磁盘执行的总输入输出操作。
在队列中:花费在队列中的总时间
util:显示测试期间磁盘忙于IO操作的持续时间的百分比。
在我们的示例输出中,util的利用率为98%,在执行任务期间,磁盘几乎忙于IO操作。
如果要在密集的IO操作期间测试磁盘的性能,FIO是一个非常好的工具。