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

分类: LINUX

磁盘预读可以改善顺序读的性能,并且测试发现每个读请求的大小也受预读大小的影响,也就是发生了IO合并。

在每次8K的顺序读中,关闭预读时,每个IO是8个扇区(4K); 增大预读,每个IO大概等于预读大小,但最大是设备的单个IO大小的上限(这里是1024)。 下面是详细的测试。

环境

台式机上的CentOS7.1 4核虚机
消费级SSD

准测试数据

dd if=/dev/zero of=testdata bs=8096 count=100000 

关闭预读的测试

  1. 关闭预读

    /sbin/blockdev --setra 0 /dev/mapper/centos-root
    /sbin/blockdev --setfra 0 /dev/mapper/centos-root 
  2. 清缓存

    sync
    echo 3 > /proc/sys/vm/drop_caches 
  3. 执行顺序读操作

    [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

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

设置预读大小为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 


结论


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

参考

关于预读算法的说明可参考下面的第一篇文章,预读算法会尽量避免对随机读的预读,防止无效的预读。

  • http://os.51cto.com/art/200910/159067.htm
  • http://tech.hexun.com/2011-03-28/128268656.html
### 回答1: `blockdev --getbsz`是一个 Linux 命令,用于获取块设备的块大小(单位为字节)。如果你要获取的是挂载在系统上的文件系统的块大小,可以先使用 `df -T` 命令获取文件系统挂载点的路径,然后再使用 `blockdev --getbsz /dev/path-to-device` 命令获取对应的块大小,其中 `/dev/path-to-device` 是文件系统对应的块设备路径。例如,要获取 `/dev/sda1` 分区的块大小,可以使用以下命令: ``` blockdev --getbsz /dev/sda1 ``` 注意,这个命令只能用于块设备,不能用于普通的文件。 ### 回答2: blockdev --getbsz命令是用于查看指定块设备的块大小。块大小是指操作系统在访问磁盘设备时以固定尺寸进行读写操作的单元大小。 在Linux系统中,块大小一般是512字节或4KB。使用blockdev --getbsz命令,可以获取当前系统中指定块设备的块大小。 例如,运行命令blockdev --getbsz /dev/sda,可以得到块设备/dev/sda的块大小。如果返回值是512,则表示该块设备的块大小是512字节;如果返回值是4096,则表示该块设备的块大小是4KB。 了解块设备的块大小对于磁盘 I/O 的性能优化是很重要的。较大的块大小可以减少磁盘 I/O 次数,提高读写效率;而较小的块大小可以提供更精细的数据控制,适用于某些特定的应用场景。 总之,通过blockdev --getbsz命令,可以方便地获取指定块设备的块大小信息,从而更好地了解和配置磁盘 I/O 操作。 ### 回答3: blockdev --getbsz 是一个用于查看块设备的块大小的命令。块大小是指在计算机存储中,将数据分成固定大小的块进行读写操作的单位。 使用 blockdev --getbsz 命令,可以获取当前块设备的块大小。块大小通常以字节(byte)为单位进行表示。块设备可以是硬盘、固态硬盘(SSD)、USB 驱动器等存储设备。块大小的选择会影响文件系统的性能和存储空间的利用效率。 一般来说,块大小越小,对于小文件的存储能力更高,但是会增加磁盘存储空间的消耗。而块大小越大,对于大文件的存储能力更高,但是对于小文件的存储空间利用相对较低。 通过 blockdev --getbsz 命令,我们可以轻松获取块设备的块大小,并根据实际需求进行优化。一般情况下,操作系统默认的块大小已经针对大部分应用进行了优化,因此在绝大多数情况下,不需要过多地调整块大小。但是对于特定的应用场景,如大规模数据分析或者高性能计算,可能需要调整块大小优化存储性能。 总的来说,blockdev --getbsz 是一个简单但重要的命令,可以帮助我们了解块设备的块大小,并在需要的时候进行调整以最大限度地发挥设备的性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值