一些 Azure 上的虛擬機(jī)用戶(hù)遇到過(guò)一個(gè)令人困惑的虛擬磁盤(pán)計(jì)費(fèi)問(wèn)題伤塌。一旦寫(xiě)入大量數(shù)據(jù)使得磁盤(pán)容量變大后,即使刪除那些數(shù)據(jù)轧铁,仍會(huì)一直按照最大時(shí)得磁盤(pán)容量計(jì)費(fèi)每聪。這實(shí)際上是由于一部分虛擬機(jī)上的操作系統(tǒng)不支持一些必要的功能或用戶(hù)沒(méi)有做一些磁盤(pán)維護(hù)所致的。
在 Azure 上,如果我有一個(gè) 100 GB 的虛擬磁盤(pán)药薯,里面實(shí)際只保存了 20 GB 的數(shù)據(jù)绑洛,這個(gè)磁盤(pán)的實(shí)際大小會(huì)是 20 GB,也只會(huì)以 20 GB 計(jì)費(fèi)(除非這個(gè)磁盤(pán)由高級(jí)存儲(chǔ)帳戶(hù)提供支持)童本。然而當(dāng)我再加入 60 GB真屯,然后刪除 30 GB 后,這個(gè)磁盤(pán)的大小仍會(huì)是 80 GB 而不是 50 GB 穷娱。它的原理是這樣的:
虛擬磁盤(pán)在 Azure 上是作為頁(yè) Blob 來(lái)存儲(chǔ)的绑蔫。頁(yè) Blob 是一種稀疏的存儲(chǔ)方式,只有實(shí)際寫(xiě)入數(shù)據(jù)的容量會(huì)被計(jì)費(fèi)泵额。這就是為什么上面的例子中一開(kāi)始以 20 GB 計(jì)費(fèi)配深。在普通的文件系統(tǒng)中,當(dāng)一個(gè)文件被刪除后嫁盲,它只是被標(biāo)記為刪除篓叶,而實(shí)際的存儲(chǔ)介質(zhì)上的數(shù)據(jù)不會(huì)被清空。這也是為什么我們能通過(guò)一些反刪除軟件來(lái)恢復(fù)已經(jīng)刪除的文件亡资。在頁(yè) Blob 這樣的稀疏存儲(chǔ)系統(tǒng)中也是一樣的澜共,它的存儲(chǔ)結(jié)構(gòu)如下圖所示,包含了 Header, Footer 和 Data blocks锥腻。我們?cè)趯?duì)它執(zhí)行寫(xiě)操作時(shí)嗦董,文件系統(tǒng)會(huì)去尋找符合待寫(xiě)入文件大小的連續(xù)數(shù)據(jù)塊。假設(shè)一個(gè)文件數(shù)據(jù)被寫(xiě)入了 Data Block i ~ Data Block i+k瘦黑,當(dāng)該文件被刪除后京革,這些 Data Block 并不會(huì)被完全釋放,與普通文件系統(tǒng)類(lèi)似幸斥,它們只是被標(biāo)記為可寫(xiě)數(shù)據(jù)塊匹摇。這就導(dǎo)致在計(jì)算存儲(chǔ)使用量時(shí),這部分容量仍然被計(jì)算在內(nèi)甲葬。 Azure 虛擬機(jī)作為一個(gè) IaaS廊勃,沒(méi)有操作系統(tǒng)的配合無(wú)法從外部判斷哪些空間可以釋放。
為了改善這個(gè)問(wèn)題经窖,Azure 虛擬機(jī)支持了 TRIM 功能坡垫。這個(gè)功能原先用于來(lái)自于固態(tài)硬盤(pán)(SSD),用于釋放寫(xiě)入過(guò)的空間画侣。在 Azure 上冰悠,虛擬機(jī)操作系統(tǒng)通過(guò)這個(gè)命令來(lái)告知頁(yè) Blob 哪些空間可以釋放,從而減少計(jì)費(fèi)容量∨渎遥現(xiàn)在大部分 Azure 上由 Microsoft 提供的映像所使用的操作系統(tǒng)都支持 TRIM 功能溉卓,包括所有 Windows 的映像皮迟,和較新的 Linux 映像(如所有 UBUNTU,centos 7.2桑寨,和 SUSE Linux Enterprise Server 12)伏尼。對(duì) TRIM 功能支持的確切版本信息,請(qǐng)查詢(xún)具體 Linux 發(fā)行版本提供商的技術(shù)文檔尉尾。對(duì)于不支持的 TRIM 的 Linux 版本烦粒,可嘗試安裝Linux Integration Services Version 4.1 for Hyper-V驅(qū)動(dòng),增加對(duì) TRIM 的支持代赁。
在 Windows 系統(tǒng)中,這個(gè)功能是通過(guò)驅(qū)動(dòng)器優(yōu)化提供的兽掰,默認(rèn)每周會(huì)自動(dòng)執(zhí)行一次芭碍。當(dāng)然也可以在“控制面板->系統(tǒng)和安全->對(duì)你的驅(qū)動(dòng)器進(jìn)行碎片整理和優(yōu)化”中進(jìn)行手動(dòng)執(zhí)行或更改設(shè)置。另一個(gè)必要條件是啟用 UnMap孽尽,因?yàn)樵?Azure 虛擬機(jī)上是默認(rèn)不啟用的窖壕,需要通過(guò)以下命令啟用。
復(fù)制
fsutil behavior set DisableDeleteNotify 0
在支持 TRIM 功能的 Linux 系統(tǒng)中杉女,可以用fstrim命令來(lái)執(zhí)行瞻讽。例如對(duì)一個(gè)掛載在 /mnt/data 的 Azure 磁盤(pán)執(zhí)行TRIM操作可以用以下命令:
復(fù)制
sudo /sbin/fstrim /mnt/data
現(xiàn)在我們明白了虛擬磁盤(pán)計(jì)費(fèi)的原理,就可以理解導(dǎo)致“已釋放”空間被計(jì)費(fèi)問(wèn)題的原因熏挎。為了減少計(jì)費(fèi)容量速勇,首先要確定操作系統(tǒng)是否支持 TRIM 功能。尤其在 Linux 的情況下坎拐,各種不同的系統(tǒng)和版本的支持情況都略有不同烦磁,需要用戶(hù)自己根據(jù)實(shí)際配置去確認(rèn)和啟用。如果系統(tǒng)支持哼勇,還須在必要時(shí)去執(zhí)行它都伪。為了方便維護(hù),可以建一個(gè)計(jì)劃任務(wù)來(lái)定期執(zhí)行积担。 最后陨晶,筆者再介紹一個(gè)用于查詢(xún) Azure 上的虛擬磁盤(pán)實(shí)際可計(jì)費(fèi)大小的工具https://github.com/sandrinodimattia/WindowsAzure-VhdSize/releases/tag/v1.0。它由 Azure MVP帝璧,Sandrino Di Mattia 開(kāi)發(fā)先誉,默認(rèn)用于國(guó)際版 Azure,也可用于中國(guó)版聋溜。用法:wazvhdsize.exe <存儲(chǔ)賬戶(hù)名> <訪(fǎng)問(wèn)密鑰>
常見(jiàn)問(wèn)題
問(wèn):如果在虛擬機(jī)上掛載一個(gè) 100 GB 的數(shù)據(jù)盤(pán)谆膳,是只對(duì)使用的部分收費(fèi),還是整個(gè) 100 GB 收費(fèi)撮躁?
答:如果您的存儲(chǔ)賬號(hào)類(lèi)型是高級(jí)存儲(chǔ)漱病,那么我們會(huì)按照磁盤(pán)大新蛭怼(如 P10,P20, P30)收取每月固定費(fèi)用杨帽;如果您的存儲(chǔ)賬號(hào)是其他類(lèi)型(比如普通賬號(hào))漓穿,則按照您的實(shí)際使用量進(jìn)行收費(fèi)。
問(wèn): Azure 存儲(chǔ)是如何統(tǒng)計(jì)磁盤(pán)計(jì)費(fèi)容量的注盈?
答:請(qǐng)參考這篇文檔晃危,里面詳細(xì)闡述了存儲(chǔ)容量的計(jì)算算法。算法的 PowerShell 實(shí)現(xiàn)樣例可以在這里下載老客。
參考文獻(xiàn)
Release unused space from your Azure Virtual Hard Disks to reduce their billable size, Sandrino Di Mattia, 2013-12-19
TRIM Support comes to Azure Virtual Machines, MikeWo, 2013-10-14
Disk Storage on Linux VMs in Azure,https://convective.wordpress.com/, 2014-5-27
立即訪(fǎng)問(wèn)http://market.azure.cn