Al perfilar un progtwig nodejs, veo que el 61% de los tics son causados por ‘Desconocido’ (ver más abajo). ¿Qué puede ser esto? ¿Que debería buscar?
gramo,
Coen
Statistical profiling result from node, (14907 ticks, 9132 unaccounted, 0 excluded). [Unknown]: ticks total nonlib name 9132 61.3% [Shared libraries]: ticks total nonlib name 1067 7.2% 0.0% C:\Windows\SYSTEM32\ntdll.dll 55 0.4% 0.0% C:\Windows\system32\kernel32.dll [JavaScript]: ticks total nonlib name 1381 9.3% 10.0% LazyCompile: *RowDataPacket.parse D:\MI\packet.js:9 ......
Está utilizando una versión de 64 bits de Node.JS para ejecutar su aplicación y una comstackción de 32 bits del shell d8 para procesar su v8.log
. Usar una versión de Node.JS de 32 bits con ia32 como objective de comstackción para el shell d8 o una versión de Node.JS de 64 bits con x64 como el objective de comstackción del shell d8 debería resolver su problema.
¿Estás cargando algún módulo que haya construido dependencias?
Básicamente, por “Desconocido” significa “no contabilizado” (consulte tickprocessor.js
para obtener más información). Por ejemplo, el GC imprimirá mensajes como “scavenge, begin, …” pero eso no es reconocido por logreader.js
.
Sería útil saber qué biblioteca de perfiles está utilizando para analizar el archivo v8.log
.
Actualizar
El paquete node-tick
no se ha actualizado durante más de un año y es probable que falten muchos comandos recientes de prof
. Trate de usar node-profiler en su lugar. Es creado por uno de los mantenedores del nodo. Y si desea obtener el mejor resultado absoluto, deberá comstackrlo utilizando node-gyp
.
Actualizar
He analizado la salida de v8.log
usando lo último de node-profiler (lo último en master
, no la etiqueta más reciente) y publiqué los resultados en http://pastebin.com/pdHDPjzE
Permítanme señalar un par de entradas clave que aparecen aproximadamente a la mitad:
[GC]: ticks total nonlib name 2063 26.2% [Bottom up (heavy) profile] 6578 83.4% c:\node\node.exe 1812 27.5% LazyCompile: ~parse native json.js:55 1811 99.9% Function: ~ C:\workspace\repositories\asyncnode_MySQL\lib\MySQL_DB.js:41 736 11.2% Function: ~Buffer.toString buffer.js:392
Así que el 26.2% de todo el tipo de script se gastó en la recolección de basura. Que es mucho más alto de lo que debería ser. Aunque se correlaciona bien con cuánto tiempo se gasta en Buffer.toString
. Si se crean tantos búfers y luego se convierten en cadenas, ambos tendrían que ser gc’d cuando dejan el scope.
También tengo curiosidad por saber por qué se gasta tanto tiempo en LazyCompile
para json.js
O más aún, ¿por qué json.js
sería incluso necesario en una aplicación de nodo?
Para ayudarlo a optimizar el rendimiento de su aplicación, incluyo algunos enlaces a continuación que brindan buenas instrucciones sobre qué hacer y buscar.
Bonita cubierta deslizante con lo básico:
https://mkw.st/p/gdd11-berlin-v8-performance-tuning-tricks/#1
Ejemplos más avanzados de técnicas de optimización:
http://floitsch.blogspot.com/2012/03/optimizing-for-v8-introduction.html
Mejor uso de los cierres:
http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html
Ahora en cuanto a por qué no pudo lograr el mismo resultado. Si usted construyó y usó node-profiler y su nprof
proporcionado de master
y aún no funciona, asumiré que tiene algo que ver con estar en Windows. Piensa en presentar un error en GitHub y ver si te ayuda.
Intente construir v8 con soporte de perfiles en:
scons prof=on d8
Asegúrese de ejecutar node --prof
con la versión correspondiente a la versión de v8
Luego las tools/linux-tick-processor path/to/v8.log
deberían mostrarle la información completa del perfil.