我是靠谱客的博主 会撒娇跳跳糖,这篇文章主要介绍nodejs cluster 利用多核cpu,现在分享给大家,希望可以做个参考。

原文链接: nodejs cluster 利用多核cpu

上一篇: nodejs worker_threads 简单使用

下一篇: nodejs crypto 加密 对称加密 非对称加密

使用 cluster 优化fib

普通的方法求前40项, 3000ms左右, 用cluster可降到2500ms左右

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
const cluster = require('cluster'); function fib(n = 1) { return n < 2 ? n : fib(n - 1) + fib(n - 2) } if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); // Fork workers. let st = +new Date() let cnt = 0 let size = 40 let arr = [] for (let i = 0; i <= size; i++) { let w = cluster.fork(); // console.log('w', w) w.process.send(i) w.process.on('message', (data) => { cnt++ // console.log('fib', data) arr.push(data) if (cnt === size + 1) { console.log(arr.sort((a, b) => a - b)) console.log('end', +new Date() - st) } }) } cluster.on('exit', (worker, code, signal) => { console.log(`worker ${worker.process.pid} died`); }); } else { process.on('message', (msg) => { // console.log('child', msg) process.send(fib(msg)) process.exit() }) } // 14930352, 24157817, 39088169, 63245986, // 102334155 // ] // end 2534

对于cpu核数的影响, 先求 [30, 40]之间的fib

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function fib(n = 1) { return n < 2 ? n : fib(n - 1) + fib(n - 2) } let st = +new Date() for (let i = 30; i <= 40; i++) { let f = fib(i) console.log(f) } let ed = +new Date() console.log(ed - st) // 3094 // 832040 // 1346269 // 2178309 // 3524578 // 5702887 // 9227465 // 14930352 // 24157817 // 39088169 // 63245986 // 102334155 // 3240

这次就相对好点, 因为worker数目小于cpu核数, 效果会好一点

复制代码
1
2
3
4
5
6
7
8
5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155 ] end 1661

但是限制worker数目, 并不能提高太多, 猜测还是ipc通讯效率问题

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const cluster = require('cluster'); const numCPUs = require('os').cpus().length; function fib(n = 1) { return n < 2 ? n : fib(n - 1) + fib(n - 2) } if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); // Fork workers. let st = +new Date() let cnt = 0 let size = 40 let arr = [] let now = 0 for (let i = 0; i < 8; i++) { let w = cluster.fork(); now++ w.process.send(i) w.process.on('message', (data) => { cnt++ // console.log('fib', data) arr.push(data) w.process.send(now++) if (cnt === size + 1) { console.log(arr.sort((a, b) => a - b)) console.log('end', +new Date() - st) } }) } cluster.on('exit', (worker, code, signal) => { console.log(`worker ${worker.process.pid} died`); }); } else { process.on('message', (msg) => { // console.log('child', msg) process.send(fib(msg)) // process.exit() }) }

按照配置负载均衡, windows上失败?

开10个worker, 是只有大量并发一万的情况下, 只能获得3个不同的server信息

http://blog.fens.me/nodejs-core-cluster/

减少worker数目成功

server 端

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var cluster = require('cluster'); var http = require('http'); if (cluster.isMaster) { console.log('[master] ' + "start master..."); for (var i = 0; i < 8; i++) { cluster.fork(); } cluster.on('listening', function (worker, address) { console.log('[master] ' + 'listening: worker' + worker.id + ',pid:' + worker.process.pid + ', Address:' + address.address + ":" + address.port); }); } else if (cluster.isWorker) { console.log('[worker] ' + "start worker ..." + cluster.worker.id); http.createServer(function (req, res) { console.log('worker'+cluster.worker.id); res.end('worker'+cluster.worker.id+',PID:'+process.pid); }).listen(3000); }

模拟请求, 返回不同的信息

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const axios = require('axios') let url = 'http://localhost:3000' let s = new Set() for (let i = 0; i < 10000; i++) { axios.get(url).then( ({data}) => { s.add(data) console.log(s.size) } ) } // 8 // 8 // 8 // 8 // 8 // 8 // 8

最后

以上就是会撒娇跳跳糖最近收集整理的关于nodejs cluster 利用多核cpu的全部内容,更多相关nodejs内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部