ZFS和4k扇区硬盘

近年4K硬盘1),2)越来越多, 但是为了保证与老版本系统的兼容性, 一些硬盘还是会报告给OS自己是512 bytes 的, 比如我遇到的一个情况就是,我add一个SLC芯片的SSD做zpool的zil设备,但是查询得知ashift=9,也就是说SSD被当做 512 byte 的磁盘来对待了, 这样就会造成性能下降。

ZFS 中有一个ashift属性, ashift=12 性能最佳,实现方式大致为:

  • zfsonlinux 可以在 zpool create/add -o ashift=12 tank sda 时指定,也只能在创建zpool时指定,后面改不了;
  • freebsd 可以通过系统参数修改;
  • illumos 系列3)通过编辑 /kernel/drv/sd.conf 4) 来override;

# 判断磁盘block size,0x1000=4k,0x200=512byte
echo ::sd_state | mdb -k | egrep '(^un|_blocksize)'
# 获取磁盘的VID,PID
iostat -Er | grep -i vendor | sort | uniqecho "::walk sd_state | ::grep '.!=0' | ::print struct sd_lun un_sd | \
::print struct scsi_device sd_inq | ::print struct scsi_inquiry \
inq_vid inq_pid" | mdb -k
# 将下面的条目增至sd.conf
vim /kernel/drv/sd.conf
sd-config-list = "VID PID", "physical-block-size:4096";		#针对填写VID,PID的设备生效
sd-config-list = "**", "physical-block-size:4096";		#针对全部设备生效
 
# 使设置生效
update_drv -vf sd
reboot -p	#如有必要需reboot
# 再次add/create zpool
zpool add tank log c5t1d0
# 查询zpool的ashift属性,12即为期望值
zdb | egrep 'ashift|name'
# 数据迁移
zfs send ... | zfs recv ...


1)
Advanced Format
2)
4k sector,传统是512 bytes
3)
omnios,openindiana,smartos等
4)
好像pkg update更新kernel后就要重新设置
  • storage/zfs/zfs之4k硬盘.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)