《Tuning I/O Performance》读后笔记

《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选项。