开发者社区> 问答> 正文

为什么文件系统和快照空间大小不一致?


有用户咨询,在ECS实例内删除文件后再打快照,发现快照容量并没有变小。出现该现象的原因与快照原理、以及文件系统与磁盘、快照的关系有关,即,只要被写过数据的存储块(Block),即使在磁盘中的相关文件已经被删除,数据块仍会被记录到快照中,所以出现快照比磁盘占用空间大的现象。文件系统中所谓删除只是在需要删除的文件头部做个标记,让用户知道这块空间可以利用了,但并不会减少磁盘本身的空间占用。

为什么文件系统和快照空间大小不一致?


用户在实例内部看到的是磁盘 (EBS),在磁盘分区上创建的是文件系统 (File System)。文件系统负责管理磁盘空间,其操作最终均转化为磁盘的 I/O 请求。EBS 会记录 Block(指磁盘的逻辑块地址被块存储划分为相同大小的块)状态,按需将脏数据拷贝到 OSS,这就是打快照的过程。
以下原因可能会造成文件系统的空间与快照大小不一致:

  • 文件系统本身的元数据会占用磁盘空间。
  • 创建文件系统过程会写大量 Block。特别的,Windows 的慢速格式化会写脏大量 Block,而使用快速格式化可以减少写Block 的数量。
  • 文件系统为了减小开销,删除文件只是在内部做个标记,而 EBS 不感知这个删除指令,Block 仍然是已分配状态,所以仍会把这部分也做到快照里,导致快照比文件系统大。
  • Virtio-block 和 Xen 的 Block-front 等模块不支持 TRIM 指令(一种IO指令,提示LBA上的某段数据不再使用,可以被删除),因而磁盘无法感知数据可以被删除。


创建快照原理


创建快照原理如下图所示。
说明:
  • 将磁盘 LBA(逻辑块地址) 划分为 Block,未分配过的称为空块,图中白色小方框表示。
  • 只要 Block 被写过(已分配,将不再是空块),就将参与计量。
  • 磁盘第一个快照是全量,空块不拷贝。
  • 磁盘后续快照是增量快照,拷贝自上一个快照以来的增量脏数据,因此同一个 Block 在不同快照中可能会出现多个版本(图中用不同颜色来表示)。



快照计量方法

  • 如上图所示,快照记录空间共有 11 个 Block,比磁盘 T2 中的 9 个 Block 还要多出 2 个。
  • 对单块磁盘的所有快照整体计量。
  • 只对已分配的 Block 进行计量。不同时间点相同版本 Block 只统计一次。
  • 不同版本的 Block 占用 N 倍空间。


删除快照的原理


删除快照的原理如下图所示。
说明:
  • 离线分析已删除快照的所有 Block,删除其中未被其他快照引用的数据。
  • 删除 S1 之后,剩下的快照一共有 10 个 Block(包含 S0 的 6 个、S1 产生的 2 个脏数据、S2 的 2 个。),而不是 8 个 Block(S0 的 6 个、S2 的 2 个)。



“数据写入操作”的准确定义


首先澄清一个概念,对底层分布式存储系统而言,“数据写入操作”不仅仅意味着用户写入的业务数据,也包括格式化磁盘等一系列I/O操作。
用户在拿到磁盘后,必须要先格式化才能正常使用。格式化的本质是建立文件系统的过程。一个分区或磁盘在作为文件系统使用前,需要初始化,并将数据结构记录到磁盘上,这个过程就叫建立文件系统。
因此,在磁盘上建立文件系统,也就意味着对磁盘有数据写入操作。不同的文件系统,在格式化时写入的文件大小也不尽相同,具体如下:
  • Windows系统格式化,分为快速和正常格式化:快速格式化只是给分区分配文件系统,并重写目录表;
  • 正常格式化不但会进行上述工作,还会对分区逐扇区进行扫描以确定和标记坏扇区;
  • 因此正常格式化操作,会填充磁盘空块,相当于把磁盘全盘写了一遍。在此种情况下,第一个全量快照的大小会近似于磁盘容量。而快速格式化占用的实际空间则相对较少。
Linux系统格式化,也同样是建立文件系统的过程。因此刚刚格式化完毕的磁盘,在用户没有写入业务数据的时候,第一个快照也会有一定的容量大小,具体要看不同的文件系统格式而定。

展开
收起
boxti 2017-10-20 10:46:07 3327 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载