磁盘IO问题纪录

2020-07-31 13:56:13 浏览数 (1)

背景

随着公司站点的发展,用户和访问量日益增加,经常会出现数据库主从出现延迟的情况,例如,用户在点击充值页进行充值时,经常会出现充值不到账的情况,针对这个问题,对数据库进行排查,发现,磁盘IO极不稳定,iowait也很高,%util一直在90左右,这说明产生的I/O请求很多,IO已经满负荷,磁盘IO存在瓶颈。所以需要加一块SSD盘,来提高IO处理速度。

磁盘IO情况检测

可以结合vmstatiostat来判断IO和cpu的一些情况,例如:

代码语言:javascript复制
vmstat 1 100
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      0 144716 133152 3805212    0    0   485  1565    2    2  3  1 90  6  0
 1  0      0 140188 133152 3808372    0    0 59940   744 2252 1537 42  2 36 20  0
 1  0      0 146236 133152 3803568    0    0 37632  7384 2434 1969 45  2 39 14  0
 1  1      0 120212 133152 3830100    0    0 26656   304 1469 1144 18  1 35 46  0
 1  0      0 143180 133156 3804948    0    0 48004   804 2292 1577 43  2 41 14  0
 0  1      0 158224 133156 3791228    0    0 28796  7988 2514 2212 45  2 37 17  0

r 表示运行队列,即多少个进程分配到了CPU,如果超过CPU核数,就会出现CPU瓶颈了

b 表示阻塞的进程

si 每秒从磁盘读入虚拟内存的大小,大于0,表示物理内存不够用或者内存泄漏

so 表示从磁盘每秒写入虚拟内存的大小,大于0,同上

bi 表示系统上所有的磁盘和其他块设备上每秒读入的总量

bo 表示所有磁盘上每秒写入的总量

in 每秒CPU中断的次数,包括时间中断

us 表示用户进程消耗的CPU时间百分比,us值越高,说明用户进程消耗CPU时间越多,如果长期大于50%,则需要考虑优化程序或者算法

sy 表示系统内核进程消耗的CPU时间百分比,一般来说us sy应该小于80%,如果大于80%,说明可能存在CPU瓶颈

id 表示CPU处在空间状态的时间百分比

wa 表示IO等待所占用的CPU时间百分比,wa值越高,说明I/O等待越严重,根据经验wa的参考值为20%,如果超过20%,说明I/O等待严重,引起I/O等待的原因可能是磁盘大量随机读写造成的

综上,我们在判断IO问题的时候,参考bibowa便可以判断IO的情况。

再来看下iostat的使用:

代码语言:javascript复制
iostat -x -k 1 100
Linux 3.10.0-693.2.2.el7.x86_64 (xs_88_55)      05/08/2018      _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.07    0.00    0.92    5.72    0.00   90.30

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.01    83.24    7.92  199.19   954.62  3104.95    39.20     0.53    2.57   31.62    1.42   0.62  12.84
vdb               0.00     0.07    0.05    0.13    12.04    11.01   256.26     0.01   49.74   19.07   60.37   1.13   0.02

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.01    0.00    0.51    2.53    0.00   95.96

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     4.00   30.00    2.00   124.00    24.00     9.25     0.03    0.78    0.77    1.00   0.09   0.30
vdb               0.00    83.00    8.00  119.00    68.00   828.00    14.11     0.07    0.53    0.62    0.52   0.53   6.70

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.00    0.00    0.50    2.49    0.00   96.02

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               0.00    61.00   14.00   88.00   152.00   632.00    15.37     0.05    0.46    0.50    0.45   0.46   4.70

%user:应用程序使用CPU的时间占比

%system:内核程序使用CPU的时间占比。

%iowait:CPU花费了多少时间去等待磁盘IO

%util: 表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态

综上,在看IO时,关注iowaitutil来判断IO情况。

0 人点赞