本文主要是介绍Linux之慢盘检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
慢盘检测
- 常见的慢盘检测工具
- 判断方法
- 判断磁盘为慢盘的阈值
前面介绍iostat的文章中提到过
- iostat工具没有任何一输出项表示的是硬盘设备平均每次IO的时间
- 也不能直接通过 /proc/diskstats 提供的统计值来准确地计算 I/O 在磁盘上的耗时
常见的慢盘检测工具
常见的慢盘检测工具例如,ARIES、华为IBMA都是通过周期性读取内核提供的统计信息(/proc/diskstats)来计算磁盘的平均 I/O 服务时间(svctm),并将服务时间划分为不同的3个等级level0/level1/level2,每个等级对应不同的加权值:
- 轻微(level0): 0ms
- 一般(level1):100ms
- 严重(level2):200ms
- ARIES 慢盘判断方法:
- 每1s中采集一次平均I/O服务时间,并判断 svctm 处在的权重区间,对应区间计数;
- 每30分钟判断一次是否命中慢盘,判断方法:一般次数 * 1 + 严重次数 * 2 > 20% * 1800,则判定为慢盘;
- 对于命中为慢盘,则标记为本周期内命中慢盘次数+1;
- 一天24h内,命中慢盘次数超过80%,则直接调用坏盘逻辑。
- 华为提供的慢盘判断方法:
- 每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) |
---|---|---|
hdd | 30 | 60 |
sata ssd | 20 | 40 |
nvme ssd | 10 | 20 |
说明: 值除了 hdd 的阈值有据可循, 其他两种磁盘都是推算值
- 普通 sata ssd 读QPS 能达到 五百以上, 所以当 iops 下降到 50, 说明磁盘已经出现慢盘
- nvme ssd iops 能达到一千到几十万, 当iops 下降到 100, 说明磁盘已经出现慢盘
每 1s 中采集一次 /sys/block/disk name/stat, 并计算svctm,并判断 svctm 处在的权重区间,对应区间计数;
- 当本次计算的平均 svctm 超过报警值就将慢盘次数加1,如果平均耗时超过危险值就将慢盘次数加2;
慢盘次数 = 一般次数 * 1 + 严重次数 * 2 - 如果过去一段时间内(默认3分钟)慢盘次数超过统计次数的 20% 则报警慢盘(总数 = 3*60 - 没有请求的秒);
- 如果过去一长段时间内(默认30分钟)磁盘被报警慢盘周期(一个周期为3分钟)次数超过 20%(除去没有请求的周期),则报警慢盘
- 如果过去一长段时间内(默认180分钟)磁盘被报警慢盘周期次数超过 80%(除去没有请求的周期),磁盘则在保证数据安全的前提下不提供服务
这篇关于Linux之慢盘检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!