node.js - tutorial - Nodejs perfilando resultados desconocidos y no contabilizados
npm (1)
Siempre actualice a la versión más reciente y estable de cualquier software que esté usando, Node.js 4.4.7 tiene un par de años.
Mike Ralphson bloguea en " Node.js - una historia de dos errores ":
"Es importante ejecutar ambos comandos con exactamente la misma versión de Node.js.
Desafortunadamente, cuando intenté crear un perfil para convertir un solo archivo (que mostró un aumento del 100% en el tiempo de ejecución), tanto Node.js 7.xy v8.0.0-test20170511830c4bf319 ​​mostraron casi todo el tiempo como no contabilizados: ...
Después de haber agotado mis habilidades de depuración de Node.js, pregunté qué podía hacer para tratar de producir un caso de prueba mínimo, y si existía algún antipatrón importante que pudiera resultar en un desempeño mucho peor en Node.js 7 y 8.
En esta etapa estaba convencido de que el problema estaba en ajv (la biblioteca utilizada para validar los esquemas JSON en swagger2openapi) o should.js (la biblioteca de prueba / aserción BDD que estaba usando).
Ben Noordhuis agregó al problema que el siguiente comando proporcionaría información más detallada sobre el perfil, específicamente sobre qué funciones se estaban des-optimizando y por qué:
$ node8 --trace_opt --trace_deopt swagger2openapi petstore.json
Esto apuntaba a dos líneas dentro de should.js:
;;; deoptimize at <D:/nodejs/swagger2openapi/node_modules/should/cjs/should.js:152:14>, no cache
;;; deoptimize at <D:/nodejs/swagger2openapi/node_modules/should/cjs/should.js:68:14>, no cache
Eso ayudó a reducirlo, y pronto se me ocurrió un caso de prueba mínimo que mostraba el comportamiento regresivo.
var should = require(''should''); //11.2.0
for (var i=0;i<10000;i++) {
i.should.not.be.type(''string'');
}
La colaboradora de Node.js, Anna Henningsen, informó que esto era reproducible.
...
También se ofreció a probar y volver a portar la corrección en v8 6.0 para que pudiera incluirse en la versión actual de Node.js. Sin embargo, este esfuerzo parece haberse estancado, pero la buena noticia es que la solución ya está en las compilaciones nocturnas de Node.js 9.0, que incluyen v8 6.1.
El plan era lanzar Node.js 8.7 con v8 6.1, que debería haber solucionado todos mis problemas, sin embargo, se ha encontrado un problema con el análisis de escape de v8 que se tuvo que deshabilitar en Node.js 8.7. tan rápido como esperaba. Si la solución de v8 6.2 se convertirá en Node.js 8.x antes de irse, LTS (Soporte a largo plazo) sigue siendo una cuestión de conjetura, pero les dejo los tiempos comparativos de mi caso de uso para Node.js 6.11 .4, 8.6.0, 8.7.0 y 9.0.0, todas las noches.
...
Si está utilizando una herramienta de aserción basada en excepciones en su entorno de desarrollo, o cualquier código crítico de rendimiento que dependa de los rastros de errores arrojados, o simplemente se preguntó dónde se fue su rendimiento desde Node.js 6.x, definitivamente debería considerar actualización a Node.js 8.7.
Actualiza tu Toolchain y Nodejs.
Producir un caso de prueba mínimo para demostrar la presencia o ausencia del error.
Lea los informes de errores, blogs y problemas conocidos del software que está utilizando.
He tenido un problema similar con gcc antes, las incógnitas y no profundizaba lo suficiente o en bibliotecas compartidas, volví a compilar toda la cadena de herramientas con una depuración detallada (-ggdb IIRC) para poder ver todo. El pelado quita fácilmente el exceso. Esa solución en particular fue útil para mí, ya que participé en pruebas e informes de errores, probablemente no sea útil para el usuario promedio, aunque es bastante fácil tener varias versiones de una Cadena de herramientas.
Estoy ejecutando nodejs 4.4.7 LTS
Ejecuto el generador de perfiles como se indica aquí https://nodejs.org/en/docs/guides/simple-profiling/ :
node --prof app.js
y entonces:
node --prof-process isolate-something-v8.log > processed.txt
¿Me falta algo para el perfilador o algo?
De qué trata el código:
La aplicación NodeJS es un servidor socket.io que envía datos de la aplicación WEB a C ++ y viceversa.
Puede ver en los resultados a continuación, que aquí hay una gran cantidad de tics no contabilizados. ¿Qué podría causar eso y cómo saber cuáles son los cuellos de botella de mi aplicación en este caso? ¿Cuál podría ser la solución?
Code move event for unknown code: 0x61047523c0
Code move event for unknown code: 0x6104bf74a0
Statistical profiling result from isolate-000001E1507CF2D0-v8.log, (211705 ticks, 210634 unaccounted, 0 excluded).
[Shared libraries]:
ticks total nonlib name
[JavaScript]:
ticks total nonlib name
71 0.0% 0.0% LazyCompile: *stringToBuffer *SOMETHING*/socket.io/node_modules/engine.io/node_modules/engine.io-parser/lib/index.js:359:24
59 0.0% 0.0% LazyCompile: listOnTimeout timers.js:56:23
50 0.0% 0.0% LazyCompile: *wrapper timers.js:274:19
43 0.0% 0.0% Stub: StringAddStub_CheckNone_NotTenured
.
.
.
[C++]:
ticks total nonlib name
[Summary]:
ticks total nonlib name
1071 0.5% 0.5% JavaScript
0 0.0% 0.0% C++
202 0.1% 0.1% GC
0 0.0% Shared libraries
210634 99.5% Unaccounted
[C++ entry points]:
ticks cpp total name
[Bottom up (heavy) profile]:
Note: percentage shows a share of a particular caller in the total
amount of its parent calls.
Callers occupying less than 2.0% are not shown.
ticks parent name
210634 99.5% UNKNOWN