使用PM2进行进程管理与监控
PM2是Node.js生态中最流行的进程管理工具之一,提供进程守护、实时监控、日志管理等功能,非常适合Debian环境下的Node.js应用监控。
sudo npm install -g pm2。pm2 start app.js --name "my-node-app"启动应用(将app.js替换为你的入口文件,my-node-app为自定义应用名称)。pm2 status命令查看所有管理的应用状态,包括CPU、内存使用率、进程ID、运行时间等信息。pm2 monit命令打开实时交互界面,动态显示应用的CPU、内存波动及日志输出;pm2 logs用于查看实时日志,帮助快速定位问题。pm2 restart my-node-app重启应用,pm2 stop my-node-app停止应用,pm2 delete my-node-app删除管理。利用系统工具进行基础监控
Debian自带的系统工具可快速查看Node.js进程的资源占用情况,适合简单监控需求。
top命令实时显示系统中所有进程的CPU、内存使用率(按P键按CPU排序,M键按内存排序);htop是top的增强版,提供更友好的界面(需安装:sudo apt install htop)。ps aux | grep node过滤出Node.js进程,查看其PID、CPU占用、内存占用等详细信息。vmstat 1每秒刷新一次系统资源使用情况(包括内存、交换区、IO等);iostat用于监控磁盘IO性能(需安装sysstat包)。集成Prometheus+Grafana实现高级监控与可视化
若需要更详细的性能指标(如请求延迟、错误率)及可视化 dashboard,可搭建Prometheus+Grafana监控体系。
prometheus_2.34.0.linux-amd64.deb),通过sudo dpkg -i安装;编辑配置文件/etc/prometheus/prometheus.yml,添加Node.js应用的抓取任务(需Node.js应用暴露/metrics端点,可通过prom-client库实现)。prom-client库(npm install prom-client),在应用中添加以下代码暴露CPU、内存等指标:const promClient = require('prom-client');
const collectDefaultMetrics = promClient.collectDefaultMetrics;
collectDefaultMetrics({ timeout: 5000 }); // 收集默认系统指标
// 自定义业务指标(如请求数)
const httpRequestCounter = new promClient.Counter({
name: 'http_requests_total',
help: 'Total number of HTTP requests',
});
// 在路由中增加计数
app.get('/', (req, res) => {
httpRequestCounter.inc();
res.send('Hello World');
});
grafana-8.2.0.linux-amd64.tar.gz),解压后启动(sudo ./bin/grafana-server);通过浏览器访问http://<服务器IP>:3000登录(默认账号admin,密码admin)。http://localhost:9090),导入Node.js监控模板(如Grafana官方库中的“Node.js”模板),即可查看CPU、内存、请求延迟等可视化图表。借助第三方APM工具实现全栈监控
若需要更全面的性能分析(如代码级性能瓶颈、错误追踪、数据库查询分析),可使用New Relic或Datadog等APM工具。
newrelic库(npm install newrelic),在应用入口文件(如app.js)顶部引入require('newrelic');配置newrelic.js文件(包含应用名称、License Key等信息),New Relic会自动收集应用的性能数据并提供可视化 dashboard。dd-trace库(npm install dd-trace),在应用入口文件中初始化Datadog(const tracer = require('dd-trace').init({ service: 'my-node-app' }));配置Datadog Agent收集数据,即可查看应用的实时性能、错误日志及分布式追踪信息。编写自定义监控脚本
若需要监控特定业务指标(如订单数量、缓存命中率),可编写自定义脚本定期采集数据并存储(如写入数据库或发送到监控系统)。
setInterval定期采集内存使用情况,并通过日志或API发送到远程服务器:const process = require('process');
setInterval(() => {
const memoryUsage = process.memoryUsage();
const cpuUsage = process.cpuUsage();
const data = {
timestamp: new Date().toISOString(),
freeMemory: memoryUsage.freemem(),
totalMemory: memoryUsage.totalmem(),
cpuUser: cpuUsage.user,
cpuSystem: cpuUsage.system,
};
console.log('Memory and CPU Usage:', data);
// 发送数据到远程服务器(如通过HTTP API)
// require('axios').post('http://your-monitoring-server/api/data', data);
}, 5000); // 每5秒采集一次