次の方法で共有


AssemblyBinder ロール インスタンスが System.IO.IOException 例外をスローしています

この記事では、 AssemblyBinder Compressor アプリケーションのロール インスタンスがビジー状態と再起動状態の間でスタックし、System.IO.IOException 例外がスローされる問題のトラブルシューティングに関する情報を提供します。ディスクに十分な領域がありません。

元の製品バージョン: API Management サービス
元の KB 番号: 4464907

Note

ラボの 2 番目のシナリオ Azure Cloud Service トラブルシューティング シリーズに関する記事を参照してください。 thisに従って、Compressor アプリケーションのラボセットアップ手順に従って問題を再現していることを確認します。

現象

Compressor アプリケーションの AssemblyBinder ロール インスタンスが、Azure portal ブレードで以下のハンドルされない例外をスローし、ビジー状態と再起動状態の間にスタックしています。

Unhandled Exception: There is not enough space on the disk. at System.IO.__Error.WinIOError  (Int32 errorCode, String maybeFullPath) at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) at Ionic.Zip.ZipEntry.ExtractAndCrc(Stream archiveStream, Stream targetOutput, Int16 compressionMethod, Int64 compressedFileDataSize, Int64 uncompressedSize) at Ionic.Zip.ZipEntry.ExtractToStream(Stream archiveStream, Stream output, EncryptionAlgorithm encryptionAlgorithm, Int32 expectedCrc32) at Ionic.Zip.ZipEntry.InternalExtractToBaseDir(String baseDir, String password, ZipContainer zipContainer, ZipEntrySource zipEntrySource, String fileName) at Ionic.Zip.ZipFile._InternalExtractAll(String path, Boolean overrideExtractExistingProperty) at AssemblyBinder.WorkerRole.OnStart() in D:\compressor\AssemblyBinder\WorkerRole.cs:line 56 at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum) at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge. <InitializeRole> b__0() at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()'[2018-08-12T14:47:25Z] Last exit time: [2018/08/12, 14:47:25.965].

トラブルシューティングの手順

エラー呼び出し履歴から、この WorkerRole が OnStart() メソッドで解凍または抽出操作を実行しているように見えますが、ストレージが不足しているため失敗しています。 あなたの心に来る次の明白な質問は、正確に WaWorkerHost.exe プロセスがファイルを抽出している場所です。

答えを見つけるには、 Process Monitor ツールを使用して ProcMon トレースを取得し、何が見つかるかを確認します。

プロセス モニターの ProcMon トレースのスクリーンショット。

WaWorkerHost.exe プロセスでは、既定の一時ディレクトリにファイルを書き込みます。最大サイズは 100 MB で、ある時点でいっぱいになる可能性があります。 RoleTemp ディレクトリに移動すると、そのディレクトリのディスク領域クォータが実際に使い果たされていることがわかります。

RoleTemp ディレクトリのスクリーンショット。

問題の原因が判明した可能性がありますが、 RoleTemp の場所で領域が不足している場合はどうすればよいですか? ここに 答えがあります。

そのため、ローカル ストレージ リソースを構成し、TEMP ディレクトリと TMP ディレクトリを次のようにローカル ストレージ リソースのパスにポイントする必要があります。

ローカル リソース宣言は、AssemblyBinder ロールのサービス定義ファイルに追加されている必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<LocalResources>
   <LocalStorage name="FileStorage" cleanOnRoleRecycle="true" sizeInMB="200" />
</LocalResources>

この変更は RoleEntryPoint.OnStart メソッド内で実行する必要があります。

localResource = RoleEnvironment.GetLocalResource("FileStorage");
Environment.SetEnvironmentVariable("TMP", localResource.RootPath);
Environment.SetEnvironmentVariable("TEMP", localResource.RootPath);

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。