后端性能:Node.js性能优化与调优
后端性能Node.js性能优化与调优大家好我是欧阳瑞Rich Own。今天想和大家聊聊Node.js性能优化这个重要话题。作为一个全栈开发者后端性能直接影响应用的吞吐量和响应时间。今天就来分享一下Node.js性能优化的最佳实践。Node.js性能概述常见性能瓶颈瓶颈说明CPU密集型任务阻塞事件循环内存泄漏内存持续增长I/O操作数据库查询慢同步操作阻塞主线程性能指标指标说明目标值QPS每秒请求数根据业务需求响应时间请求响应耗时 100ms内存使用进程内存占用稳定在固定范围CPU使用率处理器占用率 70%CPU优化避免阻塞事件循环// 不好的做法同步密集计算 function fibonacci(n) { if (n 1) return n; return fibonacci(n - 1) fibonacci(n - 2); } app.get(/fib/:n, (req, res) { const result fibonacci(parseInt(req.params.n)); // 阻塞事件循环 res.send({ result }); }); // 好的做法使用Worker线程 const { Worker, isMainThread, parentPort } require(worker_threads); if (isMainThread) { app.get(/fib/:n, (req, res) { const worker new Worker(__filename); worker.postMessage(parseInt(req.params.n)); worker.on(message, (result) { res.send({ result }); }); }); } else { parentPort.on(message, (n) { const result fibonacci(n); parentPort.postMessage(result); }); }使用集群模式const cluster require(cluster); const numCPUs require(os).cpus().length; if (cluster.isPrimary) { console.log(Primary ${process.pid} is running); for (let i 0; i numCPUs; i) { cluster.fork(); } cluster.on(exit, (worker) { console.log(Worker ${worker.process.pid} died); cluster.fork(); }); } else { const express require(express); const app express(); app.get(/, (req, res) { res.send(Hello World!); }); app.listen(3000); console.log(Worker ${process.pid} started); }内存优化内存泄漏检测// 使用heapdump const heapdump require(heapdump); setInterval(() { if (process.memoryUsage().heapUsed 100 * 1024 * 1024) { heapdump.writeSnapshot(heap-${Date.now()}.heapsnapshot); } }, 5000);避免内存泄漏// 不好的做法全局变量累积 const cache {}; function processRequest(data) { const key generateKey(data); cache[key] data; // 永不清理内存持续增长 } // 好的做法使用LRU缓存 const LRU require(lru-cache); const cache new LRU({ max: 1000, ttl: 60 * 1000 // 1分钟过期 }); function processRequest(data) { const key generateKey(data); cache.set(key, data); }I/O优化数据库连接池// 使用连接池 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 query(sql, params) { const connection await pool.getConnection(); try { const [rows] await connection.execute(sql, params); return rows; } finally { connection.release(); } }批量操作// 不好的做法循环查询 async function processUsers(userIds) { for (const id of userIds) { await db.query(SELECT * FROM users WHERE id ?, [id]); } } // 好的做法批量查询 async function processUsers(userIds) { const placeholders userIds.map(() ?).join(,); const users await db.query( SELECT * FROM users WHERE id IN (${placeholders}), userIds ); return users; }实战案例性能监控const express require(express); const app express(); // 响应时间中间件 app.use((req, res, next) { const start Date.now(); res.on(finish, () { const duration Date.now() - start; console.log(${req.method} ${req.path} ${duration}ms); // 记录慢请求 if (duration 500) { console.warn(Slow request: ${req.method} ${req.path} ${duration}ms); } }); next(); }); // 内存监控 setInterval(() { const memUsage process.memoryUsage(); console.log(Memory: ${(memUsage.heapUsed / 1024 / 1024).toFixed(2)} MB); }, 5000); app.listen(3000);最佳实践1. 使用异步API// 不好的做法同步读取文件 const fs require(fs); const data fs.readFileSync(file.txt); // 阻塞 // 好的做法异步读取文件 const fs require(fs).promises; const data await fs.readFile(file.txt); // 非阻塞2. 使用流式处理// 处理大文件 const fs require(fs); const zlib require(zlib); const readStream fs.createReadStream(large-file.txt); const writeStream fs.createWriteStream(large-file.txt.gz); const gzip zlib.createGzip(); readStream.pipe(gzip).pipe(writeStream);总结Node.js性能优化需要从多个方面入手。通过优化CPU使用、内存管理和I/O操作可以显著提升应用性能。我的鬃狮蜥Hash对性能优化也有自己的理解——它总是选择最有效的路径捕捉蟋蟀这也许就是自然界的性能优化吧如果你对Node.js性能优化有任何问题欢迎留言交流我是欧阳瑞极客之路永无止境技术栈Node.js · 性能优化 · 后端调优