释放Azure虚拟磁盘未使用空间以减少计费

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

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

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

为了改善这个问题,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 的情况下,各种不同的系统和版本的支持情况都略有不同,需要用户自己根据实际配置去确认和启用。如果系统支持,还须在必要时去执行它。为了方便维护,可以建一个计划任务来定期执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值