密集事务导致iowait严重

来源:互联网 发布:游戏键鼠套装 知乎 编辑:程序博客网 时间:2024/04/30 01:33

1.概述

在linux系统中,一台安装有双sata盘,做raid1的数据库服务器上。我跑一个存储过程,将2千万条记录插入到一张表中。这属于密集型小事务操作。在iostat检测中,发现大量的IO等待,读写速度始终上不去,一直在每秒10M左右。

$ sudo iostat

Linux 2.6.30-2-amd64 (lukahn) 12/12/2009  _x86_64_ (2 CPU)

 

avg-cpu:  %user   %nice %system %iowait  %steal  %idle

           7.13    0.00   1.94   27.96    0.00  62.97

 

Device:            tps   Blk_read/s  Blk_wrtn/s   Blk_read   Blk_wrtn

sda             144.02       198.41     11139.44   9322418  523399320

sdb             143.78       165.59     11137.39   7780516  523303000

hda               0.01         0.05         0.00       2492          0

md0               0.66         6.44         0.71     302538     33496

md1               7.32        67.02         7.51   3148938     352960

md2               6.08       240.02        18.95  11277610     890584

md3            1389.80        46.85     11106.55   2201410  521853640

md4               0.41         3.03         0.21     142322       9824

从iostat中看出,cpu在iowait上消耗了大量的资源。tps值始终不高,每秒的读写速度也上不去。

但是,建立一个大文件测试时,发现速度还是能上去的,能达到每秒200MB左右。

因此,客户说我们的磁盘速度不慢的,问题在你的应用那里。

2.分析

这里学习一个概念,我对存储也是一知半解,这里讲的是自己所理解的,不一定对。

我们知道,在磁盘购买时,都说7200转每分钟,15000转没分钟等。这个指标是对于机械硬盘而言的。

这个每分钟7200转换算成每秒就是120转,15000转就是每秒250转。每转一次就是磁盘轨道寻址一次。这里磁盘轨道访问有Sequential操作和Random 操作两类,前者用于大尺寸数据传输如128KB,后者是小尺寸如4KB。这点好理解。

如建立表空间,一次建立个10GB,就属于Sequential操作,大尺寸数据传输操作。

如多个小事务密集插入记录到数据库中某表时,就属于Random操作。

但是,磁盘每秒支持的操作次数是一定的,如15000转的,就是每秒250次,多了磁盘也忙不过来,CPU就在iowait上消耗资源。

我上面讲的不专业,通常专业术语为说IOPS 即每秒的输入输出量(或读写次数)。这是衡量磁盘性能的主要指标之一。还有一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。

3.技术

声明一下,以下内容来自互联网,属于技术名词介绍,这里摘录一下。

传统磁盘本质上一种机械装置,如FC, SAS, SATA磁盘,转速通常为5400/7200/10K/15K rpm不等。影响磁盘的关键因素是磁盘服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。 

(1)寻道时间

         Tseek是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。

(2)旋转延迟

         Trotation是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常使用磁盘旋转一周所需时间的1/2表示。比如,7200 rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000 rpm的磁盘其平均旋转延迟约为2ms。

(3)数据传输时间

         Ttransfer是指完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。目前IDE/ATA能达到133MB/s(MBPS),SATA II可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分时间。

 

IOPS(每秒IO次数) = 1s/(寻道时间+旋转延迟+数据传输时间)

 

因此,理论上可以计算出磁盘的最大IOPS,即IOPS= 1000ms/ (Tseek + Troatation),忽略数据传输时间。假设磁盘平均物理寻道时间为3ms,磁盘转速为7200,10K,15Krpm,则磁盘IOPS理论最大值分别为:

         IOPS = 1000 / (3 +60000/7200/2)  = 140
         IOPS = 1000 / (3 + 60000/10000/2)= 167
         IOPS = 1000 / (3 + 60000/15000/2)= 200

 固态硬盘SSD是一种电子装置, 避免了传统磁盘在寻道和旋转上的时间花费,存储单元寻址开销大大降低,因此IOPS可以非常高,能够达到数万甚至数十万。实际测量中,IOPS数值会受到很多因素的影响,包括I/O负载特征(读写比例,顺序和随机,工作线程数,队列深度,数据记录大小)、系统配置、操作系统、磁盘驱动等等。因此对比测量磁盘IOPS时,必须在同样的测试基准下进行,即便如何也会产生一定的随机不确定性。 

通常情况下,IOPS可细分为如下几个指标:

         Toatal IOPS:混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。

         Random Read IOPS:100%随机读负载情况下的IOPS。

         Random WriteIOPS:100%随机写负载情况下的IOPS。

         Sequential ReadIOPS:100%顺序负载读情况下的IOPS。

         Sequential WriteIOPS:100%顺序写负载情况下的IOPS。

 

4.结论

在linux的iostat检测工具中,tps我就理解成磁盘iops,Blk_read/s   Blk_wrtn/s我就理解成磁盘的吞吐量。SATA盘在处理小事务的读写时,即随机读写时,只能达到每秒200次左右的事务数。从吞吐量上看,也就是每秒10MB的量。

因此,就这个磁盘而言,这个结果是很正常的。磁盘每秒读写大小只能是这样。大量的CPU资源都浪费在IOWAIT上。对于现在处理的密集型事务处理来说,磁盘是整个系统的瓶颈,再多的内存和CPU都没用。甚至可以这么说,每秒钟CPU处理的事务数越多,IO就越忙。

再分析了磁盘特性后,我们该如何解决的这个问题呢。似乎是只有将小事务变成一个大事务,才能加快处理速度。

那么,该如何修改呢?

原创粉丝点击