适用于AWS EBS卷的ZFS ashift属性

时间:2018-09-06 19:23:59

标签: amazon-web-services ubuntu-16.04 zfs

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

EBS向OS公告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迁移到Postgres到EC2实例(具有压缩功能的EBS上的ZFS)。创建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重复相同的操作。

2 个答案:

答案 0 :(得分:0)

对于EBS,物理磁盘扇区大小已完全抽象掉。 EBS卷是网络连接的存储。此存储可以包含数千个磁盘驱动器。现代SAN控制器可以同时支持多种类型的磁盘驱动器。

在当今的磁盘驱动器中,报告的物理扇区大小为512字节和4096字节。但是,这仅仅是一种寻址方案,因为磁道大小决定了性能。磁盘外部磁道上的磁道大小大于内部磁道上的磁道大小。一些磁盘驱动器会增加内部磁道的BPI,但这可能会带来更高的错误率。

如果您认为可以根据一些理论扇区大小来优化EBS容量,那是错误的。明天您此时看到的数字可能会完全不同。诸如控制器,网络延迟,网络速度,与物理驱动器的距离等因素均相互影响。

通过使用更大的块大小,您将获得更好的结果。实际物理扇区大小不再是一个相关的概念。另外,您无法控制AWS向VM报告的“逻辑”物理扇区大小。

答案 1 :(得分:0)

如果使用ashift = 9,则EBS性能(事实上,大多数SSD的性能)会非常差。除非有充分的理由不这样做,否则应该始终使用ashift = 12。

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

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

但是除非您有非常充分的理由不这样做,否则始终将ashift = 12设置为,即使这样,此类原因通常也涉及增加而不是减少移位。