仮想マシンなどで利用される仮想ディスク(VHD)はPage BLOB(ページブロブ)が利用されています。Page BLOBは100GBで確保しても、10GB分しか利用していなければ、その分しか課金されません。という前置きはおいておいて、あるPage BLOBがどの程度使用しているか計算したかったので、ざっくりAzure PowerShellで書きました。
細かい計算式は、以下にあります。
以下、簡単なサンプルです。Get-AzureStorageBlob で、BLOBオブジェクトを取得して、GetPageBlobSize に渡します。サイズは以下を合計するとでるみたいです。
- 124 + ブロブ名の長さ × 2
- メタデータのキーと値 + 3
- GetPageRangesで使用ページを取得して End - Start オフセット + 12
という計算を、以下で行っています。
function Get-PageBlobSize { param( [Parameter(Mandatory=$True)][Microsoft.WindowsAzure.Commands.Storage.Model.ResourceModel.AzureStorageBlob]$PageBlob ) if($PageBlob.BlobType -ne "PageBlob") { Write-Verbose "Not page blob" return } Write-Verbose "Calculating $($blob.Name) size" [long]$size = [long]0 $size += 124 + $PageBlob.Name.Length * 2 foreach($metadata in $PageBlob.ICloudBlob.Metadata) { $size += $metadata.Key.Length + $metadata.Value.Length + 3 } foreach($page in $PageBlob.ICloudBlob.GetPageRanges()) { $size += 12 + $page.EndOffset - $page.StartOffset } Write-Host $PageBlob.ICloudBlob.Uri Write-Host ("Size : {0:N2} GB ({1:N0} bytes)" -f ($PageBlob.Length / 1GB),$PageBlob.Length) Write-Host ("Actual Size : {0:N2} GB ({1:N0} bytes)" -f ($size / 1GB),$size) } $name = "somestorage" $container = "vhds" $blobName = "someosdisk.vhd" $account = Get-AzureStorageAccount -StorageAccountName $name $context = New-AzureStorageContext -StorageAccountName $name -StorageAccountKey (Get-AzureStorageKey -StorageAccountName $name).Primary $PageBlob = Get-AzureStorageBlob -Context $context -Container $container-Blob $blobName Get-PageBlobSize -PageBlob $blob
実際に実行した例は以下の通り。
https://xxxxx.blob.core.windows.net/vhds/yyyyyyy.vhd Size : 200.00 GB (214,748,365,312 bytes) Actual Size : 30.98 GB (33,261,437,333 bytes)
あとは適当にストレージからBLOB一覧とりだして、全Page BLOBチェックするとか、適当にラッパーを書いてお好みにしてください。
参考
以下、他に参考にしたURLです。NETでのソースとかもおいてありますです。
Calculating how much storage space a Windows Azure Virtual Hard Disk is really using