【悄咪咪学Node.js】7.1 os.cpus()

OS 模块

1. 前言

本系列课程对非功能性函数内容安排中,将插入一些在生产过程中可能会用到对应函数的例子。

本节课将会引导大家学习了解:

  • os.cpus() 的使用方法
  • os.cpus() 在生产中的作用

学习完本节课程后,应该具有:

  • 使用 os 模块获取 CPU 信息的能力

2. os 模块

2.1 官方解释

os模块提供了与操作系统相关的实用程序方法和属性。可以使用以下命令访问它:

js 复制代码
const os = require('os');

2.2 笔者解释

os模块还能提供一些硬件信息,例如本节课程将会提及的 os.cpus() 函数。

3 os.cpus()

os.cpus() 可以获取一些 CPU 的参数。

3.1 参数列表

os.cpus()

参数名 参数类型 含义
model 对应内核的型号
speed 以兆赫兹为单位
times 不同模式下所用时间

os.cpus().times

参数名 参数类型 含义
user CPU 在用户模式下花费的毫秒数。
nice CPU 在良好模式下花费的毫秒数。
sys CPU 在系统模式下花费的毫秒数。
idle CPU 在空闲模式下花费的毫秒数。
irq CPU 在中断请求模式下花费的毫秒数。

4 代码例子

js 复制代码
const os = require('os');

console.log(os.cpus());

结果

shell 复制代码
[ { model: 'Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz',
    speed: 3100,
    times:
     { user: 4445480, nice: 0, sys: 3350020, idle: 28158660, irq: 0 } },
  { model: 'Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz',
    speed: 3100,
    times:
     { user: 1088550, nice: 0, sys: 981290, idle: 33883060, irq: 0 } },
  { model: 'Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz',
    speed: 3100,
    times:
     { user: 3639780, nice: 0, sys: 2981220, idle: 29331900, irq: 0 } },
  { model: 'Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz',
    speed: 3100,
    times:
     { user: 775880, nice: 0, sys: 662640, idle: 34514380, irq: 0 } } ]

能获得以下信息:

  • 我的电脑是 4 核
  • 所有 CPU 的型号都是 Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz
  • 所有 CPU 的速度都是 3.1G 赫兹

再执行以下代码:

js 复制代码
const os = require('os');

let sum_idle = 0,
    sum_irq = 0,
    sum_busy = 0;
    
os.cpus().forEach(function(cpu) {
    sum_idle += cpu.times.idle; // 累加空闲时间
    sum_irq += cpu.times.irq;   // 累加中断请求时间
    sum_busy += cpu.times.user + cpu.times.nice + cpu.times.sys + cpu.times.irq;  // 累加工作时间
});

console.log('核心总空余时间:' + sum_idle + ' ms');
console.log('核心总工作时间:' + sum_busy + ' ms');
console.log('核心总中断请求时间:' + sum_irq + ' ms');
console.log('机器持续运行:' + ((sum_idle + sum_busy) / os.cpus().length) + ' ms');
console.log('核心平均工作时间比:' + parseFloat((sum_busy / (sum_idle + sum_busy)) * 100).toFixed(2) + '%');

结果

shell 复制代码
核心总空余时间:128278840 ms
核心总工作时间:18492420 ms
核心总中断请求时间:0 ms
机器持续运行:36692815 ms
核心平均工作时间比:12.60%

初步可判断,机器运行良好,计算压力小,机器持续运行 10 小时 11 分钟 33 秒钟。

5 生产中的作用

通过求得 CPU 核心数来设定子进程数。

假设 childProcess() 函数能生成子进程完成工作:

js 复制代码
function childProcess() {
    // todo...
    // 具体实现规则请参考 child_process 章节
}

// 根据 CPU 核心数生成子进程
for (let i = 0; i < os.cpus().length; i++) {
    childProcess(); 
}

这么使用是有深层次的原因的:

  • 一个 Node.js 进程只会使用一个 CPU 核心
  • 不同 CPU 核心之间的负载会自动调节
  • 一个 CPU 核心同一时间只能执行一条机器指令

以上述例子中电脑的数据为例,启动 Node.js 进程的时候,最多只会用到机器的 1/4 运算能力,因为 一个 Node.js 进程只会使用一个 CPU 核心。但启用子进程后,如果其他 CPU 核心的负载低,那么就会将子进程分配给另外的 CPU,从而高效利用机器性能。

那么是开的子进程越多,效率越高吗?

答案是 ------ 不是的!

假设开了五个 Node.js 进程,在上述机器中,必定有一个 CPU 核心是负责两个 Node.js 进程的,这是因为 一个 CPU 核心同一时间只能执行一条机器指令

打个生活化的比喻:

奶茶店中有 4 个调制奶茶的员工,而老板却设立的 5 个职位,每杯奶茶调制时间为 1 分钟,假设有 20 杯奶茶的调制工作:

这必定会使其中 1 个员工负责 2 个职位的工作。
每个职位分到 4 杯。
其中负责 2 个职位的人需要 8 分钟才能完成工作,其余人需要 4 分钟。

结果:
完成所有工作时间为 8 分钟。

奶茶店中有 4 个调制奶茶的员工,老板设立的 4 个职位,每杯奶茶调制时间为 1 分钟,假设有 20 杯奶茶的调制工作:

每个员工负责 1 个职位。
每个职位分到 5 杯。
4 个员工每人完成工作的时间均为 5 分钟。

结果:
完成所有工作时间为 5 分钟。

在这个例子中,员工就是 CPU 核心、职位就是进程。

Tips:根据机器 CPU 核心数制定不同的子进程数才是最高效率的做法。

5. 小结

本节课程我们主要学习了 如何使用os.cpus()获取 CPU 信息os.cpus() 在生产中的作用

重点如下:

  1. 重点1

    根据 CPU 核心数来制定不同的子进程上限数。

相关推荐
Манго нектар4 分钟前
JavaScript for循环语句
开发语言·前端·javascript
Zheng1131 小时前
【可视化大屏】将柱状图引入到html页面中
javascript·ajax·html
john_hjy2 小时前
【无标题】
javascript
奔跑吧邓邓子2 小时前
npm包管理深度探索:从基础到进阶全面教程!
前端·npm·node.js
软件开发技术深度爱好者2 小时前
用HTML5+CSS+JavaScript庆祝国庆
javascript·css·html5
汪子熙3 小时前
Angular 服务器端应用 ng-state tag 的作用介绍
前端·javascript·angular.js
昨天;明天。今天。8 小时前
案例-表白墙简单实现
前端·javascript·css
安冬的码畜日常8 小时前
【玩转 JS 函数式编程_006】2.2 小试牛刀:用函数式编程(FP)实现事件只触发一次
开发语言·前端·javascript·函数式编程·tdd·fp·jasmine
小御姐@stella8 小时前
Vue 之组件插槽Slot用法(组件间通信一种方式)
前端·javascript·vue.js
GISer_Jing8 小时前
【React】增量传输与渲染
前端·javascript·面试