amazon-web-services - 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
所以来到实际的问题
- ebs 卷的实际块大小是多少?
- 是否
ashift=9
针对底层 EBS 卷进行了足够优化? - 对于 EBS,考虑到 zfs 总是在 128K 块中执行 i/o ,是否
ashift=12
会比ashift=9
在池上性能更高?recordsize=128K
已经使用此默认值 ashift 完成了 postgres 负载测试,因此将使用显式重复相同的操作ashift=12
。
解决方案
如果使用 ashift=9,EBS 性能(实际上是大多数 SSD 的性能)会非常糟糕。除非您有充分的理由不使用,否则您应该始终使用 ashift=12。
EBS 为您提供特定的 IOPS,并将 IOP 定义为“最大 16KB”。
通过启用 lz4 压缩,您将在 EBS 上获得最佳性能,并使用尽可能大的记录大小,除非您有理由变小,因为这将使压缩更有效。变小的原因通常与使用写入较小页面的应用程序有关。例如,您可能希望为 MySQL/InnoDB 设置 recordsize=16kb 或为 PostgreSQL 设置 recordsize=8kb。
但始终设置 ashift=12 除非您有非常好的理由不这样做,即使这样,这些原因通常也涉及增加 ashift 而不是减少它。
推荐阅读
- javascript - javascript中的最佳算法分组数据
- image-processing - 光学字符识别 - 它是如何工作的?
- r - Knitr 钩子在 tex 文件中的 \documentclass 行之前添加代码,以避免选项与 xcolor 冲突
- composer-php - 作曲家:无法消除对生产的依赖
- docker - 在高山容器上使用 apt-get
- php - 如何根据codeiginter中的日期从3个表中获取数据?
- spring - Spring数据Elasticsearch动态更改indexName
- java - 为什么我必须输入 ID (PK) - 自动生成 ID 的问题
- search - 从geoserver全局搜索geojsons
- regex - 使用正则表达式使用谷歌标签管理器提取部分 URL