zoukankan      html  css  js  c++  java
  • 性能测试进阶指南——基础篇之磁盘IO

    本文旨在帮助测试人员对性能测试常用指标做一个简单的讲解,主要包括CPU、内存、磁盘和网络带宽等系统资源,本文仅仅局限于Linux系统,Windows Server系统暂不做考虑。

    使用iostat分析IO性能

    对于I/O-bond类型的进程,我们经常用iostat工具查看进程IO请求下发的数量、系统处理IO请求的耗时,进而分析进程与操作系统的交互过程中IO方面是否存在瓶颈。

    下面通过iostat命令使用实例,说明使用iostat查看IO请求下发情况、系统IO处理能力的方法,以及命令执行结果中各字段的含义。

    1.不加选项执行iostat

    我们先来看直接执行iostat的输出结果:

    [root@10.15.107.147 ~]# iostat
    Linux 2.6.18-164.el5 (localhost.localdomain)    05/09/2014      _x86_64_        (8 CPU)
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.50    0.00    0.46    0.00    0.00   99.04
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    cciss/c0d0        5.31         2.98       101.18    4822763  163804574
    dm-0             25.39         2.98       101.18    4820813  163804504
    dm-1              0.00         0.00         0.00        448          0
    

    单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。以上输出中,除最上面指示系统版本、主机名和日期的一行外,另有两部分:

    avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值

    Device: 各磁盘设备的IO统计信息

    对于cpu统计信息一行,我们主要看iowait的值,它指示cpu用于等待io请求完成的时间。Device中各列含义如下:

    • Device: 以sdX形式显示的设备名称
    • tps: 每秒进程下发的IO读、写请求数量
    • Blk_read/s: 每秒读扇区数量(一扇区为512bytes)
    • Blk_wrtn/s: 每秒写扇区数量
    • Blk_read: 取样时间间隔内读扇区总数量
    • Blk_wrtn: 取样时间间隔内写扇区总数量

    我们可以使用-c选项单独显示avg-cpu部分的结果,使用-d选项单独显示Device部分的信息。

    2.指定采样时间间隔与采样次数

    与sar命令一样,我们可以以”iostat interval [count] ”形式指定iostat命令的采样间隔和采样次数:

    [root@10.15.107.147 ~]# iostat -d 1 2
    Linux 2.6.18-164.el5 (localhost.localdomain)    05/09/2014      _x86_64_        (8 CPU)
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    cciss/c0d0        5.31         2.98       101.18    4822763  163821942
    dm-0             25.39         2.98       101.18    4820813  163821872
    dm-1              0.00         0.00         0.00        448          0
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    cciss/c0d0        0.00         0.00         0.00          0          0
    dm-0              0.00         0.00         0.00          0          0
    dm-1              0.00         0.00         0.00          0          0
    

    以上命令输出Device的信息,采样时间为1秒,采样2次,若不指定采样次数,则iostat会一直输出采样信息,直到按”ctrl+c”退出命令。注意,第1次采样信息与单独执行iostat的效果一样,为从系统开机到当前执行时刻的统计信息。

    3.以kB为单位显示读写信息(-k选项)

    我们可以使用-k选项,指定iostat的部分输出结果以kB为单位,而不是以扇区数为单位:

    [root@10.15.107.147 ~]# iostat -d -k
    Linux 2.6.18-164.el5 (localhost.localdomain)    05/09/2014      _x86_64_        (8 CPU)
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    cciss/c0d0        5.31         2.98       101.18    4822763  163830126
    dm-0             25.39         2.98       101.18    4820813  163830056
    dm-1              0.00         0.00         0.00        448          0
    

    以上输出中,kB_read/s、kB_wrtn/s、kB_read和kB_wrtn的值均以kB为单位,相比以扇区数为单位,这里的值为原值的一半(1kB=512bytes*2)

    4.更详细的io统计信息(-x选项)

    为显示更详细的io设备统计信息,我们可以使用-x选项,在分析io瓶颈时,一般都会开启-x选项:

    [root@10.15.107.147 ~]# iostat -x -k -d 1
    Linux 2.6.18-164.el5 (localhost.localdomain)    05/09/2014      _x86_64_        (8 CPU)
    
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    
    ......
    
    cciss/c0d0        0.03    20.05    0.07    5.24     2.98   101.18    39.22     0.00    0.38    2.17    0.36   0.10   0.05
    dm-0              0.00     0.00    0.09   25.30     2.98   101.18     8.20     0.02    0.86    2.39    0.86   0.02   0.05
    dm-1              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    3.16    3.16    0.00   0.30   0.00
    

    以上各列的含义如下:

    rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并

    wrqm/s: 每秒对该设备的写请求被合并次数

    r/s: 每秒完成的读次数

    w/s: 每秒完成的写次数

    rkB/s: 每秒读数据量(kB为单位)

    wkB/s: 每秒写数据量(kB为单位)

    avgrq-sz:平均每次IO操作的数据量(扇区数为单位)

    avgqu-sz: 平均等待处理的IO请求队列长度

    await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位),这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了

    svctm: 平均每次IO请求的处理时间(毫秒为单位),如果 svctm 比较接近 await,说明I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator算法,优化应用,或者升级 CPU。

    %util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率,该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

    对于以上示例输出,我们可以获取到以下信息:

    每秒向磁盘上写101.18KB左右数据(wkB/s值)

    每秒有5.31(cciss/c0d0)和25.39(dm-0)次IO操作(r/s+w/s),其中以写操作为主体

    平均每次IO请求等待处理的时间为 0.38、0.86、3.16 毫秒,处理耗时为0.10、0.02 和0.30毫秒

    等待处理的IO请求队列中,平均有0.00、0.02、0.00个请求驻留

    以上各值之间也存在联系,我们可以由一些值计算出其他数值,例如:

    util = (r/s+w/s) * (svctm/1000)

    对于上面的例子有:util = (0.07+5.24)*(0.10/1000) = 0.000531

    Posted by GaoChuanjun May 9th, 2014

  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/cexo/p/4426255.html
Copyright © 2011-2022 走看看