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 反馈社区