unclejee's blog
Node.js性能优化实战指南
Tags:
nodejs
性能优化
后端开发
服务器
Node.js以其非阻塞I/O模型著称,但要在实际应用中充分发挥其性能潜力,需要掌握一系列优化技巧。本文将详细介绍Node.js性能优化的实战方法。
事件循环优化
Node.js基于事件驱动模型,理解事件循环机制对性能优化至关重要。
// ❌ 阻塞事件循环的同步操作
function blockingOperation() {
let result = 0;
for (let i = 0; i < 1000000000; i++) {
result += i;
}
return result;
}
// ✅ 非阻塞异步操作
async function nonBlockingOperation() {
return new Promise(resolve => {
setImmediate(() => {
let result = 0;
for (let i = 0; i < 100000000; i++) {
result += i;
}
resolve(result);
});
});
}
内存管理
高效的内存管理是性能优化的关键环节。
// 内存泄漏检测示例
class MemoryLeakExample {
constructor() {
this.cache = new Map();
this.intervalId = null;
}
startCaching() {
// 创建定时任务缓存数据
this.intervalId = setInterval(() => {
// 模拟缓存数据
const key = Date.now().toString();
this.cache.set(key, new Array(10000).fill(Math.random()));
// 限制缓存大小
if (this.cache.size > 100) {
const firstKey = this.cache.keys().next().value;
this.cache.delete(firstKey);
}
}, 1000);
}
stop() {
if (this.intervalId) {
clearInterval(this.intervalId);
this.intervalId = null;
}
}
}
集群模式
利用多核CPU提升应用性能。
// cluster_example.js
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`主进程 ${process.pid} 正在运行`);
// 衍生工作进程
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.process.pid} 已退出`);
// 重启新的工作进程
cluster.fork();
});
} else {
// 工作进程可以共享任意 TCP 连接
// 在本例子中,共享的是 HTTP 服务器
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(8000);
console.log(`工作进程 ${process.pid} 已启动`);
}
数据库查询优化
数据库操作往往是性能瓶颈所在。
// 使用连接池优化数据库访问
const mysql = require('mysql2/promise');
// 创建连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydb',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
// 批量查询优化
async function getMultipleUsers(ids) {
const placeholders = ids.map(() => '?').join(',');
const query = `SELECT * FROM users WHERE id IN (${placeholders})`;
const [rows] = await pool.execute(query, ids);
return rows;
}
// 使用索引优化查询
async function getUserByEmail(email) {
// 确保email字段上有索引
const [rows] = await pool.execute(
'SELECT * FROM users WHERE email = ?',
[email]
);
return rows[0];
}
缓存策略
合理的缓存策略能显著提升应用性能。
// 简单的内存缓存实现
class SimpleCache {
constructor(maxSize = 100, ttl = 60000) {
this.cache = new Map();
this.maxSize = maxSize;
this.ttl = ttl;
}
get(key) {
const item = this.cache.get(key);
if (!item) return undefined;
// 检查是否过期
if (Date.now() - item.timestamp > this.ttl) {
this.cache.delete(key);
return undefined;
}
return item.value;
}
set(key, value) {
// 如果达到最大容量,删除最旧的条目
if (this.cache.size >= this.maxSize) {
const firstKey = this.cache.keys().next().value;
this.cache.delete(firstKey);
}
this.cache.set(key, {
value,
timestamp: Date.now()
});
}
clear() {
this.cache.clear();
}
}
const cache = new SimpleCache(50, 300000); // 最多50个项目,5分钟过期
性能监控
持续监控是优化的基础。
// 性能监控中间件
function performanceMiddleware(req, res, next) {
const start = process.hrtime.bigint();
res.on('finish', () => {
const end = process.hrtime.bigint();
const duration = Number(end - start) / 1000000; // 转换为毫秒
console.log(`${req.method} ${req.url} - ${duration.toFixed(2)}ms`);
// 发送到监控服务
// monitorService.recordRequest({
// url: req.url,
// method: req.method,
// duration,
// statusCode: res.statusCode
// });
});
next();
}
总结
Node.js性能优化是一个持续的过程,需要关注多个方面:事件循环效率、内存管理、数据库查询优化、缓存策略等。通过合理运用这些技巧,可以显著提升应用的响应速度和吞吐量。