Node.js, tek bir iş parçacığı kullanarak çalışmakta, çok çekirdekli sistemlerden yararlanmak için Node.js cluster modülünü işin içine dahil etmemiz gerekmektedir.
Node.js cluster modülü, sunucu portu paylaşımlı yaparak çocuk iş parçacıkları oluşturup bunların da aynı port üzerinden işlem yapmasını sağlamaktadır. Böylece sistemin diğer çekirdeklerini de kullanılmasını sağlar.
Aşağıdaki yer alan örnekte, sunucunun portunu çocuk iş parçacıklarına paylaştırarak, çalışan Node.js sunucu kod parçası yer almaktadır.
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length; //çekirdek sayısı
if (cluster.isMaster) {
// bütün çekirdekler için çocuk oluşturma
for (var i = 0; i < numCPUs; i++) {
cluster.fork(); //çocuk iş parçacığı oluşturma
}
//iş parçacığı çıkış yaptığında
cluster.on('exit', (worker, code, signal) => {
if (signal) {
console.log(`iş parçacığı durduruldu: ${signal}`);
} else if (code !== 0) {
console.log(`İş parçacığı hatayla karşılaştı: ${code}`);
} else {
console.log('iş parçacığı çalışıyor');
}
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Merhaba Dünya\n');
}).listen(3000);
}
Bu kod parçası sunucunun çekirdek sayısı kadar çocuk iş parçacığı oluşturup, 3000 portunu paylaşımlı olarak kullanacaklardır.
Tek çekirdek ve çok çekirdek kullanan sunucunun saniyede atılan istek sayılarına kaç adet cevap verdiğinin karşılaştırılması aşağıda verilmiştir. ( yüksek en iyisidir )
Eş Zamanlı Bağlantı Sayısı (connections | 1 | 2 | 4 | 8 | 16 |
---|---|---|---|---|---|
Tek Çekirdek (request/second) | 654 | 711 | 783 | 776 | 754 |
8 Çekirdek (request/second) | 594 | 1198 | 2110 | 3010 | 3020 |