AzureエフェメラルOSディスクを試す

目次

English page is HERE

2019/7/1にAzure Ephemeral OS DiskがGAしたので試しました。

https://azure.microsoft.com/ja-jp/updates/azure-ephemeral-os-disk-now-generally-available/

IaaS仮想マシンのOSディスクにManaged DiskやStorage Accountのvhdファイルを使わずに、仮想マシンがホストされるサーバ内のキャッシュ領域にOSディスクをマウントして使う技術です。

OSディスクは永続化されませんが、追加データディスクとしてManaged Diskが利用できます。

使い方

Azureポータル、Azure CLI、Azure Powershellで利用が可能です。今回はAzure CLIで使ってみました。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/ephemeral-os-disks

といっても、az vm createの引数に「–ephemeral-os-disk true –os-disk-caching ReadOnly」を追加指定するだけなんですけどね。

作成された仮想マシンはManaged Diskを持たないので、常時起動していてもストレージ代が節約できますね。

img

エフェメラルOSディスク利用中は仮想マシンの停止は出来ないので(削除しかない)、そこは注意です。

他に、Azure Marketplaceから取得するイメージサイズが大きいと、仮想マシンのサイズによってはデプロイが出来ないので注意です。

例えば、Standard_DS1_v2の場合は、キャッシュサイズは43GBとなるので一般的なLinuxイメージについてはデプロイ出来ますが、Windows Serverの場合は通常127GBのイメージとなるため、Small Diskのイメージ(30GB)を選択する必要があります。

Standard_DS3_v2はキャッシュサイズが172GBあるので普通のWindows Serverイメージでもデプロイできます。

このキャッシュサイズの詳細は「Azure の Windows 仮想マシンのサイズ」の各仮想マシンの一覧で確認することができます。

デプロイ時間を測る

OSディスクに対するI/Oが高速になるため、アプリケーションのロード時間や一時的なファイルの書き込み時間が高速になるほか、OSの起動時間も早くなるだろうと思ったので計測しました。

あくまでも私が適当なタイミングで少ない回数で計測した結果なので、参考程度で見て下さい。

事前にVirtual Network,、Public IP、NICは作成した状態で「az vm create」の実行時間を測ります。

Linuxのイメージは「UbuntuLTS」、Windowsのイメージは「MicrosoftWindowsServer:WindowsServer:2019-Datacenter-smalldisk:2019.0.20190603」を使いました。

Linux

エフェメラルOSディスクも、Managed Diskもデプロイ時間は変わりませんね。

OS起動シーケンスでディスクI/Oの差が出るのかと思いますが、Linuxの場合はそもそもOS起動が早いので性能差が出ないということでしょうか。

Windows

Windowsの場合OS起動シーケンスでたくさんOSディスクに対する読み込みが発生するからでしょうか。
平均して30秒程、エフェメラルOSディスクの方がデプロイ時間が早かったです。

考察

LinuxでもWindowsでも必要なアプリケーションやサービスをインストールした状態のカスタムイメージを作成して、必要なサービスが利用可能になるまでの時間短縮では、エフェメラルOSディスクは有効ですね。

まあ、公式ドキュメントにもそう書いてあるんですけど。

Virtual Machine Scale Setを利用する場合は、カスタムイメージが必須なのでその場合には迷わずエフェメラルOSディスクを選択することでスケールアウトの時間短縮に繋がりますね。

私は以下のようなスクリプトを書いて、必要な時だけ安くLinuxの踏み台サーバを利用する用途で最近使っています。ご参考までに。

#!/bin/bash

# common
rgname=bastion-server-rg
location=japaneast

# vnet
vnet_name=bastion-vnet
vnet_cidr=192.168.0.0/24
vnet_subnet_name=default
vnet_subnet_cidr=192.168.0.0/24

# nsg
nsg_name=default-nsg

# vm
linuximage=UbuntuLTS
vmid=azureuser
vmpassword=*****(任意のパスワード)
vmname=bastionvm
dnsname=xxxxxbastion
vmsize=Standard_DS1_v2

#
# create resource group
#
az group create --name $rgname --location $location

#
# create vnet
#
az network vnet create \
    --name $vnet_name \
    --resource-group $rgname \
    --location $location \
    --address-prefixes $vnet_cidr \
    --subnet-name $vnet_subnet_name \
    --subnet-prefixes $vnet_subnet_cidr

#
# create network
#
az network nsg create --name $nsg_name --resource-group $rgname --location $location
az network nsg rule create \
    --nsg-name $nsg_name \
    --resource-group $rgname \
    --name allow-ssh \
    --access allow \
    --protocol Tcp \
    --direction Inbound \
    --priority 1000 \
    --source-address-prefix Internet \
    --source-port-range "*" \
    --destination-address-prefix "*" \
    --destination-port-range 22

az network vnet subnet update \
    --resource-group $rgname \
    --vnet-name $vnet_name \
    --name $vnet_subnet_name \
    --network-security-group $nsg_name

az network public-ip create \
    --name ${vmname}-pip \
    --resource-group $rgname \
    --location $location \
    --allocation-method dynamic \
    --dns-name $dnsname

#
# create vm
#
az network nic create \
    --name ${vmname}-nic \
    --resource-group $rgname \
    --vnet-name $vnet_name \
    --subnet $vnet_subnet_name \
    --public-ip-address ${vmname}-pip

az vm create \
    --name $vmname \
    --resource-group $rgname \
    --location $location \
    --image $linuximage \
    --size $vmsize \
    --nics ${vmname}-nic \
    --admin-username $vmid \
    --admin-password $vmpassword \
    --ephemeral-os-disk true \
    --os-disk-caching ReadOnly