• 性能测试进阶指南——基础篇之磁盘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

  • 相关阅读:
    Ubuntu 18.04.2 LTS美化方案
    Ubuntu 16.04升级18.04
    Spark性能优化指南——高级篇
    Spark性能优化指南——基础篇
    遗传算法(Genetic Algorithm)——基于Java实现
    Linux sar命令参数详解
    Gdb调试多进程程序
    P8.打印整数
    Algorithm Book Index
    Debugging with GDB (8) 4.10 Debugging Programs with Multiple Threads
  • 原文地址:https://www.cnblogs.com/cexo/p/4426255.html
Copyright © 2020-2023  润新知