首页 > 编程语言 >node相关

node相关

时间:2023-05-10 09:13:39浏览次数:35  
标签:node Node http js cluster let 进程 相关

单线程的node是如何充分利用计算机CPU资源的?

1. 背景
Node.js在官网上是这样定义的: “ 一个搭建在Chrome JavaScript运行时上的平台,用于构建高速、可伸缩的网络程序。Node.js采用的事件驱动、非阻塞I/O模型使它既轻量又高效,是构建运行在分布式设备上的数据密集型实时程序的完美选择。”

用Node.js处理I/O密集型任务相当简单,只需要调用它准备好的异步非阻塞函数就行了。然而数据密集型实时(data-intensive real-time)应用程序并不是只有I/O密集型任务,当碰到CPU密集型任务时,比如要对数据加解密(node.bcrypt.js),数据压缩和解压(node-tar),或者要根据用户的身份对图片做些个性化处理,这时候该怎么办呢?

Node.js是单线程程序,它只有一个event loop,也只占用一个CPU/内核。现在大部分服务器都是多CPU或多核的,当Node.js程序的event loop被CPU密集型的任务占用,导致有其它任务被阻塞时,却还有CPU/内核处于闲置的状态,造成资源的浪费。

2. cluster 集群
为了充分利用cpu资源,通过类似nginx的master-worker多进程负载处理方式进一步压缩硬件性能,提升nodejs单机服务处理性能。所幸,Node提供了child_process模块,并且也提供了child_process.fork()函数供我们实现进程的复制。

 

 


考虑Node单机集群健壮性,平滑重启,性能等因素,NodeV0.8直接引入了cluster模块来处理,用以解决多核CPU的利用率问题,同时也提供了较完善的API,用以处理进程的健壮性问题。

2.1 cluster工作原理
事实上cluster模块就是child_process和net模块的组合应用。Cluster启动时,Cluter内部隐式创建TCP服务器,在cluster.fork()子进程时,将这个TCP服务器端socket的文件描述符发送给工作进程。如果工作进程中存在listen()侦听网络端口的调用,它将拿到该文件描述符,通过SO_REUSEADDR端口重用,从而实现多个子进程共享端口。

2.2 cluster事件
对于健壮性处理,cluster模块也暴露了相当多的事件。

Fork: 复制一个工作进程后触发该事件
Online: 复制完一个工作进程后,主进程收到消息后触发该事件
Listening:工作 进程调用listen(),主进程收到消息后触发该事件
Disconnect:IPC通道断开后触发该事件
Exit: 有工作进程退出时触发该事件
Setup: cluster.setupMaster()执行后触发该事件
3. 源码示例
3.1 源码
Worker.js 用于创建单个服务,并且计算斐波那契数列。

let http = require('http');

// let port = Math.round((1 + Math.random())*1000);
let port = 8882;
console.log(`Server running at http://localhost:${port}/`);
http.createServer((req, res) => {
let n = fibonacci(42);
res.end(n + '');
}).listen(port);

function fibonacci(n) {
if (n === 0 || n === 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}

Cluster.js 主进程,根据cpu数量复制多个进程。

let cluster = require('cluster');

cluster.setupMaster({
exec: "worker.js"
});

let cpus = require('os').cpus();
for (var i = 0; i < cpus.length; i++) {
cluster.fork();
}

3.2 运行
开启服务:
Node cluter.js

查询接口:
curl http://localhost:8882

查看资源: 任务管理器运行8个Node进程,(还有一个node进程是其他项目的)

4. 多核集群与单核性能对比
4.1 运行单核及多核集群
只是把worker.js 中端口号改成8881, 不妨定义成single.js

let http = require('http');

// let port = Math.round((1 + Math.random())*1000);
let port = 8881;
console.log(`Server running at http://localhost:${port}/`);
http.createServer((req, res) => {
let n = fibonacci(42);
res.end(n + '');
}).listen(port);

function fibonacci(n) {
if (n === 0 || n === 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}


运行: node single.js
多核集群运行参考3.2

4.2 使用ab做性能测试
单个请求计算时间较长,我们测试20个请求, 并发量10

ab -n 20 -c 10 http://localhost:8881
ab -n 20 -c 10 http://localhost:8882

4.3 测试结果

 

 

 

 

结论:
8个线程的,cpu都利用起来了99%, 耗时24秒; 1个线程,CPU只用37%,耗时67秒。单机多核集群性能有着明显的提高。

 

https://blog.csdn.net/qq_42415326/article/details/124564825

1、Nodejs 与操作系统交互,我们在 JavaScript 中调用的方法,最终都会通过 process.binding 传递到 C/C++ 层面,最终由他们来执行真正的操作。Node.js 即这样与操作系统进行互动。

2、Nodejs 所谓的单线程,只是主线程是单线程,所有的网络请求或者异步任务都交给了内部的线程池去实现,本身只负责不断的往返调度,由事件循环不断驱动事件执行。

3、Nodejs 之所以单线程可以处理高并发的原因,得益于 libuv 层的事件循环机制,和底层线程池实现。

4、Event loop 就是主线程从主线程的事件队列里面不停循环的读取事件,驱动了所有的异步回调函数的执行,Event loop 总共 7 个阶段,每个阶段都有一个任务队列,当所有阶段被顺序执行一次后,event loop 完成了一个 tick。

并发

https://juejin.cn/post/6942037239064952869

标签:node,Node,http,js,cluster,let,进程,相关
From: https://www.cnblogs.com/duanlibo/p/17318711.html

相关文章

  • nodejs
    node.js学习笔记1fs模块概念fs全称为filesystem,称之为文件系统,是Node.js中的内置模块,可以对计算机中的磁盘进行操作。文件写入文件写入就是将数据保存到文件中,我们可以使用如下几个方法来实现该效果方法说明writeFile异步写入writeFileSync同步写入......
  • Node + Express 后台开发 —— 上传、下载和发布
    上传、下载和发布前面我们已经完成了数据库的增删改查,在弄一个上传图片、下载csv,一个最简单的后台开发就已完成,最后部署即可。上传图片需求需求:做一个个人简介的表单提交,有昵称、简介和头像。后端能接收数据并保存到数据库。接收不到数据用amis-editor(amis低代码编辑器,更......
  • Web: parentElement parentNode
         ......
  • 5. 字符串的相关操作和函数
    一.相关操作1.1字符串的拼接+var1="你好,"var2="世界"res=var1+var2print(res)运行结果1.2.字符串的重复*res1="="*3print(res1)运行结果1.3.字符串的跨行拼接\strvar="sadfsdafsdfklskldfjklsadfjklsjdklfsjkladfjksahdfjkshakdfhskladh......
  • node使用fs.rename重命名文件的时候,如果有该名称的文件会被替换的问题
    再项目中使用fs.rename给快捷方式重命名的时候,因为有两个版本,在开发人员电脑上都安装两个版本的时候,发现每次都只有快捷方式,然后在重新查看代码的时候。发现代码中使用到了fs.rename去重命名文件。于是做了以下处理letnewLnkPath=path.join(桌面地址,`{appName}.lnk`)if(exi......
  • weblogic 相关概念
    计算机服务器部署https://blog.csdn.net/cunfu/article/details/117738439https://blog.csdn.net/suixinfeixiangfei/article/details/121595225?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-4-121595225-blog-118541751.23......
  • 学node 之前你要知道这些
    初识nodejs  19年年底一个偶然的机会接到年会任务,有微信扫码登录、投票、弹幕等功能,于是决定用node来写几个服务,结果也比较顺利。  当时用看了下koa2的官方文档,知道怎么连接数据库、怎么映射表实体,怎么处理http,怎么处理异常等,就可以直接写起来了。从应用层面上来说nodejs......
  • Java基础之时间相关的类有哪些?
    前言我们在开发时,除了数字、数学这样的常用API之外,还有日期时间类,更是会被经常使用。比如我们项目中必备的日志功能,需要记录异常等信息产生的时间。还有数据库中的表,也经常需要带有日期时间字段,用于记录本条数据产生和更新的时间。另外当我们需要对某段代码进行调优时,也往往需要......
  • 《nodejs跨栏》vue篇——vue简介
    Vue读音读作viewVue文件结构参考链接:https://www.runoob.com/vue2/vue-directory-structure.html其中App.vue代码如下:点击查看代码<!--展示模板--><template><divid="app"><imgdecoding="async"src="./assets/logo.png">......
  • 《nodejs跨栏》问题篇
    报错python.EXE参考链接:https://blog.csdn.net/qq_43753724/article/details/122241983报错内容如下:gypERRstackError:Commandfailed:D:\python\python.EXE-cimportsys;print解决方法:设置低版本python//设置confignpmconfigsetpythonD:\Python27......