0
点赞
收藏
分享

微信扫一扫

linux预读对磁盘IO的影响

预读也就是linux会读取比应用程序需求多的页面缓存到内存中,配置预读可以提高顺序扫描的性能,也就是说可以提高全表扫描的效率,但是预读可能会对随机访问产生一定的影响,具体是不是,影响多少还需要去确认。这篇短文主要介绍一下预读的配置以及他对linux磁盘读取行为的影响。

预读的配置

修改的方式很简单:

# 查看当前大小
blockdev --getra /dev/sdb
# 设置(单位是扇区,换算为字节需要乘以512)
blockdev --setra 16384 /dev/sdb

但是在很多环境中会涉及到裸设备或者多路径的问题,这个时候只需要对聚合后的路径做配置。

测试验证

pv: /dev/sdb

lv:/dev/mongo_data/mg_data1

SSD存储

[root@vm002 ~]# ls -l /dev/mongo_data/mg_data1 
lrwxrwxrwx 1 root root 7 Sep 13 05:10 /dev/mongo_data/mg_data1 -> ../dm-4
[root@vm002 ~]# blockdev --getra /dev/mongo_data/mg_data1
8192
[root@vm002 ~]# blockdev --getra /dev/sdb
8192
[root@vm002 ~]#

关闭预读时的表现

a) 使用blockdev关闭/dev/mongo_data/mg_data1的预读

blockdev --setra  /dev/mongo_data/mg_data1
[root@vm002 ~]# blockdev --report
RO RA SSZ BSZ StartSec Size Device
rw 8192 512 4096 0 42949672960 /dev/sda
rw 8192 512 512 2048 209715200 /dev/sda1
rw 8192 512 4096 411648 42738909184 /dev/sda2
rw 8192 512 4096 0 5368709120 /dev/sdb
rw 8192 512 4096 2048 5367660544 /dev/sdb1
rw 256 512 512 0 1073741312 /dev/sr0
rw 256 2048 4096 0 57978880 /dev/sr1
rw 8192 512 512 0 40684748800 /dev/dm-0
rw 8192 512 4096 0 2046820352 /dev/dm-1
rw 8192 512 2048 0 4571791360 /dev/loop0
rw 0 512 512 0 5268045824 /dev/dm-4

在这里可以看到,对/dev/mongo_data/mg_data1(也就是dm-4)做修改,这个变化会立刻显示到对应的dm上面,但是块设备/dev/sdb还是原来的8192

b) 使用dd测试读取

[root@vm002 mg_data]# echo 3 > /proc/sys/vm/drop_caches
[root@vm002 mg_data]# dd if=testdata bs=8192 count=1000000 of=/dev/null
98828+1 records in
98828+1 records out
809600000 bytes (810 MB) copied, 24.0027 s, 33.7 MB/s


Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 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
sdb 0.00 0.00 9803.00 0.00 39212.00 0.00 8.00 0.77 0.08 0.08 0.00 0.08 76.90
scd1 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 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
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
loop0 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 9802.00 0.00 39208.00 0.00 8.00 0.77 0.08 0.08 0.00 0.08 76.80

在关闭预读的情况下,rKB=39208,avgrq-sz=8,实际上已经生效了,不需要在对/dev/sdb做配置

设置预读为128,观察影响

a) 设置预读为128并且确认

[root@vm002 ~]# blockdev --setra 128 /dev/mongo_data/mg_data1^C
[root@vm002 ~]#
[root@vm002 ~]# [root@vm002 ~]# blockdev --getra /dev/mongo_data/mg_data1
bash: [root@vm002: command not found...
[root@vm002 ~]# blockdev --getra /dev/mongo_data/mg_data1
128

b) 使用dd测试

[root@vm002 mg_data]# echo 3 > /proc/sys/vm/drop_caches 
[root@vm002 mg_data]# dd if=testdata bs=8192 count=10000000 of=/dev/null
98828+1 records in
98828+1 records out
809600000 bytes (810 MB) copied, 1.47679 s, 548 MB/s

c) 结果

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
dm-4 0.00 0.00 881.00 0.00 56248.00 0.00 127.69 0.14 0.16 0.16 0.00 0.09 8.10
dm-4 0.00 0.00 2289.00 0.00 146420.00 0.00 127.93 0.64 0.28 0.28 0.00 0.16 37.30
...
...
...

在这里可以看到avgrq-sz=128,也就是每次IO读取128个扇区。每秒881次读取,所以每秒读为:881128512,大概每秒56M的

发现的问题(未解决)

测试发现,预读大小最大只能到4096左右,就算配置了8192也不能实现?目前还不知道为什么。在lvcreate 里面看到了-r的选项,一开始以为是这个选项导致的,使用lvcreate -r 8192 -L 5000M -n mg_data1 mongo_data重新创建lv然后重新测试,结果还是只能到4096

预读2000的时候

[root@vm002 mg_data]# blockdev --setra 2000 /dev/mongo_data/mg_data1
[root@vm002 mg_data]# echo 3 > /proc/sys/vm/drop_caches
[root@vm002 mg_data]# dd if=testdata bs=4096 count=100000000 of=/dev/null
1185937+1 records in
1185937+1 records out
4857600000 bytes (4.9 GB) copied, 3.72083 s, 1.3 GB/s

dm-4 0.00 0.00 1240.00 0.00 1239000.00 0.00 1998.39 1.14 0.92 0.92 0.00 0.74 92.00
dm-4 0.00 0.00 1495.00 0.00 1494000.00 0.00 1998.66 0.97 0.65 0.65 0.00 0.61 91.20
dm-4 0.00 0.00 579.00 0.00 578776.00 0.00 1999.23 0.37 0.63 0.63 0.00 0.60 34.80

预读3000的时候

[root@vm002 mg_data]# blockdev --setra 3000 /dev/mongo_data/mg_data1
[root@vm002 mg_data]# echo 3 > /proc/sys/vm/drop_caches
[root@vm002 mg_data]# dd if=testdata bs=4096 count=100000000 of=/dev/null
dm-4 0.00 0.00 776.00 0.00 1162500.00 0.00 2996.13 1.24 1.60 1.60 0.00 1.22 94.30
dm-4 0.00 0.00 839.60 0.00 1257920.79 0.00 2996.46 1.04 1.24 1.24 0.00 1.03 86.34
dm-4 0.00 0.00 936.00 0.00 1402500.00 0.00 2996.79 0.92 0.98 0.98 0.00 0.94 87.90

预读5000的时候

[root@vm002 mg_data]# echo 3 > /proc/sys/vm/drop_caches                  
[root@vm002 mg_data]# dd if=testdata bs=4096 count=100000000 of=/dev/null
1185937+1 records in
1185937+1 records out
4857600000 bytes (4.9 GB) copied, 3.99822 s, 1.2 GB/s

dm-4 0.00 0.00 658.00 0.00 1343488.00 0.00 4083.55 1.34 2.04 2.04 0.00 1.14 75.00
dm-4 0.00 0.00 767.00 0.00 1568768.00 0.00 4090.66 0.98 1.27 1.27 0.00 0.90 69.00
dm-4 0.00 0.00 389.00 0.00 795560.00 0.00 4090.28 0.49 1.26 1.26 0.00 0.87 33.90


举报

相关推荐

0 条评论