Node.js CPU调度优化(多服务器多核心分配调度)

栏目: Node.js · 发布时间: 7年前

内容简介: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调度优化(多服务器多核心分配调度)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高扩展性网站的50条原则

高扩展性网站的50条原则

[美] Martin L. Abbott、[美]Michael T. Fisher / 张欣、杨海玲 / 人民邮电出版社 / 2012-6-3 / 35.00元

《高扩展性网站的50条原则》给出了设计高扩展网站的50条原则,如不要过度设计、设计时就考虑扩展性、把方案简化3倍以上、减少DNS查找、尽可能减少对象等,每个原则都与不同的主题绑定在一起。大部分原则是面向技术的,只有少量原则解决的是与关键习惯和方法有关的问题,当然,每个原则都对构建可扩展的产品至关重要。 主要内容包括: 通过克隆、复制、分离功能和拆分数据集提高网站扩展性; 采用横向......一起来看看 《高扩展性网站的50条原则》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具