Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Azure Driveの仕様変更

2011.4.15追記 情報元に追記が追加されていました。意訳すると、結局この例外が出る現象は、1.8/2.0固有であって、それ以降は使用可能領域に収まるように小さめにキャッシュを作ってくれるらしい(未検証)。キャッシュ方式自体は変わっていないと思われ。

2/23/2011 - Update for OS 1.9, 2.1 and beyond
Beginning with OS versions 1.9 and 2.1, if there is insufficient space on the local storage resource to accommodate the Azure Drive Cache specified in the mount call, Windows Azure will create a smaller cache to fit in the available space. That means you will no longer see cache allocation failures due to insufficient space as was the case with OS versions 1.8 and 2.0.

    • ここまで


こんばんは、statemachineです。Azure Driveを使っている人は少ないとは思いますが、Driveキャッシュについて大きな変更がアナウンスされています。詳細は以下のURL。
Breaking Change for Windows Azure Drive Beta in Guest OS 1.8 and 2.0 - Windows Azure Storage Team Blog - Site Home - MSDN Blogs
ところで、Azure Driveっていまだβ扱いでしたっけ?

背景

Azure Driveにはキャッシュ機能がそなわっており、ローカルストレージの一部をキャッシュとして割り当てることによって、PageBlobへのアクセスを減らし、パフォーマンスを向上させる機能があります。

以下がキャッシュの宣言と、ドライブキャッシュを初期化するコード例である。1000MBのローカルストレージを確保し、それを同容量キャッシュとして割り当てている。現在のDriveのサンプルコードは大抵このようになっていたように思う。

キャッシュの宣言

<LocalResources> 
    <LocalStorage name="DriveCache" cleanOnRoleRecycle="true" sizeInMB="1000" /> 
</LocalResources>

ソースコード

    LocalResource localCache = RoleEnvironment.GetLocalResource("DriveCache"); 
    CloudDrive.InitializeCache(localCache.RootPath,
                                        localCache.MaximumSizeInMegabytes);
    driveLetter = drive.Mount(driveCacheSize, DriveMountOptions.None);

ゲストOS1.8/2.0 では、このような実装方法だと、マウント時に例外(D000007F)を発生させるらしい。いままでキャッシュの割り当ては、遅延(lazily)割り当てしていたが、これからはマウント時に初期化を行うため、容量が不足すると例外を発生させると。

回避方法

回避方法は、ローカルストレージの割り当てるキャッシュ容量を、+20MB程度しておくか、1.7以前を使えということらしい。

<LocalResources> 
    <LocalStorage name="DriveCache" cleanOnRoleRecycle="true" sizeInMB="1020" /> 
</LocalResources>
    LocalResource localCache = RoleEnvironment.GetLocalResource("DriveCache"); 
    CloudDrive.InitializeCache(localCache.RootPath,
                                         localCache.MaximumSizeInMegabytes); 
    driveLetter = drive.Mount(1000, DriveMountOptions.None);

まとめ

  • 以前もキャッシュ容量が不足すると例外が出るのか? でないのか?
  • どの程度バッファを持っておけばよいのかは、キャッシュ容量に依存すると思われるが、詳細な値は出ていない。
  • 上のソース例は、1000MBがハードコーディングされているので、実コードとしては不適。
  • Driveはドライバレベルでの実装だろうから、OSをバージョンアップすることによって、解決するが、StorageなどのDLLにバグがあったら、再パッケージ必須か。
  • 1.7以前を使うってのはあまり選択肢にならない気がする。
  • 多分、パフォーマンスにも影響するのだろうけど、誰か測定してくれないかな。

ちゃんと検証していないので、取り急ぎ。