Azure Linux VMのディスク利用料節約Tips
定義領域全てが課金されるわけではありません
AzureのIaaSでは、VMに接続するディスクとしてAzure StorageのPage Blobを使います。Page Blobは作成時に容量を定義しますが、課金対象となるのは、実際に書き込んだ領域分のみです。たとえば10GBytesのVHD Page Blobを作ったとしても、1GBytesしか書き込んでいなければ、課金対象は1GBytesです。
なお、Premium Storageは例外です。FAQを確認してみましょう。
仮想マシンに空の 100 GB ディスクを接続した場合、100 GB 全体に対する料金が請求されますか? それとも使用したストレージ領域の分だけが請求されますか?
空の 100 GB ディスクが Premium Storage アカウントによって保持されている場合、P10 (128 GB) ディスクの料金が課金されます。その他の種類の Storage アカウントが使用されている場合、割り当てられたディスク サイズに関わらず、ディスクに書き込まれたデータを保存するために使用しているストレージ領域分のみ請求されます。
詳細な定義は、以下で。
Understanding Windows Azure Storage Billing – Bandwidth, Transactions, and Capacity
書き込み方はOSやファイルシステム次第
じゃあ、OSなりファイルシステムが、実際にどのタイミングでディスクに書き込むのか、気になりますね。実データの他に管理情報、メタデータがあるので、特徴があるはずです。Linuxで検証してみましょう。
- RHEL 7.2 on Azure
- XFS & Ext4
- 10GBytesのPage Blobの上にファイルシステムを作成
- mkfsはデフォルト
- mountはデフォルトとdiscardオプションありの2パターン
- MD、LVM構成にしない
- 以下のタイミングで課金対象容量を確認
- Page BlobのVMアタッチ時
- ファイルシステム作成時
- マウント時
- 約5GBytesのデータ書き込み時 (ddで/dev/zeroをbs=1M、count=5000で書き込み)
- 5GBytesのファイル削除時
課金対象容量は、以下のPowerShellで取得します。リファレンスはここ。
$Blob = Get-AzureStorageBlob yourDataDisk.vhd -Container vhds -Context $Ctx
$blobSizeInBytes = 124 + $Blob.Name.Length * 2
$metadataEnumerator = $Blob.ICloudBlob.Metadata.GetEnumerator()
while ($metadataEnumerator.MoveNext())
{
$blobSizeInBytes += 3 + $metadataEnumerator.Current.Key.Length + $metadataEnumerator.Current.Value.Length
}
$Blob.ICloudBlob.GetPageRanges() |
ForEach-Object { $blobSizeInBytes += 12 + $_.EndOffset - $_.StartOffset }
return $blobSizeInBytes
ストレージコンテキストの作り方はここを参考にしてください。
結果
XFS
確認タイミング | 課金対象容量(Bytes) |
---|---|
Page BlobのVMアタッチ時 | 960 |
ファイルシステム作成時 | 10,791,949 |
マウント時 | 10,791,949 |
5GBytesのデータ書き込み時 | 5,253,590,051 |
5Gbytesのファイル削除時 | 5,253,590,051 |
5Gbytesのファイル削除時 (discard) | 10,710,029 |
Ext4
確認タイミング | 課金対象容量(Bytes) |
---|---|
Page BlobのVMアタッチ時 | 960 |
ファイルシステム作成時 | 138,683,592 |
マウント時 | 306,451,689 |
5GBytesのデータ書き込み時 | 5,549,470,887 |
5Gbytesのファイル削除時 | 5,549,470,887 |
5Gbytesのファイル削除時 (discard) | 306,586,780 |
この結果から、以下のことがわかります。
- 10GBytesのBlobを作成しても、全てが課金対象ではない
- 当然だが、ファイルシステムによってメタデータの書き方が違う、よって書き込み容量も異なる
- discardオプションなしでマウントすると、ファイルを消しても課金対象容量は減らない
- OSがPage Blobに"消した"と伝えないから
- discardオプションにてSCSI UNMAPがPage Blobに伝えられ、領域は解放される(課金対象容量も減る)
- discardオプションはリアルタイムであるため便利。でも性能影響があるため、実運用ではバッチ適用(fstrim)がおすすめ
知っているとコスト削減に役立つTipsでした。ぜひ運用前には、利用予定のファイルシステムやオプションで、事前に検証してみてください。