Winston: Alto uso de CPU al habilitar "prettyPrint"

Creado en 4 sept. 2018  ·  3Comentarios  ·  Fuente: winstonjs/winston

Háblenos de su entorno:

¿Cuál es el problema?

Al tener un registro intenso con múltiples estructuras JSON y la opción prettyPrint habilitada, winston la CPU al 90% +

Usando el siguiente transporte configurado para reproducir el problema:

new (winston.transports.Console)({
          level: 'silly',
          silent: false,
          colorize: true,
          prettyPrint: true,
          timestamp: true,
          humanReadableUnhandledException: true,
          format: format.combine(
            format.splat(),
            format.colorize(),
            format.label({ label: 'Foo' }),
            format.timestamp(),
            format.prettyPrint(),
            format.printf( log => {
              return '[ ' + log.timestamp + ' ][ ' + log.level + ' ][ ' + log.label + ' ] ' + log.message;
            })
          )
        })

Podría estar relacionado con https://github.com/winstonjs/winston/issues/613

¿Qué esperas que suceda en su lugar?

Sin picos de CPU con Winston y prettyPrint habilitado

Otra información

Al deshabilitar prettyPrint o al usar versiones en cadena de las estructuras JSON antes de iniciar sesión, los picos de CPU desaparecen por completo.

Configuración de transporte modificada para resolver los picos de la CPU:

new (winston.transports.Console)({
          level: 'silly',
          silent: false,
          colorize: true,
          prettyPrint: false, // Forced disabled pretty print
          timestamp: true,
          humanReadableUnhandledException: true,
          format: format.combine(
            format.splat(),
            format.colorize(),
            format.label({ label: 'Foo' }),
            format.timestamp(),
            //format.prettyPrint(), // Removed prettyPrint from format
            format.printf( log => {
              return '[ ' + log.timestamp + ' ][ ' + log.level + ' ][ ' + log.label + ' ] ' + log.message;
            })
          )
        })
docs

Comentario más útil

Dejaré esto abierto porque deberíamos agregar algunos documentos a winston o logform.

De los documentos de Node.js en util.inspect (https://nodejs.org/api/util.html#util_util_inspect_object_options):

Tenga en cuenta que util.inspect () es un método síncrono que está pensado principalmente como una herramienta de depuración. Algunos valores de entrada pueden tener una sobrecarga de rendimiento significativa que puede bloquear el bucle de eventos. Utilice esta función con cuidado y nunca en una ruta de código activo.

Entonces, Node recomienda no usar eso en el código de producción, por lo que probablemente deberíamos mencionar en algún lugar que los usuarios no deben usar prettyPrint en el código de producción. Dicho esto, apuesto a que si exponemos un parámetro de profundidad para prettyPrint, podría ayudar al rendimiento.

Gracias por mencionar este tema, ¡creo que es una nota importante!

Todos 3 comentarios

¿Qué tan profundos / complicados son sus objetos JSON? util.inspect, que es lo que usamos para impresiones bonitas, podría volverse muy lento para objetos lo suficientemente complicados (tal vez incluso un bucle infinito si hay estructuras cíclicas). ¿Necesita registrar todo su objeto o estaría contento con solo las primeras capas (parámetro de profundidad)?

En este momento, las estructuras JSON que estoy registrando son esencialmente una matriz de objetos; los objetos son clases instanciadas, su número es de 10 a 100 elementos y su complejidad nunca alcanza un nivel de profundidad de 3 (sin estructuras cíclicas).

Sin embargo, los registro muy a menudo: alcanzando la frecuencia máxima de un registro cada 200/500 ms.

El registro de estructuras complejas solo es útil en el entorno de desarrollo cuando se usa una verbosidad "tonta".
Dado que la verbosidad "tonta" debería ser lo suficientemente "tonta" (^^), simplemente lo resolví desactivando la impresión bonita y obteniendo todos los datos complejos sin ningún límite de profundidad, demora o uso intensivo de la CPU.

No sabía que "util.inspect" pudiera ser tan lento en comparación con JSON.stringify; probablemente, un parámetro de profundidad podría ser suficiente para eliminar el pico (podría probarlo en mi tiempo libre si necesita más datos para comprender mejor la situación)

Dejaré esto abierto porque deberíamos agregar algunos documentos a winston o logform.

De los documentos de Node.js en util.inspect (https://nodejs.org/api/util.html#util_util_inspect_object_options):

Tenga en cuenta que util.inspect () es un método síncrono que está pensado principalmente como una herramienta de depuración. Algunos valores de entrada pueden tener una sobrecarga de rendimiento significativa que puede bloquear el bucle de eventos. Utilice esta función con cuidado y nunca en una ruta de código activo.

Entonces, Node recomienda no usar eso en el código de producción, por lo que probablemente deberíamos mencionar en algún lugar que los usuarios no deben usar prettyPrint en el código de producción. Dicho esto, apuesto a que si exponemos un parámetro de profundidad para prettyPrint, podría ayudar al rendimiento.

Gracias por mencionar este tema, ¡creo que es una nota importante!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

pocesar picture pocesar  ·  3Comentarios

Buzut picture Buzut  ·  3Comentarios

tagyoureit picture tagyoureit  ·  4Comentarios

ghost picture ghost  ·  4Comentarios

mohanen picture mohanen  ·  4Comentarios