半个PostgreSQL DBA,热衷于数据库相关的技术。我的ppt分享https://pan.baidu.com/s/1eRQsdAa https://github.com/chenhuajun https://chenhuajun.github.io
分类: LINUX
2016-07-17 19:03:53
磁盘预读可以改善顺序读的性能,并且测试发现每个读请求的大小也受预读大小的影响,也就是发生了IO合并。
在每次8K的顺序读中,关闭预读时,每个IO是8个扇区(4K); 增大预读,每个IO大概等于预读大小,但最大是设备的单个IO大小的上限(这里是1024)。 下面是详细的测试。
台式机上的CentOS7.1 4核虚机
消费级SSD
dd if=/dev/zero of=testdata bs=8096 count=100000
关闭预读
/sbin/blockdev --setra 0 /dev/mapper/centos-root /sbin/blockdev --setfra 0 /dev/mapper/centos-root
清缓存
sync echo 3 > /proc/sys/vm/drop_caches
执行顺序读操作
[root@node2 ~]# dd if=testdata bs=8192 count=100000 of=/dev/null 98828+1 records in 98828+1 records out 809600000 bytes (810 MB) copied, 150.268 s, 5.4 MB/s
在没有预读的情况下,读取速度5.4 MB/s,说明每个IO大小是8个扇区(4KB),取的是iostat中途的值。
[root@node2 ~]# iostat -xm 1 100 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 8.22 15.38 0.00 76.39 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 1390.00 0.00 5.43 0.00 8.00 0.91 0.65 0.65 0.00 0.65 90.70 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-0 0.00 0.00 1389.00 0.00 5.43 0.00 8.00 0.91 0.65 0.65 0.00 0.65 90.90 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
256是RHEL6.x的默认值,读取速度达到21.1 MB/s
[root@node2 ~]# /sbin/blockdev --setra 256 /dev/mapper/centos-root [root@node2 ~]# sync [root@node2 ~]# echo 3 > /proc/sys/vm/drop_caches [root@node2 ~]# dd if=testdata bs=8192 count=100000 of=/dev/null 98828+1 records in 98828+1 records out 809600000 bytes (810 MB) copied, 38.2959 s, 21.1 MB/s
相应的每个读请求的大小也也通过IO合并扩大到了256扇区左右。(下面除avgrq-sz,avgqu-sz外,其它值每秒的波动很大,不可作为参考)
[root@node2 ~]# iostat -xm 1 100 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.50 24.81 0.00 74.69 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 38.00 0.00 4.75 0.00 256.00 2.00 51.32 51.32 0.00 26.37 100.20 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-0 0.00 0.00 38.00 0.00 4.75 0.00 256.00 2.00 51.32 51.32 0.00 26.37 100.20 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
设置预读大小为2048后,读取速度达到30.6 MB/s
[root@node2 ~]# /sbin/blockdev --setra 2048 /dev/mapper/centos-root [root@node2 ~]# sync [root@node2 ~]# echo 3 > /proc/sys/vm/drop_caches [root@node2 ~]# dd if=testdata bs=8192 count=100000 of=/dev/null 98828+1 records in 98828+1 records out 809600000 bytes (810 MB) copied, 26.4212 s, 30.6 MB/s
相应的每个读请求的大小也扩大到了1024扇区左右。
[root@node2 ~]# iostat -xm 1 100 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 1.51 23.62 0.00 74.87 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 67.00 0.00 32.33 0.00 988.18 3.48 51.48 51.48 0.00 14.91 99.90 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-0 0.00 0.00 68.00 0.00 33.00 0.00 993.88 3.48 50.74 50.74 0.00 14.69 99.90 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
1024是这个设备每次读请求的最大扇区数,由于预读的大小是2048,所以可以看到IO队列深度提高到了3.48,比前面的256时的2高出将近1倍。
[root@node2 ~]# blockdev --getmaxsect /dev/mapper/centos-root 1024
关于预读算法的说明可参考下面的第一篇文章,预读算法会尽量避免对随机读的预读,防止无效的预读。