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


    一些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,没有操作系统的配合无法从外部判断哪些空间可以释放。


    为了改善这个问题,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

  • 相关阅读:
    记录一次性能优化(转)
    Java线程池使用说明
    Spring AOP: Spring之面向方面编程
    hibernate 联合主键生成机制(组合主键XML配置方式)
    Hibernate配置文件hbm主键的generator可选项
    关于spring-mvc的InitBinder注解的参数
    Quartzs -- Quartz.properties 配置
    开源调度框架Quartz最佳实践
    Windows系统上如何使用SSH
    导入DEM数据到ArcGIS
  • 原文地址:https://www.cnblogs.com/new0801/p/6176125.html
Copyright © 2020-2023  润新知