WebJob solo tiene acceso a 2 GiB de memoria cuando App Service Plan tiene 7 GiB

4 minutos de lectura

Avatar de usuario de Jackson
jackson

Tengo un plan de Azure App Service como el siguiente, que se supone que tiene 7 GB de memoria.

P2V2
420 total ACU
7 GB memory
Dv2-Series compute equivalent
83.22 USD/Month (Estimated)

Estoy usando esto para alojar una sola aplicación con un solo WebJob continuo. Claro que existe el sitio web para la aplicación en sí, pero no la uso en absoluto.

Además, solo hay 1 instancia de la aplicación en mi plan de servicio, por lo que no se debe a que varias instancias compartan la memoria total disponible de 7 GiB.

El plan de servicio tiene 2 ranuras de implementación, 1 para producción y 1 para ensayo. Ambas aplicaciones (en producción y puesta en escena) están desactivadas porque WebJob puede seguir ejecutándose mientras la propia aplicación está desactivada.

Esto es lo que veo que es desconcertante. En la página de descripción general del Plan de servicio de aplicaciones, dice que estoy usando alrededor del 45 % de la memoria total disponible.
ingrese la descripción de la imagen aquí

Pero a veces me encontré con OutOfMemoryException, así que comencé a verificar cuánta memoria está usando realmente mi WebJob.

Resulta que está usando 1,6 GiB de la memoria física disponible de 2 GiB, no los 7 GiB que esperaba.

La forma en que obtengo la memoria actual es a través del siguiente código

var currentMemory = Process.GetCurrentProcess().PrivateMemorySize64;
var totalMemory = GC.GetGCMemoryInfo().TotalAvailableMemoryBytes;

De acuerdo con la documentación aquí https://learn.microsoft.com/en-us/dotnet/api/system.gcmemoryinfo.totaldisponiblememorybytes?view=net-6.0#System_GCMemoryInfo_TotalAvailableMemoryBytes

El valor de esta propiedad será el valor de la variable de entorno COMPlus_GCHeapHardLimit o el valor de Server.GC.HeapHardLimit en runtimeconfig.json, si alguno está establecido.

Si el programa se ejecuta en un contenedor, este valor es una fracción definida por la implementación del tamaño del contenedor.

De lo contrario, el valor de la propiedad es la memoria física en la máquina que estaba disponible para que la use el recolector de elementos no utilizados cuando se produjo la última recolección de elementos no utilizados.

Como no tengo la variable de entorno, runtimeconfig.json se configuró y no es un contenedor, creo GC.GetGCMemoryInfo().TotalAvailableMemoryBytes está devolviendo correctamente la memoria física total disponible para mi WebJob en la máquina virtual, que es de 2 GiB.

También encontré este artículo gracias al comentario de Vova a continuación. https://learn.microsoft.com/en-us/azure/app-service/faq-availability-performance-application-issues#i-see-the-message–worker-process-requested-recycle-due-to –porcentaje-de-memoria–límite—cómo-abordo-este-problema-

Tiene sentido; al mismo tiempo, me parece que el artículo es específico del servicio de aplicaciones en sí. WebJob se ejecuta como un proceso separado del sitio web. Aunque el síntoma es el mismo. Parece que mi WebJob es JIT a 32 bits en lugar de 64 bits.

Mi configuración de compilación de WebJob

.NET 6 Console Application
Platform: Any CPU

De todos modos, mi configuración de App Service está configurada en x64 como se muestra a continuación.
ingrese la descripción de la imagen aquí

Estoy tratando de entender lo que estoy haciendo mal porque asumo que Azure está haciendo lo correcto aquí.

Uso Azure App Service para ejecutar un trabajo web, por lo que mi objetivo es maximizar la memoria disponible para el trabajo web con el SKU más pequeño o más barato disponible.

  • Construiste x86 o x64?

    – Vova Biliachat

    6 de enero de 2022 a las 1:26

  • El objetivo de la plataforma de compilación es Cualquier CPU. La opción de configuración de App Service para el tipo de plataforma es x64

    – Jackson

    6 de enero de 2022 a las 7:18

  • No edite anuncios de soluciones en la pregunta. Acepte (es decir, haga clic en la “marca” al lado) una de las respuestas existentes, si las hay. También puede crear su propia respuesta e incluso aceptarla, si su solución aún no está cubierta por una respuesta existente. Comparar stackoverflow.com/help/auto-respuesta

    – Yunnosch

    6 de enero de 2022 a las 22:52

  • Kudu inicia un webjob ejecutando D:\home\site\wwwroot\app_data\jobs\triggered\WEBJOBNAME\run.cmd que normalmente contiene dotnet WEBJOBNAME.dll %* Sin embargo, el entorno de Kudu (variable Path) prefiere los 32 bits versión de dotnet. Para obtener la versión de 64 bits de dotnet, use: “D:/Program Files/dotnet/dotnet.exe” WEBJOBNAME.dll %*

    – Dave

    9 de enero a las 9:13


¿Ha sido útil esta solución?