zoukankan      html  css  js  c++  java
  • Linux服务器I/O性能分析-1

    一、IOSTAT误区

    1.1 误区-svctm

    Linux上的svctm是重要的I/O指标(I/O平均服务时间-单位毫秒),这个值直接反映了硬件的性能(I/O请求从SCSI层发出--->I/O完成之后返回SCSI层所消耗的时间),要是这个值很大的话,那肯定是硬件出问题了,但是Linux系统对他的解释却有点出乎意料:

    man iostat
    ......
    The  average  service  time (in milliseconds) for I/O requests that were issued to the device. Warning! Do not trust this fieldany more.  This field will be removed in a future sysstat version.
    ......
    # 说白了就是这个值已经不权威了,将来sysstat包中他就没了(找谁说理去)
    

      

    1.2 误区-await

    虽然说I/O平均消耗时间(毫秒)是用await表示的,但是这个值也不能说明硬件的性能(那我要你干什么,就是不行呗),经过研究后发现await不仅包括硬件设备处理I/O时间,还包括了在请求队列里面的时间,排队时间又不是硬件设备消耗的,那凭什么硬件要背锅;所以这个值也不能全信,也有可能是内核驱动I/O调度器(/sys/block/sda-z/queue/scheduler)的时候导致这个值变大了。问题来了,这也不能信那也不能信,我信你妹啊,到底怎么弄?答案是:想要分析真正的原因就别指望它了

     

    二、被骗后的反思

    2.1 文件:/proc/diskstats

    要真正理解I/O输出结果,应该看这个文件(一次没看懂就看二次三次四次.....关机)

    cat /proc/diskstats
       8       0 sda 12600 81 692064 28041 32735156 176165 2096398965 1926343 0 800601 1948300
       8       1 sda1 428 0 6250 1329 12 1 29 0 0 161 1329
       8       2 sda2 616 0 11438 137 119 0 32452 5 0 113 142
       8       3 sda3 11468 81 669992 26550 32735025 176164 2096366484 1926338 0 800359 1946760
       8      16 sdb 0 0 0 0 0 0 0 0 0 0 0
    

    2.1.1 字段解释

    8   1   sda1   428   0   6250   1329   12   1   29   0   0   161   1329
    字段序列 字段值 字段含义
    1 8 SCSI设备寻址地址
    2 设备编号
    3 sda1  设备名称
    4 428  成功完成的读取总数
    5  合并读取操作的次数-单独讲解-详见如下序列5
    6 6250   成功读取的扇区数
    7 1329   所有读取数据花费的总毫秒数
    8 12   完成写入的次数
    9  合并写入的次数
    10 29   成功写入的扇区总数
    11  写入磁盘块所花费的毫秒数
    12  当前正在进行的I/O数量,这个数量是I/O进入队列时进行++的,还没到磁盘
    13 161   I/O花费的毫秒数(读消耗的时间+写消耗的时间)
    14 1329   执行I/O的加权毫秒数-单独讲解-详见如下序列14

     


     

     

     

     

      

    2.1.2 字段解释

    • 字段序列5:

    合并读取操作的次数,就是要是一个应用读取的数据块相邻时,可以合并成一个,这样能提高效率(调度器负责合并),官方文档翻译:两次4K读取可能先变为一次8K读取,最终移交给磁盘,因此将被计数(并排队),仅作为一个I/O。该字段使您知道执行此操作的频率。

    • 字段序列14:

    执行I/O的加权毫秒数,该字段在每次I/O开始,I/O完成,I/O时递增,通过进行中的I/O数量合并或读取这些统计信息(字段9)乘以自I/O以来花费的毫秒数,该字段的最新更新。这样可以轻松衡量,I/O完成时间和可能积压的积压。

     

    三、对IOSTAT的看法

    3.1 概述

    iostat是以/proc/diskstats为基础进行计算的,因为它没有把队列等待时间和硬盘处理时间分开计算,所以凡是一些计算I/O的工具要是以这个文件为基础的话,那取出的数据都不准确!

    3.2 iostat字段解释

    iostat -x
    ......
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    sda               0.00     0.02    0.00    3.08     0.03    98.52    64.04     0.00    0.06    2.23    0.06   0.02   0.01
    # rrqm/s : 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
    # wrqm/s : 每秒对该设备的写请求被合并次数
    # r/s : 每秒完成的读次数
    # w/s : 每秒完成的写次数
    # rkB/s : 每秒读数据量(kB为单位)
    # wkB/s : 每秒写数据量(kB为单位)
    # avgrq-sz : 平均每次IO操作的数据量(扇区数为单位)
    # avgqu-sz : 平均等待处理的IO请求队列长度
    # await : 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
    # r_await : 每个读操作平均所需的时间(不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间。)
    # w_await : 每个写操作平均所需的时间(不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间。)
    # svctm : 平均每次IO请求的处理时间(毫秒为单位)
    # %util : 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
    

     下一节继续分享如何正确分析I/O性能

  • 相关阅读:
    JS
    JS
    JS
    CSS
    CSS
    CSS
    NPOI导出自动换行效果
    Httpcookie的简单应用
    前台JS设置Cookies后台读取刚设置的Cookies
    SQL SERVER 如何调试存储过程
  • 原文地址:https://www.cnblogs.com/zhangweiyi/p/12900915.html
Copyright © 2011-2022 走看看