Errores de memoria insuficiente con plugin personalizado

¿Podría alguien proporcionar instrucciones para configurar la asignación de memoria?

Dadas las esporádicas mensajes del kernel de “memoria insuficiente”/volcado, el aumento del 3x en el intercambio (swapping) y la degradación progresiva de la respuesta de la aplicación, parece que nuestra aplicación a veces se queda sin memoria. Nuestro sistema tiene actualmente 8 GB de memoria y 2 GB de intercambio. Detalles a continuación.

He revisado las instrucciones para agregar más memoria física e intercambio en ("Cannot allocate memory" when upgrading), pero no he podido encontrar detalles sobre cómo asignarla.

En cuanto a las configuraciones de memoria, estamos utilizando todos los valores predeterminados. El sistema se recupera después de unos minutos, pero con un mayor uso, creemos que es momento de informarnos sobre cómo mejorar el rendimiento. Sin embargo, no estoy seguro de dónde y cómo configurar esto. ¿Aumentar la memoria asignada para la instancia de Docker o para la cantidad de Unicorn de Ruby (o ambas)?

Soy administrador de sistemas sin experiencia en Ruby y con experiencia limitada en Docker, por lo que indicarme la dirección del archivo de configuración y la sintaxis a utilizar sería de gran ayuda.

Discourse 2.6.0 beta2
Ruby 2.3.1-2~ubuntu16.04.14
Ubuntu 16.04

¿Cuántos unicornios estás ejecutando? Está configurado en tu archivo /var/discourse/containers/app.yml.

Hola Rafael: En la sección “env” de app.yml, veo que estamos configurados para usar 4.

1 me gusta

¿Volviste a ejecutar discourse-setup después de aumentar tu RAM? Ajustará la configuración de memoria en consecuencia. También puedes leer los comentarios en app.yml y modificarlos.

1 me gusta

Recibir un error de OOM con solo 4 unicornios es realmente extraño. Esto debería usar alrededor de 2 GB, dejando 6 GB para PG y Redis.

Necesitas investigar qué proceso está consumiendo toda la memoria durante un evento de OOM; esto no es normal.

3 Me gusta

Hola Rafael y equipo, mi nombre es Serge y trabajo con el Sr. Happy Lee, quien acaba de partir a unas tan esperadas vacaciones, así que yo me encargaré de este problema.

Para complementar la descripción: El servidor se construyó originalmente con 8 GB de RAM y 2 GB de espacio de intercambio. No lo hemos actualizado desde entonces.

En el registro del sistema puedo ver evidencia de que Ruby es el proceso que consume toda la memoria y está causando la falta de memoria del kernel (OoM):

Proceso 2960 (ruby) terminado, total-vm:10031472kB, anon-rss:7438148kB, file-rss:0kB

No soy experto en Ruby, por lo que no estoy seguro de cómo identificar qué proceso dentro de Ruby está consumiendo tanta memoria.

Agradecería cualquier sugerencia.

Gracias.

-Serge

¿Estás ejecutando algún plugin en esta instalación de Discourse?

Ejecutamos el plugin personalizado Scheduled Digest, pero también se ejecuta en nuestras otras dos instalaciones y esas no tienen problemas.

¿Podrías enlazar aquí el repositorio del código fuente de ese complemento?

1 me gusta

Hola Rafael,

el plugin fue financiado para su desarrollo por nuestra organización, por lo que, lamentablemente, no tengo permiso para exponer el código fuente aquí. Además, dado que el plugin funciona sin problemas en otras instancias, esto me hace pensar en aumentar los recursos de memoria del servidor para esta en particular. La máquina es una VM, así que puedo duplicar fácilmente la cantidad de memoria y ver si esto lo soluciona.

¡Vale, mucha suerte!

No podemos hacer mucho para depurar código que no podemos ver desde nuestro lado. Podrías configurar el plugin exportador de Prometheus para Discourse para seguir las métricas de tu instancia.

1 me gusta

¿Las otras instancias también están ejecutando Ruby 2.3.1-2~ubuntu16.04.14?

Quizás no sea relevante, pero:

así que esto fue claramente un error de Ruby. Probamos en varias versiones de Ruby y determinamos que solo las versiones 2.3.x y 2.4.x presentaban la fuga (aparentemente esto se corrigió en Ruby 2.5.0****).

Y el README de Discourse solicita [Ruby 2.6+] :roll_eyes:

1 me gusta

¡Gracias! Publicaré una actualización cuando las cosas se calmen.

Hola Benjamin, las otras instancias también están ejecutando Ruby 2.3.1-2~ubuntu16.04.14. Voy a probar una actualización para ver si no rompe nuestra configuración de Docker.

La versión de Ruby no es relevante aquí

Mientras utilices nuestra imagen oficial de Docker, usarás la versión compatible correcta de Discourse.

2 Me gusta

Este tema se cerró automáticamente después de 26 horas. Ya no se permiten nuevas respuestas.