• Linux之慢盘检测



    前面介绍iostat的文章中提到过

    1. iostat工具没有任何一输出项表示的是硬盘设备平均每次IO的时间
    2. 也不能直接通过 /proc/diskstats 提供的统计值来准确地计算 I/O 在磁盘上的耗时

    常见的慢盘检测工具

    常见的慢盘检测工具例如,ARIES、华为IBMA都是通过周期性读取内核提供的统计信息(/proc/diskstats)来计算磁盘的平均 I/O 服务时间(svctm),并将服务时间划分为不同的3个等级level0/level1/level2,每个等级对应不同的加权值:

    • 轻微(level0): 0ms
    • 一般(level1):100ms
    • 严重(level2):200ms
    1. ARIES 慢盘判断方法:
    • 每1s中采集一次平均I/O服务时间,并判断 svctm 处在的权重区间,对应区间计数;
    • 每30分钟判断一次是否命中慢盘,判断方法:一般次数 * 1 + 严重次数 * 2 > 20% * 1800,则判定为慢盘;
    • 对于命中为慢盘,则标记为本周期内命中慢盘次数+1;
    • 一天24h内,命中慢盘次数超过80%,则直接调用坏盘逻辑。
    1. 华为提供的慢盘判断方法:
    • 每1s中采集一次平均I/O服务时间(svctm),并判断 svctm 处在的权重区间,对应区间计数;
    • 每5分钟判断一次是否命中慢盘,判断方法:一般次数 * 1 + 严重次数 * 2 > 20% * 300,则判定为慢盘;
      两种方法都依赖于计算的 svctm, 实际上这个值在新版本的 iostat 中被废弃,因为它并不能代表实际的 I/O服务时间。

    判断方法

    尽管如此,还是可以通过iostat中计算svctm的方法来预估每IO的平均服务时间。
    (虽然blktrace能够追踪每次 I/O 将 request 提交给驱动到请求完成的耗时,但是 blktrace 会增加I/O 的耗时从而影响性能)

    • 理由如下:
      虽然 svctm 不能准确地表示I/O的服务时间,但是当出现慢盘时,无论传统的 sata hdd 盘还是 nvme ssd,svctm 都会因为单次 I/O 耗时增加而增加,svctm 会增加到几百毫秒,甚至几千毫秒。 所以继续使用 svctm 来判断慢盘。

    判断磁盘为慢盘的阈值

    磁盘类型level1(ms)level2(ms)
    hdd3060
    sata ssd2040
    nvme ssd1020

    说明: 值除了 hdd 的阈值有据可循, 其他两种磁盘都是推算值

    • 普通 sata ssd 读QPS 能达到 五百以上, 所以当 iops 下降到 50, 说明磁盘已经出现慢盘
    • nvme ssd iops 能达到一千到几十万, 当iops 下降到 100, 说明磁盘已经出现慢盘

    每 1s 中采集一次 /sys/block/disk name/stat, 并计算svctm,并判断 svctm 处在的权重区间,对应区间计数;

    1. 当本次计算的平均 svctm 超过报警值就将慢盘次数加1,如果平均耗时超过危险值就将慢盘次数加2;
      慢盘次数 = 一般次数 * 1 + 严重次数 * 2
    2. 如果过去一段时间内(默认3分钟)慢盘次数超过统计次数的 20% 则报警慢盘(总数 = 3*60 - 没有请求的秒);
    3. 如果过去一长段时间内(默认30分钟)磁盘被报警慢盘周期(一个周期为3分钟)次数超过 20%(除去没有请求的周期),则报警慢盘
    4. 如果过去一长段时间内(默认180分钟)磁盘被报警慢盘周期次数超过 80%(除去没有请求的周期),磁盘则在保证数据安全的前提下不提供服务
  • 相关阅读:
    深度学习自学笔记十三:unet网络详解和环境配置
    C++入门【下】—— 预处理与内联函数关系
    数据结构考研第六章——图(内含动图)
    Windows网络模型之异步选择模型(基于消息机制)
    JavaScript 59 JavaScript 常见错误
    【技术积累】Linux中的命令行【理论篇】【一】
    vue3事务管理案例、组件基础总结案例
    基于单片机的声光控制节能灯设计
    MySQL表结构设计规范
    在Ubuntu上安装最新的neovim(with LinuxBrew)
  • 原文地址:https://blog.csdn.net/zincooo/article/details/133804233