释放虚拟磁盘未使用空间来减少计费容量

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

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

虚拟磁盘在Azure上是作为页Blob来存储的。页Blob是一种稀疏的存储方式,只有实际写入数据的容量会被计费。这就是为什么上面的例子中一开始以20GB计费。在普通的文件系统中,当一个文件被删除后,它只是被标记为删除,而实际的存储介质上的数据不会被清空。这也是为什么我们能通过一些反删除软件来恢复已经删除的文件。在页Blob这样的稀疏存储系统中也是一样的,它的存储结构如下图所示,包含了Header, Footer和Data blocks。我们在对它执行写操作时,文件系统会去寻找符合待写入文件大小的连续数据块。假设一个文件数据被写入了Data Block i ~ Data Block i+k,当该文件被删除后,这些Data Block并不会被完全释放,与普通文件系统类似,它们只是被标记为可写数据块。这就导致在计算存储使用量时,这部分容量仍然被计算在内。Azure虚拟机作为一个IaaS,没有操作系统的配合无法从外部判断哪些空间可以释放。

1

为了改善这个问题,Azure虚拟机支持了TRIM功能。这个功能原先用于来自于固态硬盘(SSD),用于释放写入过的空间。在Azure上,虚拟机操作系统通过这个命令来告知页Blob哪些空间可以释放,从而减少计费容量。现在大部分Azure上由Microsoft提供的映像所使用的操作系统都支持TRIM功能,包括所有Windows的映像,和较新的Linux映像(如所有UBUNTU,centos 7.2,和SUSE Linux Enterprise Server 12)。对TRIM功能支持的确切版本信息,请查询具体Linux发行版本提供商的技术文档。对于不支持的TRIM的Linux版本,可尝试安装Linux Integration Services Version 4.1 for Hyper-V驱动,增加对TRIM的支持。

在Windows系统中,这个功能是通过驱动器优化提供的,默认每周会自动执行一次。当然也可以在“控制面板->系统和安全->对你的驱动器进行碎片整理和优化”中进行手动执行或更改设置。另一个必要条件是启用UnMap,因为在Azure虚拟机上是默认不启用的,需要通过以下命令启用。

fsutil behavior set DisableDeleteNotify 0

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

sudo /sbin/fstrim /mnt/data

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

最后,笔者再介绍一个用于查询Azure上的虚拟磁盘实际可计费大小的工具(https://github.com/sandrinodimattia/WindowsAzure-VhdSize/releases/tag/v1.0)。它由Microsoft Azure MVP,Sandrino Di Mattia开发,默认用于国际版Azure,也可用于中国版。用法:wazvhdsize.exe <存储账户名> <访问密钥> <VHD的URL>

常见问题

问:如果在虚拟机上挂载一个100GB的数据盘,是只对使用的部分收费,还是整个100GB 收费?
答:如果您的存储账号类型是高级存储,那么我们会按照磁盘大小(如P10,P20, P30)收取每月固定费用;如果您的存储账号是其他类型(比如普通账号),则按照您的实际使用量进行收费。
问:Azure存储是如何统计磁盘计费容量的?
答:请参考这篇文档,里面详细阐述了存储容量的计算算法。算法的PowerShell实现样例可以在这里下载

参考文献 Release unused space from your Windows Azure Virtual Hard Disks to reduce their billable size, Sandrino Di Mattia, 2013-12-19

TRIM Support comes to Windows Azure Virtual Machines, MikeWo, 2013-10-14

Disk Storage on Linux VMs in Azure, https://convective.wordpress.com, 2014-5-27