RH442-5磁盘I/O调优

简介:

 Linux磁盘I/O调优

一、     概述

1.   磁盘调优目录:/sys/block

2.   磁盘调优均是调内核参数,要求安装kernel-doc包,

3.   调预先读请求量(默认为128kb

blockdev --getra /dev/sda

blockdev --setra 512 /dev/sda  

#实际修改/sys/block/sda/queue/read_ahead_kb=256kb;如果读情况多则将此参数调大一点,如写请求读,则将此参数调小一点

 

4.   调磁盘队列:队列长则处理快,提升硬盘的吞吐量,但会消耗更大的内存

Queue length/sys/block/sda/queue/nr_requests  

[root@station8 queue]# cat /sys/block/sda/queue/nr_requests

512                                 

 #默认128,没有单位

二、 磁盘I/O4种调度算法

1.   CFQ(完全公平排队I/O调度程序) (elevator=cfq)

特点:

l  这是默认算法,对于通用服务器来说通常是最好的选择。它试图均匀地分布对I/O带宽的访问。deadlineanticipatory调度器的折中方案.

l  CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择.

l  CFQ赋予I/O请求一个优先级,I/O优先级请求独立于进程优先级,高优先级的进程的读写不能自动地继承高的I/O优先级.

l  CFQ基于64位的队列请求,使用的轮询的方法处理队列.

 

调优参数:

l  /sys/block/sda/queue/iosched/queued:轮询时每次处理的最大请求数

l  /sys/block/sda/queue/iosched/quantum:每隔多少个请求数做一次轮询

 

cfq调优工具ionice

ionice可以更改任务的类型和优先级,不过只有cfq调度程序可以用ionice.

有三个例子说明ionice的功能:

l  采用cfq的实时调度(实时调度:c1,优先级为7(数字越低优先级越高)

ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&

 

l  采用缺省的磁盘I/O调度(轮询调度:c2,优先级为3

ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&

 

l  采用空闲的磁盘调度(idle调度:c3,优先级为0

ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&

 

#ionice的三种调度方法,实时调度最高,其次是缺省的I/O调度,最后是空闲的磁盘调度.

ionice的磁盘调度优先级有8,最高是0,最低是7.

注意,磁盘调度的优先级与进程nice的优先级没有关系.一个是针对进程I/O的优先级,一个是针对进程CPU的优先级.

 

2.   Deadline(截止时间调度程序)(elevator=deadline)

特点:

l  Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象.

l  这个算法试图把每次请求的延迟降至最低。该算法重排了请求的顺序来提高性能。可以调队列的过期的读写过程,如 read_expire  write_expire 二个参数来控制多久内一定要读到数据,超时就放弃排序。

l  比较合适小文件。还可以使用打开 front_merges 来进行合并邻近文件。Deadline对数据库环境(ORACLE RAC,MYSQL)是最好的选择.

调优:

[root@station8 queue]# echo deadline >/sys/block/sda/queue/scheduler

[root@station8 queue]# more /sys/block/sda/queue/scheduler

noop anticipatory [deadline] cfq

[root@station8 queue]# ls /sys/block/sda/queue/iosched/

fifo_batch  front_merges  read_expire  write_expire  writes_starved

[root@station8 queue]# cat iosched/read_expire

500    #默认500ms

[root@station8 queue]# cat iosched/write_expire

5000   #默认5000ms

[root@station8 queue]# cat iosched/front_merges

1                  

 

#默认为1,请求整合,新的请求和之前请求有关联,则优先处理该请求,IO性能没有影响,但优化了磁盘处理。

3.   Anticipatory(预料I/O调度程序)(elevator=as):

特点:

l  预想调度算法。优化完成率,改善读请求。

l  本质上与Deadline一样,但在最后一次读操作后,要等待6ms才能继续进行对其它I/O请求进行调度。可以从应用程序中预订一个新的读请求,改进读操作的执行,但以一些写操作为代价,它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量。

l  AS适合于写入较多的环境,比如文件服务器;适合大文件处理,适合web server等。AS对数据库环境表现很差。

调优:

[root@station8 queue]# echo "anticipatory">scheduler

[root@station8 queue]# more iosched/antic_expire

6       #默认为6

[root@station8 queue]# more iosched/read_expire

125      #读的最大队列时间

[root@station8 queue]# more iosched/write_expire

250      #写的最大队列时间

注:测试时一定要清空缓存

[root@station8 442]# free –m    #查看缓存

             total    used   free   shared    buffers     cached

Mem:        4054    506   3548   0        140        256

-/+ buffers/cache:      108   3945

Swap:         8189   0    8189

 

测试:

[root@station8 442]# sysctl -w vm.drop_caches=3   #清空缓存

[root@station8 442]#rpm –ivh elevator-test-0.1-3.i386.rpm  #安装测试软件

[root@station8 442]#dd if=/dev/urandom of=/root/bigfile bs=1M count=100

[root@station8 442]#watch –n 1 ls –lh /root/bigfile   #每隔一秒查写入bigfile的数据量

l 默认调度类型为cfq下,测试读数据速度(测试时要求清空缓存)

[root@station8 442]#cat /sys/block/sda/queue/scheduler

noop anticipatory deadline [cfq]

[root@station8 442]#et_start reader /root/bigfile

Launching

Reading 25600 pages

Read 20000 pages

 

real    0m1.552s

user    0m0.011s

sys     0m0.147s

l 将调度类型改为anticipatory,测试读数据速度(测试时要求清空缓存)

[root@station8 442]#echo “anticipatory”>/sys/block/sda/queue/scheduler

noop anticipatory deadline [anticipatory]

[root@station8 442]#cat /sys/block/sda/queue/iosched/antic_expire

12    #该值默认为6,为提高速度,改成12

[root@ station8 442]# et_start reader /root/bigfile

Launching

Reading 25600 pages

Read 20000 pages

 

real    0m1.456s

user    0m0.007s

sys     0m0.144s

l 结论:很明显读的数度提高了。

 

4.   NOOP(电梯式调度程序)(elevator=noop):

特点:

l  不做任何调优,主要用于节省CPU资源。

l  Noop调度算法指的是当请求被存储到队列并交由I/O子系统处理时由磁盘硬件对其进行优化。该算法一般只对一些特定的硬件(例如RAM diskTCQ disk等)。

l  Noop对于I/O不那么操心,对所有的I/O请求都用FIFO队列形式处理,默认认为 I/O不会存在性能问题。这也使得CPU也不用那么操心

 

三、 I/O调度算法使用建议

1.   Deadline I/O scheduler 

   在这个中 deadline 调度算法通过降低性能而获得更短的等待时间,它使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库,Oracle 10G 之类).

 

2.   Anticipatory I/O scheduler

   anticipatory 算法通过增加等待时间来获得更高的性能,假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流(相当于给随机读写变顺序读写), 使用这个原理来使用读取写入的延时换取最大的读取写入吞吐量.适用于大多数环境,特别是读取写入较多的环境,比如文件服务器,Web 应用,App等应用我们可以采纳as调度.后面我会教大家怎么调这个的合并的等待时间。

 

3.   CFQ I/O scheduler

这个是 对所有因素也都做了折中而尽量获得公平性,使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统。

 

 

 

本文转自netsword 51CTO博客,原文链接:http://blog.51cto.com/netsword/635661

相关文章
|
9月前
|
测试技术
fio磁盘压测工具
因为是虚拟机,所以对于性能很虚。借助fio进行测试
559 0
|
5天前
|
消息中间件 缓存 安全
有关磁盘I/O的调优(二)
【4月更文挑战第5天】有关磁盘I/O的调优的命令,
28 6
|
2月前
|
监控 Linux
|
4月前
|
存储
fio测试磁盘速度
fio测试磁盘速度
56 0
|
SQL API 容器
MogDB or openGauss关于CPU占用问题的优化
MogDB or openGauss关于CPU占用问题的优化
191 0
|
关系型数据库 MySQL 索引
关于Mysql CPU占用过高的问题排查与优化
今天中午公司App出现网络错误无法请求数据的情况,登上阿里云看cpu使用率居然一直高达90+%,于是上服务器看究竟是哪个程序占用的,top一下,发现是mysql,下面就开始针对为什么会占用这么高的cpu问题着手解决。
2345 0
|
监控 Oracle 关系型数据库