《Tuning I/O Performance》,文章地址:http://doc.opensuse.org/products/draft/SLES/SLES-tuning_sd_draft/cha.tuning.io.html
大家在读了原文后若有更好的见解,请不吝赐教,谢谢!
文章以SUSE Linux Enterprise Server为例讲解了Linux系统的IO调度策略及调优,可适应于其他Linux操作系统,如CentOS、UBUNTU等。
1、查看当前IO调度策略(大多数Linux发行版的默认策略是CFQ)
命令:cat /sys/block/sda/queue/scheduler
结果:noop anticipatory deadline [cfq] #CentOS系统,可知可用的调度策略和当前调度策略,[]中的为当前系统采用的调度策略
2、更改当前调度策略
a、在系统启动时加入elevator=SCHEDULER 的内核参数
b、直接修改内核参数:echo SCHEDULER > /sys/block/DEVICE/queue/scheduler
3、策略调优
各个策略均有参数可以调优,参数路径大致相同,在 /sys/block/DEVICE/queue/iosched/目录下
命令:echo VALUE > /sys/block/DEVICE/queue/iosched/TUNABLE
4、各主要策略调优
a、CFQ(Completely Fair Queuing)
i、CFQ是一个公平的算法,每个线程都有一个时间片来提交I/O请求,不同的任务也可以分配不同的I/O优先级(man 1 ionice)
ii、可调优的参数
/sys/block/<device>/queue/iosched/slice_idle
#就算一个任务当前没有I/O请求了,采用此策略仍然会等待一段时间才切换到下一个线程。
#针对 SSDs、多磁盘SAN等当前磁道位置(不用额外花费时间寻址)不是特别重要的,只可以把此参数设置为0可以明显提高吞吐量。
/sys/block/<device>/queue/iosched/quantum
#限制设备同时处理的请求数量,默认值是4
#调高此值虽然可以提高性能,但因为并发处理量增多了,可能会增加某些I/O的延时
#所以可调整/sys/block/<device>/queue/iosched/slice_async_rq(默认是2,限制同一时间片的异步写请求数量)
/sys/block/<device>/queue/iosched/low_latency
#对I/O延迟要求非常高的负载环境中,可以将此值设置为1会好一些
b、NOOP
i、它是一种非常普通的调度策略,有I/O请求时它就处理,它可以用来检测其它调度算法在复杂I/O环境下是否引起了I/O性能。
ii、有自身的的调度算法的设备,如智能存储设备、SSDs等,虽然一般情况下DEADLINE更适合这些设备,但在较低负载下它的性能可能会更好。
c、DEADLINE
i、DEADLINE是为降低延时而设计的,每个I/O请求分配了一个结束时间,超时后便会暂存到队列(读和写两个队列)中,当没有超时的请求时再处理这些队 列里的请求,这个算法对读的好处大于写。
ii、在并发读写及优先级不是非常重要的情况下,此调试要比CFQ策略性能好许多。
iii、调优参数
/sys/block/<device>/queue/iosched/writes_starved
#控制在多少个读请求后可以处理一个写请求,设置为3表示处理3个请求后可以处理一个写请求
/sys/block/<device>/queue/iosched/read_expire
#以毫秒为单位,默认值是500,设置读操作的超时时间(当前时间往后推read_expire值便是超时的时间点)
/sys/block/<device>/queue/iosched/write_expire
#同上,控制写请求超时时间
5、I/O Barrier调优
Write Barriers 是一种内核机制,可以保证文件系统元数据正确有序地写入持久化存储,哪怕持久化存储掉电的情况也能保证。大多数文件系统(XFS、ext3、ext4、reiserfs)在fsync或事务提交的时候便会触发 Write Barriers 。可在有备用电池的磁盘关闭 Write Barriers 来提高性能。
可在ext3、ext4、reiserfs文件系统挂载时加上barrier=0的选项,XFS挂载时使用nobarrier选项。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。