В настоящее время меня интересует модуль кластера nodejs для реализации мультиобработки.
Вот код, который поможет объяснить мою проблему.
process.env.UV_THREADPOOL_SIZE = 1;
const cluster = require('cluster');
if(cluster.isMaster){
cluster.fork();
cluster.fork();
} else {
const express = require('express');
const crypto = require('crypto');
const app = express();
app.get('/', (req, res) => {
crypto.pbkdf2('a', 'b', 100000, 512, 'sha512', () => {
res.send('benchmark test');
});
});
app.listen(3000, () => {
console.log('listen on port 3000');
});
}
Я установил UV_THREADPOOL_SIZE
1 для простоты (по умолчанию 4)
Я использую MacBook Pro 2017 года, который является двухъядерным компьютером с 4 потоками (логическими ядрами)
и функцией pbkdf2
внутри этого кодаОбработка на моем компьютере занимает около 1 секунды.(точнее, 970 мс)
Я использую тест Apache для тестирования производительности, но у меня возникла путаница.
с командой,
ab -c 4 -n 4 localhost:3000/
Time taken for tests: 1.785 seconds
Complete requests: 4
Failed requests: 0
Total transferred: 840 bytes
HTML transferred: 44 bytes
Requests per second: 2.24 [#/sec] (mean)
Time per request: 1785.403 [ms] (mean)
Time per request: 446.351 [ms] (mean, across all concurrent requests)
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 1769 1779 7.1 1783 1785
Waiting: 1769 1779 7.3 1783 1785
Total: 1769 1779 7.1 1783 1785
на моем компьютере установлено дваядра (физические ядра), и есть два экземпляра nodejs (кластеры).
, поэтому я подумал, что одно ядро займет один экземпляр.
, поэтому, когда четыре запроса вступают в игру одновременно,
Я предположил, что первые 2 запроса должны быть обработаны, а последние 2 запроса должны быть обработаны.
, но 4 запроса обрабатываются одновременно, а время соединения min и max почти одинаково.
Любой совет будет очень признателен.