Suite clinic.js
Perfila servicios Node.js con las herramientas clinic.js de NearForm: Doctor para la salud holística, Flame para los puntos calientes de la CPU y Bubbleprof para los retrasos de E/S asíncronas.
Busca en todas las páginas de la documentación
Perfila servicios Node.js con las herramientas clinic.js de NearForm: Doctor para la salud holística, Flame para los puntos calientes de la CPU y Bubbleprof para los retrasos de E/S asíncronas.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
npm install -g clinic
clinic doctor -- node dist/server.js
# En otra terminal, genera carga:
npx autocannon -c 50 -d 30 http://localhost:3000/health
# Presiona Ctrl+C en el servidor - Doctor abre un informe HTMLCuándo usarlo:
await secuenciales que añaden latencia.# 1. Doctor - salud general (retraso del bucle, CPU, memoria)
clinic doctor -- node --import tsx src/server.ts
# 2. Flame - gráfico de llama de CPU (ejecutar bajo carga, luego detener)
clinic flame -- node --import tsx src/server.ts
# 3. Bubbleprof - visualización de retrasos asíncronos
clinic bubbleprof -- node --import tsx src/server.ts// src/server.ts - aplicación mínima para perfilar
import Fastify from "fastify";
const app = Fastify({ logger: false });
app.get("/health", async () => ({ ok: true }));
app.get("/users/:id", async (req) => {
// Simula E/S secuencial - Bubbleprof lo destacará
const profile = await fakeDb("profiles", req.params.id);
const orders = await fakeDb("orders", req.params.id);
return { profile, orders };
});
async function fakeDb(table: string, id: string) {
await new Promise((r) => setTimeout(r, 20));
return { table, id };
}
await app.listen({ port: 3000, host: "0.0.0.0" });Lo que esto demuestra:
await secuenciales que Promise.all podría paralelizar.--import tsx evita un paso de compilación separado durante la investigación.| Herramienta | Mejor para | No para |
|---|---|---|
| Doctor | Primera pasada - "¿está bloqueado el bucle?" | Identificar nombres de funciones exactos |
| Flame | Rutas "calientes" ligadas a la CPU, JSON síncrono, bucles ajustados | Latencia solo de red (sin consumo de CPU) |
| Bubbleprof | HTTP/DB lento en el backend, awaits seriales | Cálculos de CPU puros sin E/S |
# Terminal 1
clinic flame -- node dist/server.js
# Terminal 2 - mantener la concurrencia
npx autocannon -c 100 -d 60 http://localhost:3000/users/abc-c) y los tamaños de carga útil.clinic doctor -- node --import tsx src/main.ts
# o compila primero para símbolos más cercanos a producción:
npm run build && clinic flame -- node dist/main.jspino-pretty.LOG_LEVEL=warn.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| clinic.js | Servicios HTTP de Node, problemas de bucle de eventos | Tiempos de ejecución que no son Node |
| 0x / flamegraph | Muestras rápidas de CPU puntuales | Necesidad de vista de cascada asíncrona |
| OpenTelemetry traces | Muestreo continuo en producción | Atribución profunda de CPU a nivel de V8 |
--inspect + Chrome DevTools | Depuración interactiva de una solicitud | Carga sostenida bajo concurrencia |
No. Ejecútalo en staging con datos anonimizados. La sobrecarga es baja pero no nula; detén el tráfico a la instancia perfilada.
Ejecuta Flame bajo la misma carga. Busca barras anchas en el código síncrono: JSON.parse, bcrypt, llamadas *Sync de fs.
Sí. Apunta clinic a tu main.js compilado o a node --import tsx src/main.ts. Deshabilita Swagger y el registro verboso durante la captura.
clinic.js es para investigaciones profundas y con límite de tiempo. OTel es para trazas y métricas continuas en producción. Usa ambos.
O la carga es demasiado baja o el cuello de botella está fuera de Node (DB, red). Revisa Bubbleprof y EXPLAIN de la DB.
Sí. Instala la última versión de clinic globalmente. Fija Node 24.18.0 para que coincida con producción.
Es posible, pero pesado. Prefiere los umbrales de k6 para las puertas de regresión; reserva clinic para análisis manuales profundos en caso de fallos.
Doctor muestra un aumento de la pila con el tiempo. Combínalo con writeHeapSnapshot de Ajuste de memoria y GC.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026