Node.js は、サーバーサイド開発に革命をもたらした強力なランタイム環境です。本質的にパフォーマンスは高いですが、最適なパフォーマンスを達成するには、多くの場合、慎重な最適化が必要です。この記事では、クラスタリングから始めて他の重要な戦略についても取り上げ、Node.js のパフォーマンスを向上させる方法を検討します。
Node.js のクラスタリングにより、複数の CPU コアを利用して同時リクエストを処理できるようになり、Node.js のシングルスレッドの性質が克服されます。これは、同じサーバー ポートを共有する複数のプロセスを生成することによって実現されます。
const http = require('http'); const PORT = 3000; http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!'); }).listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master process ${process.pid} is running`); // Fork workers for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); cluster.fork(); // Restart a worker if one dies }); } else { http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!'); }).listen(3000, () => { console.log(`Worker ${process.pid} started`); }); }
Node.js は、ノンブロッキング I/O に依存して複数のリクエストを効率的に処理します。非同期コードを記述すると、イベント ループがブロックされないことが保証されます。
const fs = require('fs'); const data = fs.readFileSync('file.txt', 'utf8'); console.log(data);
const fs = require('fs'); fs.readFile('file.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data); });
負荷分散は、受信リクエストを複数のサーバーまたはプロセスに分散し、単一のサーバーがボトルネックになるのを防ぎます。
負荷分散のための簡単な Nginx 構成:
const http = require('http'); const PORT = 3000; http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!'); }).listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
キャッシュは頻繁にアクセスされるデータをメモリに保存し、高価な計算やデータベース クエリの必要性を減らします。
const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master process ${process.pid} is running`); // Fork workers for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); cluster.fork(); // Restart a worker if one dies }); } else { http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!'); }).listen(3000, () => { console.log(`Worker ${process.pid} started`); }); }
イベント ループを監視すると、操作のブロックによって引き起こされるパフォーマンスのボトルネックを検出できます。
const fs = require('fs'); const data = fs.readFileSync('file.txt', 'utf8'); console.log(data);
イベント ループを監視することで、ボトルネックを事前に検出して解決し、スムーズなパフォーマンスを維持できます。
ストリームは大きなデータチャンクを段階的に処理し、メモリ使用量を削減します。
const fs = require('fs'); fs.readFile('file.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data); });
http { upstream backend { server 127.0.0.1:3001; server 127.0.0.1:3002; } server { listen 80; location / { proxy_pass http://backend; } } }
効率的なデータベース クエリにより、応答時間とサーバーの負荷が軽減されます。
const redis = require('redis'); const client = redis.createClient(); client.get('key', (err, data) => { if (data) { console.log('Cache hit:', data); } else { console.log('Cache miss'); client.set('key', 'value'); } });
const { monitorEventLoopDelay } = require('perf_hooks'); const h = monitorEventLoopDelay(); h.enable(); setInterval(() => { console.log(`Event loop delay: ${h.mean} ms`); }, 1000);
最適化されたクエリは必要なデータのみを取得するため、処理時間が短縮され、パフォーマンスが向上します。
Node.js のパフォーマンスを最適化するには、クラスタリングの活用からイベント ループの監視まで、戦略を組み合わせる必要があります。これらの手法を実装すると、高性能でスケーラブルなアプリケーションを構築できます。
以上がNode.jsのパフォーマンスを向上させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。