Compartir a través de


La instancia de rol AssemblyBinder inicia la excepción System.IO.IOException.

En este artículo se proporciona información sobre los problemas de solución de problemas en los que la instancia de rol AssemblyBinder de la aplicación Compresor está bloqueada entre el estado Ocupado y el reinicio y la excepción System.IO.IOException que indica: No hay suficiente espacio en el disco.

Versión original del producto: servicio API Management
Número de KB original: 4464907

Nota:

Consulte el artículo sobre la serie de solución de problemas del servicio en la nube de Azure, este es el segundo escenario del laboratorio. Asegúrese de que ha seguido las instrucciones de configuración del laboratorio para la aplicación Compresor según esto, para volver a crear el problema.

Síntomas

La instancia de rol AssemblyBinder de la aplicación Compressor inicia la siguiente excepción no controlada en la hoja de Azure Portal y se bloquea entre estado Ocupado y Reinicio.

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].

Pasos de solución de problemas

En la pila de llamadas de error, parece que workerRole está realizando alguna operación de descomprimir o extraer en el método OnStart(), pero no se puede realizar debido a un almacenamiento insuficiente. La siguiente pregunta obvia que vendrá a su mente es donde exactamente WaWorkerHost.exe proceso está extrayendo el archivo.

Para averiguar la respuesta, use la herramienta Monitor de procesos para tomar un seguimiento de ProcMon y ver lo que puede encontrar.

Captura de pantalla del seguimiento de ProcMon en el Monitor de procesos.

WaWorkerHost.exe proceso está escribiendo algún archivo en su directorio temporal predeterminado, que tiene un tamaño máximo de 100 MB, que puede llegar a estar lleno en algún momento. Al navegar al directorio RoleTemp , es posible que se agote la cuota de espacio en disco para ese directorio.

Captura de pantalla del directorio RoleTemp.

Es posible que haya descubierto la causa del problema, pero ¿qué debe hacer al quedarse sin espacio en la ubicación roleTemp ? Esta es la respuesta.

Por lo tanto, debe configurar un recurso de almacenamiento local y apuntar los directorios TEMP y TMP a la ruta de acceso del recurso de almacenamiento local, como se indica a continuación:

La declaración de recursos local debe haberse agregado al archivo de definición de servicio para el rol AssemblyBinder.

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

Esta modificación debe realizarse dentro del método RoleEntryPoint.OnStart .

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

Ponte en contacto con nosotros para obtener ayuda

Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.