btrfs cfq, noop, deadline三种IO调度策略下的IO性能表现
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了