在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應用性能的全面監控。