首页 > 解决方案 > AWS EBS 卷的 ZFS ashift 属性

问题描述

AWS EBS 卷的实际物理扇区大小是多少?

EBS 将physical_block_size 和logical_block_size 作为512 通告给操作系统

ubuntu@ip-172-31-28-17:~$ cat /sys/block/xvdi/queue/physical_block_size 
512
ubuntu@ip-172-31-28-17:~$ cat /sys/block/xvdi/queue/logical_block_size 
512

我们正在从 RDS 迁移到 EC2 实例(带压缩的 EBS 上的 ZFS)到 Postgres。创建 zpool 时,ashift未给出值

ubuntu@ip-172-31-28-17:~$ sudo zpool create pgstripe /dev/xvdf1 /dev/xvdg1 /dev/xvdh1 /dev/xvdi1
....
ubuntu@ip-172-31-28-17:~$ sudo zpool get ashift
NAME      PROPERTY  VALUE   SOURCE
pgstripe  ashift    0       default

据说该值ashift=9可能会影响现代存储设备的性能。所以在验证了池的实际值后ashift,发现它确实是ashift=9

ubuntu@ip-172-31-28-17:~$ sudo zdb -U /etc/zfs/zpool.cache 
pgstripe:
    version: 5000
    name: 'pgstripe'
    state: 0
    txg: 21518
    pool_guid: 18259321190878592884
    errata: 0
    hostname: 'ip-172-31-28-17'
    vdev_children: 4
    vdev_tree:
        type: 'root'
        id: 0
        guid: 18259321190878592884
        create_txg: 4
        children[0]:
            type: 'disk'
            id: 0
            guid: 6596053233879303485
            path: '/dev/xvdf1'
            whole_disk: 0
            metaslab_array: 39
            metaslab_shift: 31
            ashift: 9
            asize: 322116780032
            is_log: 0
            create_txg: 4
        children[1]:
            type: 'disk'
            id: 1
            guid: 10755479908569617562
            path: '/dev/xvdg1'
            whole_disk: 0
            metaslab_array: 37
            metaslab_shift: 31
            ashift: 9
            asize: 322116780032
            is_log: 0
            create_txg: 4
        children[2]:
            type: 'disk'
            id: 2
            guid: 7517133622037333375
            path: '/dev/xvdh1'
            whole_disk: 0
            metaslab_array: 36
            metaslab_shift: 31
            ashift: 9
            asize: 322116780032
            is_log: 0
            create_txg: 4
        children[3]:
            type: 'disk'
            id: 3
            guid: 17044638243598443214
            path: '/dev/xvdi1'
            whole_disk: 0
            metaslab_array: 34
            metaslab_shift: 31
            ashift: 9
            asize: 322116780032
            is_log: 0
            create_txg: 4
    features_for_read:
        com.delphix:hole_birth
        com.delphix:embedded_data

所以来到实际的问题

  1. ebs 卷的实际块大小是多少?
  2. 是否ashift=9针对底层 EBS 卷进行了足够优化?
  3. 对于 EBS,考虑到 zfs 总是在 128K 块中执行 i/o ,是否ashift=12会比ashift=9在池上性能更高?recordsize=128K

已经使用此默认值 ashift 完成了 postgres 负载测试,因此将使用显式重复相同的操作ashift=12

标签: amazon-web-servicesubuntu-16.04zfs

解决方案


如果使用 ashift=9,EBS 性能(实际上是大多数 SSD 的性能)会非常糟糕。除非您有充分的理由不使用,否则您应该始终使用 ashift=12。

EBS 为您提供特定的 IOPS,并将 IOP 定义为“最大 16KB”。

通过启用 lz4 压缩,您将在 EBS 上获得最佳性能,并使用尽可能大的记录大小,除非您有理由变小,因为这将使压缩更有效。变小的原因通常与使用写入较小页面的应用程序有关。例如,您可能希望为 MySQL/InnoDB 设置 recordsize=16kb 或为 PostgreSQL 设置 recordsize=8kb。

但始终设置 ashift=12 除非您有非常好的理由不这样做,即使这样,这些原因通常也涉及增加 ashift 而不是减少它。


推荐阅读