nodejs性能优化——多进程

2023-11-13

1.引言

    现在在准备毕设,打算还是使用nodejs作为后端,遇到了一些知识上的瓶颈,主要是想要写出一个高性能点的爬虫,由于每次请求的http数量上万,经常挂了,要么是他人的服务器终止了连接,要么是node经不起密集CPU,毕竟请求完成之后还需要对数据进行处理,特别是我毕设里面需要的数据涉及到cheerio依赖对于页面dom的操作,因此更加怀疑的是nodejs的算力不够导致的。因此,想要看看是否可以通过多线程和多进程来解决一下,恰好之前有一些知识落下了,刚好补一补。

2.ab测试

    提及这个主要是为了验证node多线程和多进程到底是做什么的,能够提供那些优化参考。首先借鉴一写文章说一下概念,ab是apache bench命令的缩写,ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它既可以用来测试apache的负载压力,也可以测试nginx、tomcat等其它Web服务器的压力。ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。

2.1环境配置

    mac内置Apache,但是windows是没有的,所以需要自己下一个Apache。刚好自己经常用小皮面板来下载数据库或者Apache或者是Nginx来配置本地开发环境,因此直接配个环境变量就行,比如我电脑里面的路径:

D:\phpstudy_pro\Extensions\Apache2.4.39\bin

    如果没有下载过小皮面板,推荐安装一个,毕竟用这个能够快速切换数据库版本,快速搭建本地环境,配一个Navicat能够轻松搞一个系统出来,比直接单独安装Apache和MySQL好的多。

3.1ab测试演示

    我们先主要说一下ab测试的流程,翻译一些常用参数,以及指示性能的参数:

//多进程测试
let cluster = require("cluster");
let http = require("http");
let CPUNum = require("os").cpus().length;//获取CPU的核数
if (cluster.isMaster) {
    for (let i = 0; i < CPUNum; i++) {
        cluster.fork();
    }
    cluster.on("exit", (worker, code, signal) => {
        console.log("进程消亡:", worker, code, signal)
    })
} else {
    http.createServer((req, res) => {
        res.end('hello world\n');
    }).listen(8000, () => {
        console.log("localhost:8000");
    });
}

对于电脑的CPU核数也可以利用任务管理器查看:
在这里插入图片描述
好直接测试,cmd中输入(如果提示ab不是内部指令那就是Apache的环境变量没有配置好):

ab -c 20 -n 100 http://127.0.0.1:8000/

参数说明:由于ab测试需要拿到一个平均值,因此,会进行多次测试取平均结果:
(1)-c表示的是并发请求;
(2)-n表示的是ab测试的次数;
(3)后面的就是测试的站点的接口了,注意最后的/不能少;
(4)还有一些常用参数,-p post请求提交的文件数据,-w以html表格的形式输出结果(估计测试岗狂喜),-t测试的总时间,默认是50000s,其他的可以看看英文提示。
结果的参数说明:
在这里插入图片描述
验证cluster的多进程优化效果,直接使用10000并发测试:
在这里插入图片描述

3.node的多进程

    其实ab测试只是引子,主要是为了看看cluster配置多进程的有点,但是这个显然不是我们想要的,在爬虫上,我们是请求者,不是服务提供者。因此还需要进一步探究子进程相关内容。
    nodejs实现多进程有如下几种常用的方式:
(1)spawn: 启动一个子进程来执行命令;
(2)exec: 启动一个子进程来执行命令,与 spawn 不同的是,它有一个回调函数获知子进程的状况;
(3)execFile: 启动一个子进程来执行可执行文件;
(4)fork: 与 spawn 类似,不同点在于它创建 Node 的子进程只需指定要执行的 JavaScript 文件模块即可;
基本使用如下:
在这里插入图片描述
四种构建子进程方法的区别如下:
在这里插入图片描述
综合考虑下,execFile算是比较良好的,nodejs里面的异常处理相当重要。既然是父子进程,少不了探究它们之间的通信原理,其实通过查阅源码可以发现子进程继承了EventEmitter类:
在这里插入图片描述
借助于EventEmitter对象,常用的方法如下:
(1)close 事件:子进程的 stdio 流关闭时触发;
(2)disconnect 事件:事件在父进程手动调用 child.disconnect 函数时触发;
(3)error 事件:产生错误时会触发;
(4)exit 事件:子进程自行退出时触发;
(5)message 事件:它在子进程使用 process.send() 函数来传递消息时触发;
    需要进一步说明的是这里的send方法并不是基于eventEmitter,而是基于管道通信实现的,具体实现细节由 libuv 实现,相信背过考研IO发展流程的友友们应该对管道通信不陌生。

// 父进程
const child = fork('.test.js');
child.on('message', (m)=>{
  console.log('message from child: ' + JSON.stringify(m));
});
child.send({data: '父进程发送的消息'});

// 子进程
process.on('message', function(m){
  console.log('来自父进程的消息: ' + JSON.stringify(m));
});
process.send({data: "来自子进程的消息"});

4.node多进程的应用思路

    怎么在实际中使用呢?首先基于上面父子进程的通信,我们可以让每一个子进程执行完毕之后,向父进程发送消息提示父进程根据当前任务的分派情况分发最新的任务,这样子进程就能够一直处于工作状态了。比如首先通过一些接口获取有效的文章的id信息,存储到数据库(没错只需要id,别的信息暂时不需要管,不然会影响处理速度甚至会使程序崩溃),接下来从数据库中读取id信息,然后交给子进程处理,子进程处理完了再分配新的任务,一般子进程的数量设置为CPU的核数。
    守护进程,虽然理论上上面的处理方法挺好,但是子进程难免会由于网络或者第三方拦截等原因崩溃。我们可以利用回调函数或者父子进程之间的监听机制,如果子进程崩溃了,那么再新建一个子进程,保证内部总有固定数量的进程处于运行中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nodejs性能优化——多进程 的相关文章

  • 为什么我的 PHP 脚本无法对其创建的文件进行 chmod?

    我有一个 php 创建一个需要可执行的文件 它是一个需要由系统运行的批处理文件 由于某种原因 即使该文件归 apache 所有并且 php 作为 apache 运行 并且创建了该文件 该脚本还是在 chmod 行处终止 我需要进行哪些不同配
  • 使用 WSGI 在 Windows XAMPP 中设置 Python 路径

    我正在 Webfaction 上设置实时服务器的开发版本 在本地计算机上的虚拟 Apache 服务器环境 运行没有任何错误 中运行 Django 应用程序 XP 使用 Python 2 6 运行 XAMPP Lite 我可以提交更改通过 G
  • 如何将“X-Content-Type-Options: nosniff”添加到我的网络服务器的所有响应标头中

    我正在运行一个 apache 网络服务器 我想将 X Content Type Options nosniff 添加到来自我的网络服务器的所有响应标头 我怎样才能做到这一点 是否可以通过更改 apache 配置文件来实现此目的 确保 mod
  • AH10411 错误:在 apache mod_rewrite 中管理空格和 %20

    我今天更新了 Apache 到 2 4 56 1 并且加载了 htaccess过去有效的重写现在出现了 AH10411 错误 与查询中的空格有关 我正在努力寻找 适当 的解决方案 用户单击一个链接 例如 a href FISH 20J123
  • 如何在MAMP中设置环境变量?

    如何在 MAMP 版本 3 3 中设置环境变量 我可以在我的 PHP 应用程序中使用它 我已经更新了 Applications MAMP Library bin envvars and envvars std file并添加以下行 Lice
  • 显式删除会话cookie会产生什么影响?

    我使用 php session 来维护用户的会话 Session 在登录后创建 在注销或超时后销毁 我需要管理面板中的一个选项来强制注销任何用户 如果他在网站上处于活动状态 我怎样才能做到这一点 我正在考虑删除临时会话文件 这应该有效地破坏
  • 如何让Apache服务index.php而不是index.html?

    如果我将以下行放入index html文件 使 Apache 包含index php file 参观index html页面向我显示了这个 这是为什么 为什么它实际上不包含 PHP 文件 正如其他人指出的那样 您很可能没有 html设置为处
  • 客户端浏览器关闭时服务器端 Perl CGI 脚本中断

    我已经尝试解决一个小问题很长一段时间了 但似乎我无法解决 我编写了一个 HTML 页面 它在提交表单时调用 perl CGI 脚本 该 CGI 在服务器端执行一定数量的任务 我让脚本将这些任务的步骤打印到 HTML 页面上的 iframe
  • XHR 不起作用,因为“Access-Control-Allow-Origin 不允许来源”

    我正在使用 Rails 3 开发一个 API 服务器 到目前为止 它非常方便 但我一直遇到错误 我不确定这是因为我的 Apache 设置还是 Rails 应用程序 当我尝试执行 HTTP DELETE 或 PUT 请求时http sampl
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car
  • CodeIgniter 项目给出 303/压缩错误

    尝试设置一个基于 CodeIgniter 的项目进行本地开发 LAMP 堆栈 并且一旦更新了所有配置文件 这意味着我成功地为 CodeIgniter 生成了有意义的引导错误 我在浏览器中收到此错误 Chrome Error 330 net
  • PHP Github Pull 脚本错误“权限被拒绝(公钥)”

    我已经设置了一个 PHP 脚本来执行 GitHub 拉取 这包含在我的 Github 文件夹中 home mysite public html github github pull php 我的服务器已经有 SSH 公钥 就像我执行git
  • Centos 与 Plesk11.x

    我正在使用 Centos 和 Plesk 11 x 以及这篇文章如何获取 RHL 的 Apache mod jk 连接器 https stackoverflow com questions 33381933 how to obtain ap
  • 向 .htaccess 添加 HTTP 严格传输安全

    我想将 HTTP 严格传输安全指令添加到我的 htaccess 文件中 我已在此处的代码末尾添加了锁 但是当我测试测试 HSTS 预加载过程时 它显示设置未设置 我检查了 Apache 配置并看到 headers 模块已启用 我缺少什么
  • 编辑/更改服务器上的 300 多项选择

    我编辑了所有服务器 http 状态消息 当我输入错误的地址时 300 个多项选择仍然显示 所以它向我显示选项 你知道我怎样才能摆脱它吗 我不希望用户有选择 我想重定向到 index html 或者我想显示自己创建的带有 gt 返回 的消息页
  • 在浏览器中读取wsdl文件

    当我尝试在浏览器中打开 WSDL 文件 http localhost something file wsdl 时 我被提议下载该文件 但我希望能够在浏览器中以 XML 字符串 形式查看 而不是下载 谢谢 如果您的服务器未发送 WSDL 文件
  • php7ts.dll 无法加载到服务器

    今天我已经安装了php7 但是当我重新启动apache时 它无法启动 尽管我再次编辑了httpd xampp conf文件到配置php7 无论如何我去了C xampp并运行apache start bat 然后我看到以下错误 Apache
  • htaccess“命令”拒绝、允许、拒绝

    我只想允许一个国家 地区访问 但排除该国家 地区内的代理 这就是我所拥有的 为了方便起见缩短版本
  • 如何使用 apache2 和 mod_proxy_fcgi 禁用缓冲?

    我在 debian Jessie 上使用 mod proxy fcgi 和 apache 2 4 以及我的 C 应用程序 该应用程序使用 libfcgipp 执行 ServerSentEvents 我的问题是 apache 仍然缓冲我的响应
  • 致命错误 - 未找到“Mongo”类

    我正在尝试执行此操作 但我收到以下错误 致命错误 在 C wamp www 中找不到类 Mongo Info PHP 5 38 MongoDB mongodb win32 i386 2 0 2 MongoDB PHP 驱动程序 mongo

随机推荐

  • C++ cout << “\n“与 cout << endl的一个区别

    一句话概括 n 不会终止setw的计算 endl会 实际场景 代码1 include
  • MySQL必知必会 学习笔记 第十八章 全文本搜索

    并非所有引擎都支持全文本搜索 MyISAM支持 更新 1 MySQL 5 6 以前的版本 只有 MyISAM 存储引擎支持全文索引 2 MySQL 5 6 及以后的版本 MyISAM 和 InnoDB 存储引擎均支持全文索引 3 只有字段的
  • idea自定义注释模板方法名、参数、返回类型为空的问题

    重点的地方 在你的方法上输入 然后加上模板的名称 param和retrun才不会为空 如果你直接模板的名称 按键就会为空 https blog csdn net weixin 39591795 article details 7884442
  • 如何给Winform 的Panel控件添加滚动条

    真是太笨了 刚想起来 Panel控件还有一个AutoScoll属性 直接修改为true即可 添加Panel控件的如下两个事件即可 当然 只是添加的竖向滚动条 横向滚动条只需把VerticalScroll改为HorizontalScroll即
  • linux进阶-运维自动化工具之ansible

    文章目录 云计算运维工程师核心职能 ansible特性 ansible架构 ansible组成部分 ansible命令执行来源 ansible使用注意事项 ansible安装和入门 epel源的rpm包安装 编译安装 git方式 pip安装
  • ConvertException: Unsupported source type: class java.lang.String

    项目上遇到 文件异步上传时会把不符合标准的数据放入redis 然后隔几秒去请求redis里面的数据 但是时不时会出现ConvertException Unsupported source type class java lang Strin
  • tensorflow报错总结

    项目场景 tensorflow 版本 不兼容产生的报错 问题描述 1 AttributeError module tensorflow has no attribute random uniform 解决办法 tf2 0中用tf rando
  • 使用rancher在k8s上完成第一个CI/CD的项目_.NET篇

    隔了几天没写了 一是忙的不行 二是遇到一个问题一直没解决 我们自己搭建的harbor仓库是没有域名的 也没做nginx转发 所以都是http请求的 构建项目时会在两个地方遇到关于docker访问http仓库不通的问题 第一个 构建成功pus
  • Hadoop集群——shell自动采集文件到HDFS

    1 配置环境变量 在 export data logs目录下 目录不存在 则先提前创建该目录 使用vi命令创建 upload2HDFS sh脚本文件 在编写Shell脚本时 需要设置Java环境变量 即使当前虚拟 机节点已经配置了Java环
  • windows10下navicat 无限使用小技巧

    windows10下navicat 无限次使用小技巧 1 首先win R 输入regedit 2 找到HKEY CURRENT USER gt Software gt Classes gt CLSID gt 下面文件夹中有info的删除掉
  • 如何从巨潮资讯爬取股票公告

    z如何做一个难以被反制的爬虫 Selenium Python爬取新股材料实例 之前我写了上面这篇文章来说明如何从深交所或者上交所的网站爬取文件 但是这个爬虫是有点不稳定的 因为网速的原因 偶然间我发现巨潮资讯已经整合了所需要的公告 因此又写
  • tomcat常见报错

    1 Web页面乱码 解决方案 1 可以采用英文输出 只需要配置启动参数即可 2 确认项目编码都设置为UTF 8后 在StringManager java 134行后 增加一行代码 str new String str getBytes St
  • PAT 乙级 1057 数零壹 python

    题目 思路 先判断是否为字母 再求和 通过迭代取余 计算0 1的数目 代码 alpha a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17
  • 蓝桥杯题库 历届试题部分(C++、Java)代码实现(16-30)

    文章目录 五 历届试题 PREV 16 农场阳光 PREV 17 约数倍数选卡片 PREV 18 车轮轴迹 PREV 19 九宫重排 PREV 20 公式求值 PREV 21 回文数字 PREV 22 国王的烦恼 PREV 23 数字游戏
  • flutter toast插件 OKToast的介绍

    OKToast 是一款 在 flutter 上 使用的 toast 插件 使用简单 可定制性强 纯 flutter 调用不用 context 文章目录 安装 使用 在代码中定义 OKToast 组件 调用 文本 toast 自定义 widg
  • Centos7安装redis(详细步骤)

    一 安装redis 1 yum安装redis yum install redis 2 启动redis 启动redis service redis start 停止redis service redis stop 查看redis运行状态 se
  • c++栈详解(附代码)

    1 栈 Stack 是一种线性存储结构 它具有如下特点 1 栈中的数据元素遵守 先进后出 First In Last Out 的原则 简称FILO结构 后进先出的叫法 也是可以的 2 限定只能在栈顶进行插入和删除操作 2 栈的相关概念 1
  • CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解

    feature map 卷积核 卷积核个数 filter channel的概念解释 feather map的理解 在cnn的每个卷积层 数据都是以三维形式存在的 你可以把它看成许多个二维图片叠在一起 像豆腐皮一样 其中每一个称为一个feat
  • 使用WTGAHRS2(JY-GPSIMU)在ROS中读取数据并发布话题

    目录 IMU简介 驱动程序 IMU串口通信协议 程序 效果 IMU简介 十轴惯性导航传感器WTGAHRS2传感器集成高精度的陀螺仪 加速度计 地磁场传感器 GPS 模块 采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法 能够快速求
  • nodejs性能优化——多进程

    1 引言 现在在准备毕设 打算还是使用nodejs作为后端 遇到了一些知识上的瓶颈 主要是想要写出一个高性能点的爬虫 由于每次请求的http数量上万 经常挂了 要么是他人的服务器终止了连接 要么是node经不起密集CPU 毕竟请求完成之后还