系统极客一直在努力
专注于操作系统及软件使用教程

压缩Azure VM数据磁盘未使用空间减少计费容量

shirnk-azure-vhd-size

一些 Microsoft Azure 上的 Linux VM 用户遇到过一个令人困惑的数据磁盘计费问题。一旦写入大量数据使得磁盘容量变大后,即使删除那些数据,仍会一直按照所达到过的最大磁盘容量计费。这实际上是由于一部分 Linux GuestOS 操作系统不支持一些必要的功能或用户没做磁盘维护所致。

在 Microsoft Azure上,如果我有一个 100GB 的虚拟磁盘,里面实际只保存了 20GB 的数据,这个磁盘的实际大小会是 20GB,也只会以 20GB 计费(Premium Storage除外)。然而当我再加入60GB,然后删除 30GB 后,这个磁盘的大小仍会是 80GB 而不是 50GB。它的原理是这样的:

  • 虚拟磁盘在 Azure 上是作为 Page Blob 来存储的。Page Blob 采用一种稀疏的存储方式,只有实际写入数据的容量会被计费。这就是为什么上面的例子中一开始以 20GB 计费。
  • 在普通的文件系统中,当一个文件被删除后,它只是被标记为删除,而实际在存储介质上的数据不会被清空。这也是为什么我们能通过一些软件来恢复已经删除的文件。在 Page Blob 这样的稀疏存储系统中也是一样的,当一个虚拟磁盘中的文件被删除后,已经分配给它的空间不会自动释放,所以才会继续计费。Azure VM 作为一个 IaaS 服务,在没有操作系统配合的情况下无法从外部判断哪些空间可以释放。

为了解决这个问题,Azure VM 支持了 TRIM 功能。这个功能原先用于在 SSD 上释放写入过的空间,Azure VM 操作系统通过这个命令来告知 Page Blob 哪些空间可以释放,从而减少计费容量。现在大部分 Azure 上由微软提供的映像所使用的操作系统都支持 TRIM 功能,包括所有 Windows 映像和较新的 Linux 映像(所有UbuntuSUSE Linux Enterprise Server 12)。对 TRIM 能支持的确切版本信息,请查询具体 Linux 发行版本提供商的技术文档。

在支持 TRIM 功能的 Linux 系统中,可以用fstrim命令来执行操作。例如:对一个挂载在/mnt/data的 Azure 磁盘执行 TRIM 操作可以用以下命令:

sudo /sbin/fstrim /mnt/data

现在我们明白了虚拟磁盘计费的原理,就可以理解导致「已释放」空间被计费问题的原因。为了减少计费容量,首先要确定操作系统是否支持 TRIM 功能。尤其在 Linux 的情况下,不同系统版本的支持情况都略有不同,需要用户自己根据实际配置去确认和启用。如果系统支持,还须在必要时去执行它。为了方便维护,可以建一个 crontab 任务来定期执行。

分享到:更多 ()