Después de actualizar Discourse a la versión v2.5.0.beta4-399-gbf8085e436 (desde una versión 2.4.x, usando el arranque por línea de comandos de discourse_docker desde git, justo antes de los commits de actualización a Postgres 12), hay notablemente más actividad de CPU en el servidor (incluso si nadie está conectado).
“top” indica que varios procesos “ruby” están activos con bastante frecuencia. He entendido que se trata de los workers de unicorn y sidekiq. Al ejecutar redis-cli monitor, veo que realizan solicitudes BRPOP bloqueantes con un tiempo de espera de 2 segundos para comprobar si hay trabajo que hacer. Esto equivale a una docena de comandos de Redis por segundo. Además, se actualizan estadísticas cada 5 segundos. Al ejecutar redis-cli info stats, se indica que se procesan en promedio entre 15 y 20 comandos por segundo.
No sé si esta actividad puede llegar a generar el 2-4% de utilización de CPU que observamos. Con la versión anterior, era inferior al 0,5%. En aquel momento no revisé las mismas estadísticas de redis-cli.
Me gustaría probar con un tiempo de espera más largo para ver si eso ayuda, pero aún no he logrado averiguar cómo hacerlo.
Buena pista. No vi nada alarmante allí, no había trabajos ejecutándose y ninguno con una ejecución prolongada (solo unos pocos por encima de 100 ms). El panel indica aproximadamente 1000 procesados por día, igual que antes de la actualización.
Probablemente fuera de tema, pero también es interesante el gráfico de procesados en 6 meses; parece que hay dos mesetas (una el doble de alta que la otra) entre las que alterna con semanas de diferencia. No parece correlacionarse con reinicios (y tampoco actualizamos esto en ese período).
¿Hay alguna forma sencilla de cambiar ese tiempo de espera de 2 s para BRPOP? No lo encontré en el código. Al menos indicaría si los bucles de sondeo de trabajo son el problema.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1024 discour+ 20 0 333584 202888 21660 S 1.3 2.5 3:35.81 ruby
1156 discour+ 20 0 715904 249416 24532 S 1.3 3.1 3:26.50 ruby
1178 discour+ 20 0 726664 251468 24564 S 1.3 3.1 3:26.11 ruby
1189 discour+ 20 0 714368 247912 24444 S 1.3 3.1 3:24.56 ruby
1200 discour+ 20 0 709760 249708 24632 S 1.3 3.1 3:22.96 ruby
1234 discour+ 20 0 713344 250288 24636 S 1.3 3.1 3:30.24 ruby
1167 discour+ 20 0 712832 247928 24436 S 1.0 3.1 3:24.75 ruby
188658 me 20 0 10424 4240 3576 R 0.7 0.1 0:00.36 top
448 root 20 0 1748444 84900 45884 S 0.3 1.1 6:09.98 dockerd
sin que nadie esté conectado…
Los 3.5 minutos de tiempo de CPU acumulados para cada uno se registran tras 35 horas de funcionamiento, con muy poca actividad del usuario.
También intenté usar rbtrace, pero me muestra el siguiente error: (pid is not listening for messages, did you require “rbtrace”)
¿Necesito reconstruir la imagen para solucionarlo? ¿O puedo simplemente ajustar o reconstruir algo dentro del contenedor?