在CentOS上监控Node.js应用性能的方法可分为 进程管理工具、系统级工具、第三方APM工具、日志管理、内置模块及自定义方案 六大类,以下是具体实现步骤:
PM2是Node.js生态中最流行的进程管理工具,提供性能监控、日志管理、自动重启等功能,适合生产环境使用。
sudo npm install pm2 -g
pm2 start app.js --name "my-node-app"
pm2 monit
pm2 list
pm2 logs my-node-app
pm2 save && pm2 startup
通过CentOS自带的命令行工具,可快速查看系统资源占用及Node.js进程状态:
htop需安装,更直观):sudo yum install htop -y # 安装htop
top # 或 htop
vmstat 3
sysstat包):sudo yum install sysstat -y
iostat -x 1 # 查看磁盘详细IO指标
free -m # 以MB为单位显示
APM(应用性能管理)工具可提供端到端性能追踪、错误监控、慢查询分析等功能,适合复杂应用:
prom-client库暴露指标);newrelic Node.js模块(npm install newrelic --save),配置newrelic.js文件(填入许可证密钥),即可实时监控应用性能、错误日志及分布式追踪。datadog.yaml)。日志是排查性能问题的关键,可通过以下工具收集、分析Node.js日志:
/var/log/nodejs/app.log),解析后发送到Elasticsearch;ERROR、Timeout)快速定位性能瓶颈。/etc/logstash/conf.d/nodejs.conf):input {
file {
path => "/path/to/your/nodejs/logs/*.log"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "nodejs-logs-%{+YYYY.MM.dd}"
}
}
winston或morgan记录结构化日志(如请求时间、状态码、响应时间),便于后续分析:const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
// 记录请求日志(配合Express中间件)
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
logger.info({
method: req.method,
url: req.url,
status: res.statusCode,
responseTime: Date.now() - start
});
});
next();
});
通过Node.js原生模块可快速获取应用的基本性能指标:
setInterval(() => {
const cpuUsage = process.cpuUsage(); // 返回用户态/内核态CPU时间(微秒)
const memoryUsage = process.memoryUsage(); // 返回堆内存、RSS等指标
console.log(`CPU Usage: ${cpuUsage.user / 1000000}秒`);
console.log(`Memory Usage: ${Math.round(memoryUsage.heapUsed / 1024 / 1024 * 100) / 100}MB`);
}, 5000); // 每5秒打印一次
const os = require('os');
const totalMem = os.totalmem(); // 总内存(字节)
const freeMem = os.freemem(); // 空闲内存(字节)
const loadAvg = os.loadavg(); // 系统1/5/15分钟平均负载
console.log(`Total Memory: ${(totalMem / 1024 / 1024).toFixed(2)}MB`);
console.log(`Free Memory: ${(freeMem / 1024 / 1024).toFixed(2)}MB`);
console.log(`System Load Avg: ${loadAvg.join(', ')}`);
若需特定指标(如数据库查询时间、第三方API响应时间),可编写自定义脚本定期收集并上报数据:
const http = require('http');
const start = Date.now();
http.get('http://example.com', (res) => {
const duration = Date.now() - start;
console.log(`Request to example.com took ${duration}ms`);
// 可将数据发送到Prometheus、InfluxDB等存储
});
prom-client库暴露自定义指标(如HTTP请求计数、响应时间):const promClient = require('prom-client');
const httpRequestDurationMicroseconds = new promClient.Histogram({
name: 'http_request_duration_ms',
help: 'Duration of HTTP requests in ms',
buckets: [10, 50, 100, 500, 1000] // 定义桶范围
});
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
httpRequestDurationMicroseconds.observe({
method: req.method,
path: req.path,
status: res.statusCode
}, Date.now() - start);
});
next();
});
// 启动Prometheus metrics endpoint
app.get('/metrics', async (req, res) => {
res.set('Content-Type', promClient.register.contentType);
res.end(await promClient.register.metrics());
});
以上方法可根据应用规模、监控深度、预算选择组合使用(如小型应用用PM2+系统命令,大型应用用Prometheus+Grafana+APM工具),实现对Node.js应用性能的全面监控。