Linux文件系统读写性能测试

时间:2020-03-21 11:46:03  来源:igfitidea点击:

负责处理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是一个非常好的工具。