内容简介:Node.js CPU调度优化(多服务器多核心分配调度)
假设处理的任务列表如下:
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
以10为例,假设服务器为4CPU,那么每个CPU处理的任务分别为:
- CPU1: [1, 2, 3]
- CPU2: [4, 5, 6]
- CPU3: [7, 8]
- CPU4: [9, 0]
const numCPUs = require('os').cpus().length; // 假设该值为 4 // 处理的任务列表 const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; // 调度处理代码写在这儿 // 每个 CPU 分配 N 个任务 const n = Math.floor(arr.length / numCPUs); // 未分配的余数 const remainder = arr.length % numCPUs; for (let i = 1; i <= numCPUs; i += 1) { console.log(arr.splice(0, n + (i > remainder ? 0 : 1))); }
Cluster 模式示例
入口文件 index.js
const cluster = require('cluster'); (async() => { /* eslint global-require:0 */ let run; if (cluster.isMaster) { run = require('./cluster/master'); } else { run = require('./cluster/worker'); } try { await run(); } catch (err) { console.trace(err); } })();
Master任务: ./cluster/master.js
const cluster = require('cluster'); const numCPUs = require('os').cpus().length; // 处理的任务列表 const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; module.exports = async () => { // 调度处理代码写在这儿 // 每个 CPU 分配 N 个任务 const n = Math.floor(arr.length / numCPUs); // 未分配的余数 const remainder = arr.length % numCPUs; for (let i = 1; i <= numCPUs; i += 1) { const tasks = arr.splice(0, n + (i > remainder ? 0 : 1)); // 将任务编号传递到 Cluster 内启动 cluster.fork({ tasks: JSON.stringify(tasks) }); } cluster.on('exit', (worker) => { console.log(`worker #${worker.id}PID:${worker.process.pid}died`); }); };
Cluster任务: ./cluster/worker.js
const cluster = require('cluster'); // 禁止直接启动 if (cluster.isMaster) { process.exit(0); } module.exports = async () => { const env = process.env.tasks; let tasks = []; if (/^\[.*\]$/.test(env)) { tasks = JSON.parse(env); } if (tasks.length === 0) { // 非法启动, 释放进程资源 process.exit(0); } console.log(`worker #${cluster.worker.id}PID:${process.pid}Start`); console.log(tasks); };
多服务器多核心分配调度
假设处理的任务列表如下:
const arr = [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];
有多台负载均衡器,仅确定服务器数量,不确定服务器硬件配置.
假设目前有3台服务器,分别为 4
核心, 6
核心, 8
核心.
按照核心性能进行优先调度,那么每个CPU处理的任务分别为:
-
服务器1 (
4
核心, 1.8GHz)- CPU1: [ 29 ]
- CPU2: [ 30 ]
- CPU3: [ 31 ]
- CPU4: [ 32 ]
-
服务器2 (
6
核心, 2.8GHz)- CPU1: [ 1, 2 ]
- CPU2: [ 3, 4 ]
- CPU3: [ 5, 6 ]
- CPU4: [ 7, 8 ]
- CPU5: [ 9, 10 ]
- CPU6: [ 11, 12 ]
-
服务器3 (
8
核心, 2.0GHz)- CPU1: [ 13, 14 ]
- CPU2: [ 15, 16 ]
- CPU3: [ 17, 18 ]
- CPU4: [ 19, 20 ]
- CPU5: [ 21, 22 ]
- CPU6: [ 23, 24 ]
- CPU7: [ 25, 26 ]
- CPU8: [ 27, 28 ]
const os = require('os'); const numCPUs = os.cpus().length; // 处理的任务列表 const arr = [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]; // 调度处理代码写在这儿 // 处理器主频 const speed = os.cpus().reduce((sum, cpu) => sum + cpu.speed, 0) / numCPUs; // 主机名 const hostname = os.hostname(); // 获取内网ip const eth0 = os.networkInterfaces().eth0; const ip = typeof eth0 === 'undefined' ? '' : eth0.filter(x=> x.family === 'IPv4')[0].address; // ./cluster/master.js module.exports = async () => { // 上报服务器信息到公共区域, 如 redis // 等待 `3` 台服务器全部上报完成 // 性能最高的一台执行任务调度,得到任务列表 // 写入公共区域,下派任务到其他服务器 // 下派本地cluster任务 };
未完待续
以上所述就是小编给大家介绍的《Node.js CPU调度优化(多服务器多核心分配调度)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Kafka两级调度实现分布式协调微服务任务分配Golang版
- 影响K8S Pod分配和调度策略的两大关键特性
- 操作系统学习笔记-11:内存分配(一):连续分配
- 操作系统学习笔记-12:内存分配(二):非连续分配
- PHPKafka 1.1.1 发布,支持消费者分区分配策略之粘性分配等功能
- Go:内存管理分配
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
高扩展性网站的50条原则
[美] Martin L. Abbott、[美]Michael T. Fisher / 张欣、杨海玲 / 人民邮电出版社 / 2012-6-3 / 35.00元
《高扩展性网站的50条原则》给出了设计高扩展网站的50条原则,如不要过度设计、设计时就考虑扩展性、把方案简化3倍以上、减少DNS查找、尽可能减少对象等,每个原则都与不同的主题绑定在一起。大部分原则是面向技术的,只有少量原则解决的是与关键习惯和方法有关的问题,当然,每个原则都对构建可扩展的产品至关重要。 主要内容包括: 通过克隆、复制、分离功能和拆分数据集提高网站扩展性; 采用横向......一起来看看 《高扩展性网站的50条原则》 这本书的介绍吧!