zoukankan      html  css  js  c++  java
  • 硬盘性能测试

    磁盘 I/O 的概念

    I/O 的概念,从字义来理解就是输入输出。操作系统从上层到底层,各个层次之间均存在 I/O。比如,CPU 有 I/O,内存有 I/O, VMM 有 I/O, 底层磁盘上也有 I/O,这是广义上的 I/O。通常来讲,一个上层的 I/O 可能会产生针对磁盘的多个 I/O,也就是说,上层的 I/O 是稀疏的,下层的 I/O 是密集的。

    磁盘的 I/O,顾名思义就是磁盘的输入输出。输入指的是对磁盘写入数据,输出指的是从磁盘读出数据。我们常见的磁盘类型有 ATA、SATA、FC、SCSI、SAS。这几种磁盘中,服务器常用的是 SAS 和 FC 磁盘,一些高端存储也使用 SSD 盘。每一种磁盘的性能是不一样的。

    硬盘性能指标

    SAN(Storage Area Network, 存储区域网络)和NAS存储(Network Attached Storage,网络附加存储)一般都具备2个评价指标:IOPS和带宽(throughput,也叫吞吐量),两个指标互相独立又相互关联。体现存储系统性能的最主要指标是IOPS。下面,将介绍一下这两个参数的含义。

    IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标。另一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。

    简而言之:
    磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。
    磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。

    IOPS可细分为如下几个指标:
    Toatal IOPS,混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。
    Random Read IOPS,100%随机读负载情况下的IOPS。
    Random Write IOPS,100%随机写负载情况下的IOPS。
    Sequential Read IOPS,100%顺序读负载情况下的IOPS。
    Sequential Write IOPS,100%顺序写负载情况下的IOPS。

    IOPS 与吞吐量的关系

    每秒 I/O 吞吐量= IOPS* 平均 I/O SIZE。从公式可以看出: I/O SIZE 越大,IOPS 越高,那么每秒 I/O 的吞吐量就越高。因此,我们会认为 IOPS 和吞吐量的数值越高越好。

    对于同一个磁盘(或者 LUN),随着每次 I/O 读写数据的大小不通,IOPS 的数值也不是固定不变的。例如,每次 I/O 写入或者读出的都是连续的大数据块,此时 IOPS 相对会低一些;在不频繁换道的情况下,每次写入或者读出的数据块小,相对来讲 IOPS 就会高一些。也就是说,IOPS 也取决与I/O块的大小,采用不同I/O块的大小测出的IOPS值是不同的。 对一个具体的IOPS, 先了解它当时测试的I/O块的尺寸,再做性能对比。并且IOPS都具有极限值,表1列出了各种磁盘的 IOPS 极限值。

    总之,IOPS和数据吞吐量作为硬盘性能的两个重要指标,我们对其的关注应该适用于不同的场合:比如

    读取10000个1KB文件,用时10秒 Throught(吞吐量)=1MB/s ,IOPS=1000 追求IOPS
    读取1个10MB文件,用时0.2秒 Throught(吞吐量)=50MB/s, IOPS=5 追求吞吐量

     参考:https://www.cnblogs.com/sddai/p/8647795.html


     关于磁盘性能测试,这里使用两个命令工具:dd和fio

    dd命令:

    dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

    参数说明:

    1. if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >

    2. of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >

    3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。

        obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

        bs=bytes:同时设置读入/输出的块大小为bytes个字节。

    4. cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。

    5. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。

    6. seek=blocks:从输出文件开头跳过blocks个块后再开始复制。

    注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。

    7. count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

    8. conv=conversion:用指定的参数转换文件。

        ascii:转换ebcdic为ascii

        ebcdic:转换ascii为ebcdic

        ibm:转换ascii为alternate ebcdic

        block:把每一行转换为长度为cbs,不足部分用空格填充

        unblock:使每一行的长度都为cbs,不足部分用空格填充

        lcase:把大写字符转换为小写字符

        ucase:把小写字符转换为大写字符

        swab:交换输入的每对字节

        noerror:出错时不停止

        notrunc:不截短输出文件

        sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

     

    /dev/null和/dev/zero:

    /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。

    /dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。

     

    测试硬盘的读写速度:

    dd if=/dev/zero of=/root/test bs=8k count=100000              -- 写

    dd if=/root/test of=/dev/null bs=8k count=100000                -- 读

    通过以上两个命令输出的命令执行时间,可以计算出硬盘的写、读速度

    发现把bs(每次读写的字节数)改大一些,磁盘的读写速度会提高,理论上bs越大,测得的性能越高。

    注意:dd 只能提供一个大概的测试结果,而且是连续 I/O 而不是随机 I/O,理论上文件规模越大,测试结果越准确。 同时,iflag/oflag 提供 direct 模式,direct 模式是把写入请求直接封装成 I/O 指令发到磁盘,非 direct 模式只是把数据写入到系统缓存就认为 I/O 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘。

    fio工具:

    安装:yum install libaio-devel fio(其中安装libaio-devel的原因见下的参数说明ioengine)

    fio参数说明:

    fio -filename=/root/iotest -direct=1 -iodepth=1  -rw=randrw  -ioengine=libaio -bs=16k -size=2G -numjobs=4 -runtime=30 -group_reporting -name=mytest

    filename=/root/test 测试文件名称,通常选择需要测试的盘的data目录。
    direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
    iodepth=1 队列深度 rw
    =randwrite 测试随机写的I/O rw=randrw 测试随机写和读的I/O
    ioengine=libaio io引擎,如果要使用libaio引擎,需要yum install libaio-devel包 bs
    =16k 单次io的块文件大小为4k size=1g 本次的测试文件大小为1g,以每次16k的io进行测试。 numjobs=4 本次的测试线程为4. runtime=30 测试时间为30秒,如果不写则一直将1g文件分16k每次写完为止。
    group_reporting 关于显示结果的,汇总每个进程的信息

    测试举例:

    dd if=/dev/zero  of=/root/iotest bs=4k count=262144(创建1G的文件)

    fio -filename=/root/iotest -direct=1 -iodepth=1  -rw=randrw  -ioengine=libaio -bs=16k -size=1G -numjobs=4 -runtime=30 -group_reporting -name=mytest

    read : io=139888KB, bw=4662.2KB/s, iops=291 , runt= 30005msec

    简单说明:fio做了136mb的io总量,速率(吞吐量)为4.55mb/s,iops为291,运行时间30005msec

    对fio输出结果的详细说明参考:https://blog.csdn.net/feilianbb/article/details/50497845

  • 相关阅读:
    【洛谷P3853】 [TJOI2007]路标设置
    【洛谷P1159】排行榜
    【洛谷P2921】[USACO08DEC]在农场万圣节
    【洛谷P1108】低价购买
    【洛谷P1363】幻象迷宫
    【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
    【数据结构】线段树的几种用法
    【题解】洛谷P1283 平板涂色(搜索+暴力)
    【题解】洛谷P1074 [NOIP2009TG] 靶形数独(DFS+剪枝)
    【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)
  • 原文地址:https://www.cnblogs.com/xulan0922/p/11507814.html
Copyright © 2011-2022 走看看