如何在CentOS上监控Node.js应用性能
导读:在CentOS上监控Node.js应用性能的方法可分为 进程管理工具、系统级工具、第三方APM工具、日志管理、内置模块及自定义方案 六大类,以下是具体实现步骤: 1. 使用PM2进程管理器(推荐) PM2是Node.js生态中最流行的进程管...
在CentOS上监控Node.js应用性能的方法可分为 进程管理工具、系统级工具、第三方APM工具、日志管理、内置模块及自定义方案 六大类,以下是具体实现步骤:
1. 使用PM2进程管理器(推荐)
PM2是Node.js生态中最流行的进程管理工具,提供性能监控、日志管理、自动重启等功能,适合生产环境使用。
- 安装PM2:通过npm全局安装(需先确保Node.js环境已配置):
sudo npm install pm2 -g
- 启动应用:通过PM2启动Node.js应用并命名(便于后续管理):
pm2 start app.js --name "my-node-app"
- 监控资源使用:实时查看应用的CPU、内存、事件循环延迟等指标:
pm2 monit
- 查看应用状态:列出所有由PM2管理的应用及其运行状态:
pm2 list
- 日志管理:查看应用实时日志(支持多应用过滤):
pm2 logs my-node-app
- 设置开机自启:保存当前PM2进程列表并配置系统开机自动启动:
pm2 save & & pm2 startup
2. 系统级监控工具(CentOS原生)
通过CentOS自带的命令行工具,可快速查看系统资源占用及Node.js进程状态:
- top/htop:动态显示系统中运行的进程及其CPU、内存使用情况(
htop
需安装,更直观):sudo yum install htop -y # 安装htop top # 或 htop
- vmstat:监控系统整体资源使用(进程、内存、IO、CPU等),每3秒刷新一次:
vmstat 3
- iostat:查看磁盘IO使用情况(需安装
sysstat
包):sudo yum install sysstat -y iostat -x 1 # 查看磁盘详细IO指标
- free:查看系统内存使用情况(包括缓存、缓冲区):
free -m # 以MB为单位显示
3. 第三方APM工具(全面性能分析)
APM(应用性能管理)工具可提供端到端性能追踪、错误监控、慢查询分析等功能,适合复杂应用:
- Prometheus + Grafana(开源组合):
- Prometheus:收集Node.js应用的指标数据(需安装Node Exporter或使用
prom-client
库暴露指标); - Grafana:可视化Prometheus中的数据,创建仪表盘(如CPU、内存、请求延迟等)。
部署步骤可参考之前关于Prometheus和Grafana的配置教程。
- Prometheus:收集Node.js应用的指标数据(需安装Node Exporter或使用
- New Relic/Datadog(商业工具):
- New Relic:通过安装
newrelic
Node.js模块(npm install newrelic --save
),配置newrelic.js
文件(填入许可证密钥),即可实时监控应用性能、错误日志及分布式追踪。 - Datadog:通过Agent收集系统及应用指标,支持Node.js应用监控(需安装Datadog Agent并配置
datadog.yaml
)。
- New Relic:通过安装
4. 日志管理(定位问题根源)
日志是排查性能问题的关键,可通过以下工具收集、分析Node.js日志:
- ELK Stack(Elasticsearch + Logstash + Kibana):
- Logstash:配置收集Node.js日志(如
/var/log/nodejs/app.log
),解析后发送到Elasticsearch; - Kibana:可视化日志数据,通过关键词(如
ERROR
、Timeout
)快速定位性能瓶颈。
示例Logstash配置(/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} " } }
- Logstash:配置收集Node.js日志(如
- 日志库增强:使用
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(); } );
5. Node.js内置模块(基础监控)
通过Node.js原生模块可快速获取应用的基本性能指标:
- process模块:获取CPU使用率、内存占用、事件循环延迟等信息:
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秒打印一次
- os模块:获取系统级资源信息(如总内存、CPU核心数、系统负载):
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(', ')} `);
6. 自定义监控脚本(灵活定制)
若需特定指标(如数据库查询时间、第三方API响应时间),可编写自定义脚本定期收集并上报数据:
- 示例:监控HTTP请求响应时间:
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等存储 } );
- 上报数据到Prometheus:使用
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应用性能的全面监控。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何在CentOS上监控Node.js应用性能
本文地址: https://pptw.com/jishu/726675.html