Ubuntu上Node.js项目性能监控的综合方案
在Ubuntu环境下,监控Node.js项目的性能需覆盖进程状态、资源使用、应用指标、日志分析及可视化等多个维度。以下是具体方法及工具推荐:
PM2是Node.js最流行的进程管理工具,内置监控功能,可实时跟踪应用的CPU、内存使用情况及运行状态。
--name参数指定名称(便于识别),--watch参数开启文件变动自动重启。sudo npm install pm2 -g
pm2 start app.js --name "my-node-app" --watch
pm2 monit命令打开交互式界面,查看应用的CPU、内存占用趋势,以及日志输出(支持实时滚动)。pm2 status命令获取应用的运行状态(在线/停止)、进程ID、重启次数等信息。通过Ubuntu自带的命令行工具,快速查看系统资源使用情况,定位Node.js应用对系统的影响。
top(动态显示进程CPU/内存占用,按M键按内存排序,P键按CPU排序)、htop(增强版top,支持颜色显示和鼠标操作,需安装:sudo apt install htop)。vmstat 1(每秒刷新一次,显示内存、进程、CPU、磁盘I/O等统计信息)、iostat -x 1(查看磁盘I/O详细情况,需安装sysstat包)、free -h(查看内存使用情况,以GB/MB为单位)、df -h(查看磁盘空间占用)。通过指标采集+可视化的方式,全面监控应用的请求率、延迟、错误率等性能指标。
prom-client库,用于定义和暴露指标。npm install prom-client
const client = require('prom-client');
const httpRequestDuration = new client.Histogram({
name: 'http_request_duration_ms',
help: 'Duration of HTTP requests in ms',
labelNames: ['method', 'route', 'code'],
buckets: [0.1, 5, 15, 50, 100, 200, 300, 400, 500] // 定义时间桶
});
/metrics路由,返回Prometheus格式的指标数据。app.get('/metrics', async (req, res) => {
res.set('Content-Type', client.register.contentType);
res.end(await client.register.metrics());
});
prometheus.yml文件,添加Node.js应用的抓取目标(替换为实际IP和端口)。scrape_configs:
- job_name: 'node-app'
static_configs:
- targets: ['192.168.1.100:3000'] # Node.js应用的/metrics端点地址
sudo apt install grafana),添加Prometheus作为数据源,创建仪表板展示请求率、延迟分布、错误率等图表。日志是排查性能问题的关键,需结构化记录并集中管理。
winston库记录JSON格式日志,包含时间戳、日志级别、消息等信息。const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info('Application started', { port: 3000 });
logger.error('Database connection failed', { error: err.message });
tail -f combined.log命令实时跟踪日志文件,或通过pm2 logs my-node-app查看PM2管理的应用日志。内存泄漏是Node.js应用常见的性能问题,需通过工具捕获堆内存快照进行分析。
heapdump库,在需要时生成堆内存快照文件(.heapsnapshot)。const heapdump = require('heapdump');
// 手动触发生成快照(可通过API或信号触发)
app.get('/generate-heapdump', (req, res) => {
const filename = `/tmp/heapdump-${Date.now()}.heapsnapshot`;
heapdump.writeSnapshot(filename, (err) => {
if (err) console.error(err);
else res.send(`Heap dump saved to ${filename}`);
});
});
.heapsnapshot文件下载到本地,通过Chrome DevTools的Memory面板加载,查看内存占用TOP对象、引用链,定位泄漏源头。利用Node.js内置模块,快速获取应用的基本性能信息。
process.memoryUsage()获取堆内存、RSS(常驻内存集)等信息。console.log(process.memoryUsage());
// 输出示例:{ rss: 12345678, heapTotal: 9876543, heapUsed: 5432100, external: 123456 }
process.cpuUsage()获取进程的CPU时间(用户态+内核态)。console.log(process.cpuUsage());
// 输出示例:{ user: 12345, system: 6789 } (单位:微秒)
process.hrtime()获取高精度时间戳,用于计算代码块的执行时间。const start = process.hrtime();
// 执行某段代码...
const diff = process.hrtime(start);
console.log(`Execution time: ${diff[0]}s ${diff[1]/1e6}ms`);
以上方案覆盖了Ubuntu环境下Node.js项目性能监控的全流程,可根据项目规模(如小型项目用PM2+内置模块,大型项目用Prometheus+Grafana)选择合适的工具组合。