引言

在使用ZFS的时候发现一个现象,创建一个ZFS卷后,某些情况下这个卷在zpool中占用的空间比实际使用的空间大很多,这个问题的出现让人不禁一身冷汗,难道ZFS在某些情况下会导致大量空间损耗,我们来一步步的分析下这个问题。

测试分析

首先想到的可能原因就是blocksize,测试结果也正如我们所料,如下图,在8K的时候正常,但是在4K的时候却出现了,而且正好是放大两倍:

但是问题就这么简单? No No No(手动摇头)

先是理论上就讲不通,因为底层盘如果是HDD那么它的sector(扇区)是512B,如果是SSD那么就是4K(可能存在8K的,我们使用的均是4K),所以无论底层盘是什么,IO的最小操作单位只要不小于4K就不会引起放大,所以ZFS卷的blocksize设为4K还出现这个问题就说不通。第二点就是,我们之前测试了很多次的4K的blocksize都没有发现这个问题,于是找到一个之前的老环境,结果发现无论4K还是8K都是正常结果,这就尴尬了,只能先喝杯水淡定下。

重新对比下环境,操作系统、ZFS版本,创建卷的过程都一样,唯一不一样的就是不是同一个zpool,而创建zpool的过程中我们改动的唯一参数就是——ashift,这个从来没引起我注意的参数,然后就查了下它的官方解释:

Top-level vdevs contain an internal property called ashift, which stands for alignment shift. It is set at vdev creation and it is immutable. It can be read using the zdb command. It is calculated as the maximum base 2 logarithm of the physical sector size of any child vdev and it alters the disk format such that writes are always done according to it. This makes 2^ashift the smallest possible IO on a vdev.

这段说明总结起来就是——ashift参数就是设置zpool中对于底层IO操作的最小单位,它的值是以2为底的IO最小操单位的对数,豁然开朗!

验证

于是通过zdb命令查询下这个参数的值,不出所料有问题的zpool中ashift设置的是13,同时在不设置这个ashift参数的方式新创建新的zpool也不会出现这个问题。

找到问题了!但是,慢着!到底是谁设置这个参数为13的?算了,不管了(手动甩锅)… …


深入讨论

接着说ashift参数,它会根据底层盘的驱动报告的sector(扇区)大小自动设置,比如底层盘为HDD一般会报告自己的sector(扇区)为512B,那么ashift的默认值就是9,所以看起来如果不设置就没问题,但是Flash-based的存储设备(例如Flash卡)可能由于某些原因并不会准确的报告自己的sector(扇区),它们可能会伪装成512B,实际却是4K或者8K,因此设置ashift某些情况下是必须的。

整个存储模型分为三层,它们共同决定了这个异常现象的出现:

1. zvol的blocksize

2. zpool的逻辑sector(ashift控制)

3. 物理sector

如果要使整个存储模型运转正常,必须满足如下公式:

zvol的blocksize  >=  zpool的逻辑sector  >=  物理sector

番外

最后说一句题外话:硬件的标准的参差不齐着实让人头痛,只能硬件不够软件凑了。

ZFS的ashift参数解读相关推荐

  1. Tomcat - Tomcat 网络通信模型剖析 并发参数解读

    文章目录 什么是IO Tomcat 支持四种线程模型 Tomcat 如何使用指定IO模型 Tomcat BIO VS NIO BIO NIO 影响 BIO/NIO线程数量的多少的因素 Tomcat c ...

  2. kube-controller-manager 配置参数解读

    下面是kube-controller-manager version 1.12.0的所有配置,其中高亮加粗的是我认为需要注意的Flag. Flag Comments –allocate-node-ci ...

  3. numpy.repeat作用,语法,参数解读以及实例

    numpy.repeat() 作用 可以用于重复数组中的元素 语法 numpy.repeat(a, repeats, axis=None) 参数解读 Parameters a : array_like ...

  4. 【机器学习】hist参数解读

    在对数据进行可视化时,用hist来查看单一特征是很重要的,结合着看多种图表,有助于获得对数据的进一步理解. 本篇是对 https://pandas.pydata.org/pandas-docs/sta ...

  5. 运算放大器基本原理与参数解读

    目录 1.运放的基本结构 2.运放的参数解读 2.1 工作范围 2.2 电气参数 2.2.1 失调电压(offset voltage) 2.2.2 共模电压(VCM)和共模抑制比(CMRR) 2.2. ...

  6. 初识EMC元器件(五)——电容参数解读及选型应用

    一.什么是电容 什么是电容?这位朋友太过熟悉反而不知道该如何介绍它,也无需在此赘述.电容主要用于滤波.储能.隔直流.耦合.谐振.降压等电路中,但此次我们主要聊的是EMC滤波功能. 滤波原理:利用电容对 ...

  7. 初识EMC元器件(九)——气体放电管的参数解读及选型应用

    一.什么是气体放电管 气体放电管(Gas Discharge Tube,简称GDT),是一种陶瓷或玻璃封装,其内部充有一定量的惰性气体,管内有两个或多个电极的保护器件. 保护原理:气体放电管应用原理是 ...

  8. 计算机配件及其参数,型号后缀看不懂 电脑核心硬件参数解读

    1型号后缀要看懂 DIY硬件参数解读 DIY电脑除了其独特的魅力在于其高性能.个性化,除此之外,大多数DIY玩家的计算机水平也正因为其专业性而有别于普通电脑玩家.DIY电脑的乐趣在于亲手创造,可以根据 ...

  9. PCIe交换机的作用和参数解读:PEX89144为例,PCIe交换机能做些什么

    引言 超微的SYS-821GE-TNHR/FTNHR服务器的PCIe扩展接口数量确实超过了第四代英特尔至强处理器所能提供的通道数.这是因为该服务器采用了一种称为PCIe交换机的硬件设备,它可以将少量P ...

  10. 初识EMC元器件(三)——共模电感的参数解读

    一.什么是共模电感 1.定义 :共模电感(Common mode Choke),是在一个闭合磁环上绕制方向和匝数相同的线圈.其共模阻抗很大,对共模干扰具有抑制作用:而差模阻抗很低,对差模信号基本无抑制 ...

最新文章

  1. linux上的用户管理
  2. 如何在aspx.cs 里面获取html 控件值
  3. 蓝色药水c语言源代码,蓝色药水4.cpp
  4. SQL语句执行效率及分析(note)
  5. intellij出现Error assembling JAR: invalid entry size
  6. 进程管理:fork与exec函数及fork子进程和父进程
  7. Mac上“照片”的终极工具箱​​​​ PowerPhotos
  8. 转载:ofstream和ifstream详细用法
  9. Jstorm到Flink 在今日头条的迁移实践
  10. 企业为什么需要EDI?
  11. 插上U盾计算机无法识别,U盾插入电脑后没反应,网上银行识别不了?
  12. 三分钟带你快速了解网站开发的整个流程
  13. 杭州电子科技大学ACM-1096
  14. 多种代码生成炫酷代码雨(推荐)
  15. Windows系统下运行hadoop、HBase程序出错Could not locate executablenull\bin\winutils.exe in the Hadoop binaries
  16. knife-4j 点击列表出现空白页怎么办?
  17. 【网络】Padavan固件获取运营商ipv6设置
  18. 2021十个最佳linux发行版介绍
  19. win10卸载AVG AntiVirus Free
  20. 龙蜥社区技术委员会主席杨勇:下一代操作系统展望

热门文章

  1. Node.js开发入门—使用http访问外部世界
  2. “2022绿色智能制造创赢计划”全新集结:加入这个朋友圈,成为未来主角
  3. PyQt设置右下角弹窗(转)
  4. C# 获取鼠标屏幕坐标有误差,鼠标定位误差问题,Windows10 C#获取鼠标坐标不准 的解决方法
  5. xdoj系统_基于RBRVS和DRGs的医院绩效管理体系如何建立?
  6. java 使用POI 导出 Excel 画斜线
  7. 利用python实现华氏温度和摄氏温度的转换
  8. 疯狂python讲义豆瓣评分_书榜 | 计算机书籍(9.16-9.22)销售排行榜
  9. 研究生做实验时被炸伤致残!法院判决:驳回高校上诉,赔偿162万!
  10. 《阴阳师·2栀子女》原作:梦枕貘