深入NodeJS模块os - 与操作系统“打交道”
![](https://tva1.sinaimg.cn/large/006tNbRwly1gb0qoh8vpwj30xc0gomxw.jpg)
读了 os
模块的文档,研究了几个有意思的问题:
识别操作系统平台
理解和计算“平均负载”
理解和计算“cpu 使用率”
理解和计算“内存使用率”
查看运行时间
识别操作系统平台
nodejs 提供了os.platform()
和os.type()
,可以用来识别操作系统平台。推荐使用: os.platform()
理解和计算“平均负载”
平均负载是指:单位时间内,系统处于可运行状态和不可中断状态的平均进程数。它和 cpu 使用率没有直接关系。
其中,这里的可运行状态指的是:正在使用 cpu 或正在等待 cpu 的进程。不可中断状态指的是:内核态关键流程中的进程。
在 nodejs 中,直接调用os.loadavg()
可以获得 1、5 和 15 分钟的平均负载,它和 unix 命令uptime
返回值一样。
为什么需要关心平均负载这个问题呢?因为进程分为 2 种,第一种就是“CPU 密集型”,它的 cpu 使用率和平均负载都是高的;第二种是“IO 密集型”,它的 cpu 使用率不一定高,但是等待 IO 会造成平均负载高。所以,cpu 使用率和平均负载共同反应系统性能。
平均活跃进程数最理想的状态是 cpu 数量=平均负载,如果 cpu 数量 < 平均负载,那么平均负载过高。
// 判断是否平均负载过高
function isHighLoad() {
const cpuNum = os.cpus().length;
return os.loadavg().map(item => item > cpuNum);
}
理解和计算“cpu 使用率”
很多监控软件都提供针对 cpu 使用率的“实时”监控,当然这个实时不是真的实时,有个时间差。这个功能,nodejs 如何实现呢?
第一步:封装getCPUInfo()
,计算获取 cpu 花费的总时间与空闲模式花费的时间。
/**
* 获取cpu花费的总时间与空闲模式的时间
*/
function getCPUInfo() {
const cpus = os.cpus();
let user = 0,
nice = 0,
sys = 0,
idle = 0,
irq = 0,
total = 0;
cpus.forEach(<span class="hljs-function" style="line-height: 26px;"><span class="hljs-params" style="line-height: 26px;">cpu</span> =></span> {
<span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">const</span> { times } = cpu;
user += times.user;
nice += times.nice;
sys += times.sys;
idle += times.idle;
irq += times.irq;
});
total = user + nice + sys + idle + irq;
<span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">return</span> {
total,
idle
};
}
第二步:当前时间点 t1,选定一个时间差 intervel,计算 t1 和 t1 + interval 这两个时间点的 cpu 时间差与空闲模式时间差,返回 1 - 空闲时间差 / cpu时间差
。返回的结果就是时间差 intervel 内的平均 cpu 使用率。
function getCPUUsage(interval = 1000) {
const startInfo = getCPUInfo();
<span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">new</span> <span class="hljs-built_in" style="color: #0086b3; line-height: 26px;">Promise</span>(<span class="hljs-function" style="line-height: 26px;"><span class="hljs-params" style="line-height: 26px;">resolve</span> =></span> {
setTimeout(<span class="hljs-function" style="line-height: 26px;"><span class="hljs-params" style="line-height: 26px;">()</span> =></span> {
<span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">const</span> endInfo = getCPUInfo();
<span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">const</span> idleDiff = startInfo.idle - endInfo.idle;
<span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">const</span> totalDiff = startInfo.total - endInfo.total;
resolve(<span class="hljs-number" style="color: #008080; line-height: 26px;">1</span> - <span class="hljs-built_in" style="color: #0086b3; line-height: 26px;">Math</span>.abs(idleDiff / totalDiff));
}, interval);
});
}
使用方式如下:
getCPUUsage().then(usage => console.log("cpu使用率:", usage));
理解和计算“内存使用率”
cpu 的指标有平均负载、cpu 使用率,内存的指标有内存使用率。
借助 nodejs 接口,实现非常简单:
function getMemUsage() {
return 1 - os.freemem() / os.totalmem();
}
查看运行时间
nodejs 运行时间: process.uptime()
系统运行时间: os.uptime()
参考链接
放在最后
觉得不错,帮忙点个推荐呗,您的支持是对我最大的激励
欢迎我的公众号:「心谭博客」,只专注于前端 + 算法的原创分享
深入NodeJS模块os - 与操作系统“打交道”的更多相关文章
- os模块,os.path模块,subprocess模块,configparser模块,shutil模块
1.os模块 os表示操作系统该模块主要用来处理与操作系统相关的操作最常用的文件操作打开 读入 写入 删除 复制 重命名 os.getcwd() 获取当前执行文件所在的文件夹路径os.chdir(&q ...
- NodeJs之OS
OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...
- 36.Node.js 工具模块--OS模块系统操作
转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js os 模块提供了一些基本的系统操作函数.我们可以通过以下方式引入该模 ...
- day 18 random模块 时间模块 sys模块 os模块
import random 利用random模块可以进行从一个列表或者数字范围之间随机取出一个数字 # 取随机小数 : 数学计算 print(random.random()) # 取0-1之间的小数 ...
- json模块 os模块 文件加密
目录 一:random随机模块 二:os模块 三:文件处理选择任意视频 四:sys模块 五:实现文件执行加密操作 六:json 序列化模块 七:json序列化 反序列化 八:json 文件写读方式 九 ...
- python之模块(os、sys、json、subprocess)
目录 os模块 sys模块 json模块 subprocess模块 os模块 os模块主要是与操作系统打交道. 导入os模块 import os 创建单层文件夹,路径必须要存在 os.mkdir(路径 ...
- Node.js模块os
OS 操作系统模块 os.hostname() 操作系统的主机名. os.type() 操作系统的名称 os.release() 操作系统的发行版本 os.uptime() 当前系统的时间 以秒为 o ...
- python模块-OS模块详解
1.按字母分 os相关的函数:143个.按字母排序如下: ['abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'clo ...
- Python模块 - os , sys.shutil
os 模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录: ...
随机推荐
- 2018.10.26 浪在ACM 集训队第二次测试赛
2018.10.26 浪在ACM 集训队第二次测试赛 整理人:苗学林 A海港 参考博客:[1]:李继朋https://www.cnblogs.com/violet-acmer/p/9859006.ht ...
- P3521 [POI2011]ROT-Tree Rotations (线段树合并)
P3521 [POI2011]ROT-Tree Rotations 题意: 给你一颗树,只有叶子节点有权值,你可以交换一个点的左右子树,问你最小的逆序对数 题解: 线段树维护权值个个数即可 然后左右子 ...
- monaco-editor使用
monaco-editor是一款非常好用的web代码编辑器,那么如何把他加到自己的项目中呢. 1.下载插件 npm install monaco-editor@0.8.3 2.初始化编辑器值 < ...
- python列表(list)
#str #类,字符串 #name = "raitorei" #创建一个对象 #list #类,列表 ##############list类中提供的方法(灰魔法)######### ...
- 【汇编】1.汇编环境的搭建:DOSBox的安装
前言 DOSBox是一款在windows系统运行DOS程序的环境模拟器.可以解决在64位机中汇编程序编译调试等问题. 本文以 DOSBox 0.74 为例,汇编编译程序采用MASM6. 第一步下载相关 ...
- 大数据学习之路-Centos6安装python3.5
Centos 6.8安装python3.5.2 因为学习所需,需要用到python3.x的环境,目前Linux系统默认的版本都是python2.x的,还有一些自带的工具需要用到python2.6版本, ...
- 【转】离散傅里叶变换-DFT(FFT)基础
转:https://blog.csdn.net/zhangxz259/article/details/81627341 什么是离散傅里叶变换 matlab例子 本文是从最基础的知识开始讲解,力求用最通 ...
- spring boot通过@Bean注解定义一个Controller
功能需求 提供一个公共的jar包给其他业务模块依赖,需要在这个公共的jar中暴露一个restful API 采用spring auto config机制,在公共jar包中定义spring.factor ...
- 虚拟机下 windows 自动配置 IPv4 地址 169.254.X.X(首选)
问题: windows server上,自己手动配置的ip不生效,自动获取地址虽然ok,但是服务器必须指定ip. 诊段: ipconfig/all里查看 自动配置 IPv4 地址 169.254.X ...
- .Net Core使用分布式缓存Redis:Lua脚本
一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用L ...