DEV Community

ExtensionBooster
ExtensionBooster

Posted on

Node.js Performance Tips: From 100 to 10,000 Requests Per Second

Most Node.js apps can handle more than you think. Here's how to squeeze out real performance gains.

Quick Wins First

1. Enable Compression

import compression from 'compression';
app.use(compression());
Enter fullscreen mode Exit fullscreen mode

Gives you 2-3x throughput improvement instantly.

2. Use Clusters

Node.js runs single-threaded. Use all CPU cores:

import { cluster } from 'node:cluster';
const numCPUs = os.cpus().length;

if (cluster.isPrimary) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  app.listen(3000);
}
Enter fullscreen mode Exit fullscreen mode

3. Database Connection Pooling

Don't open a new DB connection per request. Use a pool:

const pool = new Pool({ max: 20, idleTimeoutMillis: 30000 });
// Reuse connections across requests
Enter fullscreen mode Exit fullscreen mode

Harder Problems

Memory Leaks

Use --inspect and Chrome DevTools to find leaks. Common causes:

  • Event listeners not cleaned up
  • Global caches growing unbounded
  • Closures holding references

N+1 Queries

// Bad: N+1
const users = await db.query('SELECT * FROM users');
for (const user of users) {
  user.posts = await db.query('SELECT * FROM posts WHERE user_id = ?', user.id);
}

// Good: Join
const users = await db.query(`
  SELECT u.*, p.title as post_title 
  FROM users u 
  LEFT JOIN posts p ON u.id = p.user_id
`);
Enter fullscreen mode Exit fullscreen mode

Benchmarking

Always measure before optimizing:

npx autocannon http://localhost:3000/api
Enter fullscreen mode Exit fullscreen mode

Find the actual bottleneck before assuming you know what it is. When debugging Node.js services, ExtensionBooster's developer toolkit includes performance profiling tools.

Top comments (0)