NodeJS: Cómo depurar " fuga de memoria EventEmitter detectada. 11 oyentes añadidos"


¿Cómo puedo depurar mi aplicación que arroja este error:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at Socket.EventEmitter.addListener (events.js:160:15)
    at Socket.Readable.on (_stream_readable.js:653:33)
    at Socket.EventEmitter.once (events.js:179:8)
    at TCP.onread (net.js:527:26)

No pude encontrar el objeto de filtración asumido para aumentar el límite del oyente por .setMaxListeners(0);

SOLUTION (from fardjad and jan salawa)

Con las búsquedas de jan salawa encontré una biblioteca funcional ( longjohn) para aumentar los trazos de pila detallados. Con la respuesta de fardjad he encontrado que tenemos que prototipar EventEmitter.addListener Y EventEmitter.on.

Con la solución podría conseguir este nuevo trace:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at EventEmitter.addListener.EventEmitter.on (xxx/main.js:44:15)
    at Readable.on (_stream_readable.js:653:33)
    at ServerResponse.assignSocket (http.js:1072:10)
    at parser.onIncoming (http.js:1979:11)
    at parserOnHeadersComplete (http.js:119:23)
    at socket.ondata (http.js:1912:22)
    at TCP.onread (net.js:510:27)
Author: Suresh Mahawar, 2013-03-23

7 answers

Resulta que este es un error en nodejs core, estamos hablando de este problema aquí:

Https://github.com/joyent/node/issues/5108

Solución para servidores http con errores que arroja un EventEmitter memory leak detected y llena la memoria disponible / tiempos de CPU disponibles:

Volver a la versión heredada v0.8.23.

Puedes descargarlo e instalarlo/compilarlo desde aquí :

Http://blog.nodejs.org/2013/04/08/node-v0-8-23-legacy /

 29
Author: Ifnot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-25 18:28:30

Para mí, parece que su bucle de eventos está bloqueado. Esto puede suceder si está realizando tareas intensivas de cpu en node.bucle de eventos js. Puede usar proceso hijo para realizar tareas intensivas.

Puede comprobar lo que está bloqueando el nodo.js using following methods :

  1. Mide el tiempo de cómputo de cada llamada. Registre si el tiempo es alto para que sepa que la aplicación se comporta mal.
  2. Configure un horario de registro para que sepa cuándo algo se bloquea bucle
    function timeTick() {
        var startTime = (new Date().getTime());
        function onTick() {
            var interval = (new Date().getTime()) - startTime;
            if(interval > 5)
                console.log('timeTick(): WARNING: interval = ' + interval);
        }
       process.nextTick(onTick);
    }
    setInterval(timeTick, 1000);
  3. Utilice el perfil .
  4. Use esto para el registro y la creación de perfiles. Es la biblioteca utilizada en Nodejitsu.
 11
Author: jan salawa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-27 08:09:54

Esto es exactamente lo que me pasó. Para mí, anidé un oyente de eventos dentro de otro oyente de eventos accidentalmente.

Mire su código y asegúrese de que NO tiene un bloque de escucha de eventos DENTRO de otro bloque de escucha de eventos, por ejemplo(a menos que lo esté haciendo a propósito):

socket.on('data', function(data) {
//code goes here

socket.on('close' , function() {
//code goes here
     });

   });

En el ejemplo equivocado anterior, el socket.el oyente on ('close') debe estar FUERA del socket.en el bloque ('datos').

En mi caso cuando recibí 5 flujos de datos, el socket.on ('close') el oyente está esperando que ocurra un evento cercano. Cuando cierro una vez, otro 4to evento de cierre se ejecutaría. Esto claramente no es lo que quería. Esto se debe a la naturaleza del Nodo.js que no bloquea. 'Recuerda' eventos debido a la función de devolución de llamada.

 9
Author: fadleen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-22 01:57:53

Traté de prototipar el EventEmitter para agregar mensajes de registro en addListener pero no pude conseguir que funcione

Para enganchar addListener puedes hacer algo como esto:

// on the first line of your main script
var events = require("events"),
    EventEmitter = events.EventEmitter;

var originalAddListener = EventEmitter.prototype.addListener;
EventEmitter.prototype.addListener = function (type, listener) {
    if (this.listenerCount(this, type) >= 10) {
        // TODO: PLACE YOUR CODE FOR DEBUGGING HERE
    }
    originalAddListener.apply(this, arguments);
}
 4
Author: fardjad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-23 20:16:43

Esta advertencia se lanzará si se registra para un evento particular de un mismo objeto más de 11 veces.

Compruebe si está teniendo una llamada 'on' para el evento particualr en una función a la que está llamando con frecuencia, esto lleva a registrarse para un evento varias veces.

Este enlace me ayudó a entender esto.

 4
Author: Vishwanath gowda k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-21 08:49:58

Desde el nodo 6 debe usar node --trace-warnings: https://nodejs.org/api/cli.html#cli_trace_warnings

 1
Author: nicojs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-31 18:15:13

Me encontré con el mismo problema al probar React componentes usando mocha y enzima.

Pude resolver mi problema desmontando explícitamente los componentes después de haber terminado de probarlos.

El problema era que estaba montando componentes varias veces en mis pruebas, que luego agregaban más oyentes, hasta que el número de oyentes llegó a 11, y recibí una advertencia.

Cambié mi código de prueba agregando el renderizado.desconectar() línea. Esto solucionó el problema para mí.

describe('<CircleArc />', () => {

    it('renders', function () {
        const rendered = mount(<CircleArc />);
        assert.ok(rendered.find('path'));
        rendered.unmount();
    });
}
 -1
Author: brendangibson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-05 17:48:58