AssemblyBinder 角色实例引发 System.IO.IOException 异常

本文提供有关排查压缩器应用程序的 AssemblyBinder 角色实例在“忙碌”和“正在重启”状态之间停滞以及引发 System.IO.IOException 异常(指出磁盘上没有足够的空间)的问题的信息。

原始产品版本:API 管理服务
原始 KB 编号: 4464907

注意

请参阅 Azure 云服务故障排除系列文章,这是实验室的第二个方案。 请确保已按照针对压缩器应用程序的实验室设置说明重新创建问题。

症状

压缩器应用程序的 AssemblyBinder 角色实例在“Azure 门户”边栏选项卡中引发以下未经处理的异常,并停滞在“忙碌”和“正在重启”状态之间。

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 进程提取文件的具体位置。

若要找出答案,请使用 进程监视器 工具获取 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 反馈社区提交产品反馈。