android io预读大小,blockdev --setra预读优化和IO请求的大小

本文通过测试展示了磁盘预读如何影响顺序读取性能。关闭预读时,每个IO大小为8个扇区;开启预读并增大预读大小,IO大小随之增加,读取速度显著提升。预读优化能够有效利用IO设备处理能力,提高读取效率。测试结果显示,预读大小设置为2048时,读取速度达到30.6MB/s,IO队列深度也随之提高。预读算法旨在避免对随机读的预读,防止无效操作。
摘要由CSDN通过智能技术生成

磁盘预读可以改善顺序读的性能,并且测试发现每个读请求的大小也受预读大小的影响,也就是发生了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

清缓存syncecho 3 > /proc/sys/vm/drop_caches

执行顺序读操作[root@node2 ~]# dd if=testdata bs=8192 count=100000 of=/dev/null98828+1 records in98828+1 records out809600000 bytes (810 MB) copied, 150.268 s, 5.4 MB/s

在没有预读的情况下,读取速度5.4 MB/s,说明每个IO大小是8个扇区(4KB),取的是iostat中途的值。[root@node2 ~]# iostat -xm 1 100avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 8.22 15.38 0.00 76.39Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda 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.70sdb 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.00scd0 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.00dm-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.90dm-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.00dm-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.00dm-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.00dm-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.00dm-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.00dm-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

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/null98828+1 records in98828+1 records out809600000 bytes (810 MB) copied, 38.2959 s, 21.1 MB/s

相应的每个读请求的大小也也通过IO合并扩大到了256扇区左右。(下面除avgrq-sz,avgqu-sz外,其它值每秒的波动很大,不可作为参考)[root@node2 ~]# iostat -xm 1 100avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.50 24.81 0.00 74.69Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda 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.20sdb 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.00scd0 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.00dm-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.20dm-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.00dm-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.00dm-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.00dm-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.00dm-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.00dm-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

设置预读大小为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/null98828+1 records in98828+1 records out809600000 bytes (810 MB) copied, 26.4212 s, 30.6 MB/s

相应的每个读请求的大小也扩大到了1024扇区左右。[root@node2 ~]# iostat -xm 1 100avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 1.51 23.62 0.00 74.87Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda 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.90sdb 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.00scd0 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.00dm-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.90dm-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.00dm-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.00dm-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.00dm-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.00dm-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.00dm-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-root1024

结论

在单个应用进行同步读操作时,可以通过avgrq-sz和avgqu-sz看出有没有进行预读优化,没有预读时通常avgrq-sz小于等于read()请求的size,avgqu-sz小于等于1。有预读时,avgrq-sz和avgqu-sz会相应增大,充分利用IO设备的处理能力。

参考

关于预读算法的说明可参考下面的第一篇文章,预读算法会尽量避免对随机读的预读,防止无效的预读。http://os.51cto.com/art/20092021年05月27日9067.htm

http://tech.hexun.com/2021年05月27日/128268656.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值