Node.js handles thousands of concurrent connections efficiently, but poor code can still cause performance bottlenecks.

Event Loop Blocking: CPU-intensive operations block the event loop. Offload heavy computation to worker threads or child processes.

Memory Leaks: Common sources include global variables, forgotten timers, and closures holding references. Use --inspect for heap snapshots.

Database Optimization: Use connection pooling, index frequently queried fields, avoid N+1 queries, and use caching (Redis) for hot data.

Streaming: For large data processing, use Node.js streams instead of loading everything into memory. This is critical for file uploads and API responses with large payloads.

Cluster Mode: Use the cluster module or PM2 to leverage all CPU cores. Node.js is single-threaded by default.

Monitoring: Implement application performance monitoring with tools like Prometheus + Grafana or New Relic.

These optimizations can significantly improve throughput and response times in production applications.