磁盘IO子系统性能调优

调优思路
CPU的Cache、内存和磁盘之间的访问速度差异很大,当CPU计算所需要的数据并没有及时加载到内存或Cache中时,CPU将会浪费很多时间等待磁盘的读取。计算机系统通过cache、RAM、固态盘、磁盘等多级存储结构,并配合多种调度算法,来消除或缓解这种速度不对等的影响。但是缓存空间总是有限的,我们可以利用局部性原理,尽可能的将热点数据提前从磁盘中读取出来,降低CPU等待磁盘的时间浪费。因此我们的部分优化手段其实是围绕着如何更充分的利用Cache获得更好的IO性能。

另外,本章节也会介绍从文件系统层面的优化手段。

主要优化参数
优化项

优化项简介

默认值

生效范围

鲲鹏916

鲲鹏920

脏数据缓存到期时间

调整脏数据缓存到期时间,分散磁盘的压力。

3000(单位为0.01秒)

立即生效YY

脏页面占用总内存最大的比例

调整脏页面占用总内存最大的比例(以memfree+Cached-Mapped为基准),增加PageCache命中率。

10%

立即生效YY

脏页面缓存占用总内存最大的比例

调整脏页面占用总存最大的比例,避免磁盘写操作变为O_DIRECT同步,导致缓冲机制失效。

40%

立即生效YY

调整磁盘文件预读参数

根据局性原理,在读取磁盘数据时,额外地多读一定量的数据缓存到内存。

128KB

立即生效YY

磁盘IO调度方式

根据业务处理数据的特点,选择合适的IO调度器。

cfq

立即生效YY

文件系统

选用性能更好的文件系统以及文件系统相关的选项。
二、
介绍
iostat是调查磁盘IO问题使用最频繁的工具。它汇总了所有在线磁盘统计信息,为负载特征归纳,使用率和饱和度提供了指标。它可以由任何用户执行,统计信息直接来源于内核,因此这个工具的开销基本可以忽略不计。

安装方式
iostat一般会随系统安装。如果没有,以CentOS为例,可以使用以下命令安装:

yum -y install sysstat

使用方式
命令格式:直接使用命令+参数,例如

iostat -d -k -x 1 100

常用参数如下:

参数

说明

-c

显示CPU使用情况。

-d

显示磁盘使用情况。

-k

以KB为单位显示。

-m

以M为单位显示。

-p

显示磁盘单个的情况。

-t

显示时间戳。

-x

显示详细信息。

我们也可以在最后添加统计周期和统计时长,比如上面的样例中,是要求以1s为周期统计,总共统计100s。

输出格式:

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.02 7.25 0.04 1.90 0.74 35.47 37.15 0.04 19.13 5.58 1.09
dm-0 0.00 0.00 0.04 3.05 0.28 12.18 8.07 0.65 209.01 1.11 0.34
dm-1 0.00 0.00 0.02 5.82 0.46 23.26 8.13 0.43 74.33 1.30 0.76
dm-2 0.00 0.00 0.00 0.01 0.00 0.02 8.00 0.00 5.41 3.28 0.00
参数含义如下:

参数

说明

rrqm/s

每秒合并放入请求队列的读操作数。

wrqm/s

每秒合并放入请求队列的写操作数。

r/s

每秒磁盘实际完成的读I/O设备次数。

w/s

每秒磁盘实际完成的写I/O设备次数。

rkB/s

每秒从磁盘读取KB数。

wkB/s

每秒写入磁盘的KB数。

avgrq-sz

平均请求数据大小,单位为扇区(512B)。

avgqu-sz

平均I/O队列长度(操作请求数)。

await

平均每次设备I/O操作的等待时间(毫秒)。

svctm

平均每次设备I/O操作的响应时间(毫秒)。

%util

用于I/O操作时间的百分比,即使用率。

重要参数详解:

rrqm/s和wrqm/s,每秒合并后的读或写的次数(合并请求后,可以增加对磁盘的批处理,对HDD还可以减少寻址时间)。如果值在统计周期内为非零,也可以看出数据的读或写操作的是连续的,反之则是随机的。
如果%util接近100%(即使用率为百分百),说明产生的I/O请求太多,I/O系统已经满负荷,相应的await也会增加,CPU的wait时间百分比也会增加(通过TOP命令查看),这时很明显就是磁盘成了瓶颈,拖累整个系统。这时可以考虑更换更高性的能磁盘,或优化软件以减少对磁盘的依赖。
await(读写请求的平均等待时长)需要结合svctm参考。svctm的和磁盘性能直接有关,它是磁盘内部处理的时长。await的大小一般取决于svctm以及I/O队列的长度和。svctm一般会小于await,如果svctm比较接近await,说明I/O几乎没有等待时间(处理时间也会被算作等待的一部分时间);如果wait大于svctm,差的过高的话一定是磁盘本身IO的问题;这时可以考虑更换更快的磁盘,或优化应用。
队列长度(avgqu-sz)也可作为衡量系统I/O负荷的指标,但是要多统计一段时间后查看,因为有时候只是一个峰值过高。
三、
介绍
blktrace是一个用户态的工具,提供I/O子系统上时间如何消耗的详细信息,从中可以分析是IO调度慢还是硬件响应慢等。配套工具blkparse从blktrace读取原始输出,并产生人们可读的输入和输出操作摘要。btt作为blktrace软件包的一部分而被提供,它分析blktrace输出,并显示该数据用在每个I/O栈区域的时间量,使它更容易在I/O子系统中发现瓶颈。

安装方式
以CentOS为例,可以使用以下命令安装:

yum -y install blktrace

使用方式
使用blktrace命令抓取指定设备的IO信息,如:

blktrace -w 120 -d /dev/sda

“-w”后接的参数指定抓取时间,以秒为单位;“-d”后接的参数指定设备。

命令执行完后会生成一系列以device.blktrace.cpu格式命令的二进制文件。

使用blkparse命令解析blktrace生成的数据,如:

blkparse -i sda -d blkparse.out

“-i”后接的参数指定输入文件名,由于blktrace输出的文件名默认都是device.blktrace.cpu格式,所以只需输入前面的“device”即可;“-d”后接的参数指定二进制输出文件。

这个命令会将分析结果输出到屏幕,并且将分析结果的二进制数据输出到blkparse.out文件中。

使用btt命令查看IO的整体情况,如:

btt -i blkparse.out

“-i”后接的参数指定输入文件名。

Q2Q:多个发送到块IO层请求的时间间隔。
Q2G:生成IO请求所消耗的时间,包括remap(可能被DM(Device Mapper)或MD(Multiple Device, Software RAID)remap到其它设备)和split(可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(split)成多个物理I/O)的时间。
G2I:IO请求进入IO Scheduler所消耗的时间,包括merge(可能会因为与其它I/O请求的物理位置相邻而合并成一个I/O)的时间。
I2D:IO请求在IO Scheduler中等待的时间。
D2C:IO请求在driver和硬件上(IO请求被driver提交给硬件,经过HBA、电缆(光纤、网线等)、交换机(SAN或网络)、最后到达存储设备,设备完成IO请求之后再把结果发回)所消耗的时间。
Q2C:整个IO请求所消耗的时间(Q2I + I2D + D2C = Q2C),相当于iostat的await。
正常情况D2C占比90%以上,若I2D占比较高,可以尝试调整IO调度策略。
四、原理
PageCache中需要回写到磁盘的数据为脏数据。在应用程序通知系统保存脏数据时,应用可以选择直接将数据写入磁盘(O_DIRECT),或者先写到PageCache(非O_DIRECT模式)。非O_DIRECT模式,对于缓存在PageCache中的数据的操作,都在内存中进行,减少了对磁盘的操作。

修改方式
系统中提供了以下参数来调整策略:

/proc/sys/vm/dirty_expire_centiseconds此参数用于表示脏数据在缓存中允许保留的时长,即时间到后需要被写入到磁盘中。此参数的默认值为30s(3000 个0.01秒)。如果业务的数据是连续性的写,可以适当调小此参数,这样可以避免IO集中,导致突发的IO等待。可以通过echo命令修改:

echo 2000 > /proc/sys/vm/dirty_expire_centisecs

/proc/sys/vm/dirty_background_ratio脏页面占用总内存最大的比例(以memfree+Cached-Mapped为基准),超过这个值,pdflush线程会刷新脏页面到磁盘。增加这个值,系统会分配更多的内存用于写缓冲,因而可以提升写磁盘性能。但对于磁盘写入操作为主的业务,可以调小这个值,避免数据积压太多最后成为瓶颈,可以结合业务并通过观察await的时间波动范围来识别。此值的默认值是10,可以通过echo来调整:
echo 8 > /proc/sys/vm/dirty_background_ratio
/proc/sys/vm/dirty_ratio为脏页面占用总内存最大的比例,超过这个值,系统不会新增加脏页面,文件读写也变为同步模式。文件读写变为同步模式后,应用程序的文件读写操作的阻塞时间变长,会导致系统性能变慢。此参数的默认值为40,对于写入为主的业务,可以增加此参数,避免磁盘过早的进入到同步写状态。
说明
如果加大了脏数据的缓存大小和时间,在意外断电情况下,丢失数据的概率会变多。因此对于需要立即存盘的数据,应该采用O_DIRECT模式避免关键数据的丢失。

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值