btrfs cfq, noop, deadline三种IO调度策略下的IO性能表现

3 minute read

背景

btrfs 格式化和挂载参数:

# mkfs.btrfs -m raid10 -d raid10 -n 4096 -f /dev/sdb /dev/sdc /dev/sdd /dev/sde  
# mount -o noatime,nodiratime,ssd_spread,discard,space_cache /dev/sdb /data01  

从结果来看,建议使用deadline。

测试结果:

[root@digoal data01]# echo noop > /sys/block/sdb/queue/scheduler   
[root@digoal data01]# echo noop > /sys/block/sdc/queue/scheduler   
[root@digoal data01]# echo noop > /sys/block/sdd/queue/scheduler   
[root@digoal data01]# echo noop > /sys/block/sde/queue/scheduler  
                                                              random    random     bkwd    record    stride                                      
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread  
         2097152      32    77720    77709   159983   159439    72330    70935    77846     64188     75000   854586   902220  7489696  7600964  
         2097152      64   104428   106089   366463   368877   113952   110715   105357     66938    107051   876465   910270  6748265  8533791  
         2097152     128   107704   109132   417146   437318   181536   117572   184871    116503    173504   891273   910735  7083844  7465699  
         2097152     256   127308   127662   476936   478925   235094   126306   240252     66889    235473   890735   812143  6920494  7527925  
         2097152     512   146141   147122   478253   476208   301315   131230   295966    115434    303665   884662   906913  7406058  6196435  
         2097152    1024   147223   151444   451993   450326   329316   136489   321772    159823    313979   870263   888099  6985407  7544033  
         2097152    2048   164547   162438   442901   441851   360306   153920   353463    160712    366146   879602   933799  5629273  5824271  
         2097152    4096   171985   174225   425775   439573   392926   164443   403381    172532    379402   858670   913175  4698700  5271105  
         2097152    8192   190121   187834   454027   449194   422420   171070   396334    184075    407093   863424   894932  4980056  5343132  
         2097152   16384   196351   194956   435803   448469   438458   178073   407322    196700    424138   877813   906542  5018610  5129252  
  
[root@digoal data01]# echo cfq > /sys/block/sdb/queue/scheduler   
[root@digoal data01]# echo cfq > /sys/block/sdc/queue/scheduler   
[root@digoal data01]# echo cfq > /sys/block/sdd/queue/scheduler   
[root@digoal data01]# echo cfq > /sys/block/sde/queue/scheduler  
                                                              random    random     bkwd    record    stride                                      
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread  
         2097152      32    76377    74073   176852   173711    73787    71035    72462     82506     75436   855067   862604  8392099  8536847  
         2097152      64   118443   112069   362156   365841   108131   115517   106261    106888    107198   875728   870956  8345543  9060610  
         2097152     128   108947   105955   438897   422408   180859   107215   181540    112327    179464   871145   727476  7369672  8227769  
         2097152     256   117518   119458   477368   479421   227802   117237   230453     70101    223893   885953   861748  6833536  7385041  
         2097152     512   137452   142118   468122   457083   292588   141234   294708    115448    289653   882885   852336  7254241  7617057  
         2097152    1024   146782   147708   450453   456297   325155   139924   303286    154319    313172   865120   892726  6888216  6888939  
         2097152    2048   164938   157667   460494   441980   353312   151031   349135    152418    351972   855243   875387  5648743  6312290  
         2097152    4096   170055   165014   405079   410577   376776   162120   385417    167159    340488   841613   890966  4832346  4476693  
         2097152    8192   188404   179583   414861   420485   359677   169331   392425    188238    369951   834353   839714  4510701  4163766  
         2097152   16384   189633   186795   409104   404502   392445   178677   398647    195776    383146   877292   880568  5164979  5244586  
  
[root@digoal data01]# echo deadline > /sys/block/sdb/queue/scheduler   
[root@digoal data01]# echo deadline > /sys/block/sdc/queue/scheduler   
[root@digoal data01]# echo deadline > /sys/block/sdd/queue/scheduler   
[root@digoal data01]# echo deadline > /sys/block/sde/queue/scheduler  
                                                              random    random     bkwd    record    stride                                      
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread  
         2097152      32    76297    76606   178461   179875    73916    69297    76670     68967     76358   878081   894038  7831190  8524173  
         2097152      64   109962   117287   374097   377030   111773   115772   112564    113903    109150   862310   910522  7558613  8480125  
         2097152     128   109667   109676   422206   418074   173976   109262   176331    109806    162484   891411   916651  7289953  7381088  
         2097152     256   119929   120698   435433   444379   215671   113361   227020     67289    233705   891307   857827  7031756  7217077  
         2097152     512   150384   139186   459279   447765   295988   131709   292982    113496    271109   881912   887563  6786156  7488542  
         2097152    1024   149161   143798   452386   451975   329657   140954   324087    153979    306680   875291   893943  5424631  5784479  
         2097152    2048   160770   162023   444445   448918   363688   150719   342115    160651    346611   859319   875966  5287293  6258249  
         2097152    4096   179407   173476   423748   434952   397429   163437   394059    175363    401404   861316   885105  4928385  5440945  
         2097152    8192   184741   187554   441951   448512   417487   172784   406814    190259    418868   870022   888991  5025779  5308948  
         2097152   16384   191530   193142   429578   445846   440323   178951   434807    186504    417491   878968   886187  4908488  4978142  

附录:

IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯. (elevator)而相应的算法也就被叫做电梯算法.而Linux中IO调度的电梯算法有好几种,一个叫做as(Anticipatory),一个叫做 cfq(Complete Fairness Queueing),一个叫做deadline,还有一个叫做noop(No Operation).具体使用哪种算法我们可以在启动的时候通过内核参数elevator来指定.

一)I/O调度的4种算法

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

特点:

在最新的内核版本和发行版中,都选择CFQ做为默认的I/O调度器,对于通用的服务器也是最好的选择.

CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,是deadline和as调度器的折中.

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

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

工作原理:

CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,各队列之间的调度使用时间片来调度,

以此来保证每个进程都能被很好的分配到I/O带宽.I/O调度器每次执行一个进程的4次请求.

2)NOOP(电梯式调度程序)

特点:

在Linux2.4或更早的版本的调度程序,那时只有这一种I/O调度算法.

NOOP实现了一个简单的FIFO队列,它像电梯的工作主法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质.

NOOP倾向饿死读而利于写.

NOOP对于闪存设备,RAM,嵌入式系统是最好的选择.

电梯算法饿死读请求的解释:

因为写请求比读请求更容易.

写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到I/O队列中.

读请求需要等到它前面所有的读操作完成,才能进行下一次读操作.在读操作之间有几毫秒时间,而写请求在这之间就到来,饿死了后面的读请求.

3)Deadline(截止时间调度程序)

特点:

通过时间以及硬盘区域进行分类,这个分类和合并要求类似于noop的调度程序.

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

Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择.

4)AS(预料I/O调度程序)

特点:

本质上与Deadline一样,但在最后一次读操作后,要等待6ms,才能继续进行对其它I/O请求进行调度.

可以从应用程序中预订一个新的读请求,改进读操作的执行,但以一些写操作为代价.

它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.

AS适合于写入较多的环境,比如文件服务器

AS对数据库环境表现很差.

查看当前系统支持的IO调度算法

dmesg | grep -i scheduler  
[root@localhost ~]# dmesg | grep -i scheduler  
io scheduler noop registered  
io scheduler anticipatory registered  
io scheduler deadline registered  
io scheduler cfq registered (default)  

查看当前系统的I/O调度方法:

cat /sys/block/sda/queue/scheduler  
noop anticipatory deadline [cfq]  

临地更改I/O调度方法:

例如:想更改到noop电梯调度算法:

echo noop > /sys/block/sda/queue/scheduler  

想永久的更改I/O调度方法:

修改内核引导参数,加入elevator=调度程序名

vi /boot/grub/menu.lst  

更改到如下内容:

kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet  

重启之后,查看调度方法:

cat /sys/block/sda/queue/scheduler  
noop anticipatory [deadline] cfq  

已经是deadline了。

Flag Counter

digoal’s 大量PostgreSQL文章入口