为什么增加 Nginx 中的worker_connections 会使应用程序在node.js 集群中变慢?

2024-01-03

我正在将我的应用程序转换为 Node.js 集群,我希望它能够提高我的应用程序的性能。

目前,我正在将该应用程序部署到 2 个 EC2 t2.medium 实例。我有 Nginx 作为代理和 ELB。

这是我的 Express 集群应用程序,从文档来看它是相当标准的。

var bodyParser = require('body-parser');
var cors = require('cors');
var cluster = require('cluster');
var debug = require('debug')('expressapp');

if(cluster.isMaster) {
  var numWorkers = require('os').cpus().length;
  debug('Master cluster setting up ' + numWorkers + ' workers');

  for(var i = 0; i < numWorkers; i++) {
    cluster.fork();
  }

  cluster.on('online', function(worker) {
    debug('Worker ' + worker.process.pid + ' is online');
  });

  cluster.on('exit', function(worker, code, signal) {
    debug('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
    debug('Starting a new worker');
    cluster.fork();  
  });
} else {
  // Express stuff
}

这是我的 Nginx 配置。

nginx::worker_processes: "%{::processorcount}"
nginx::worker_connections: '1024'
nginx::keepalive_timeout: '65'

我的 Nginx 服务器上有 2 个 CPU。

这是我之前的表现。

我每秒收到 1,500 个请求,这非常好。现在我想增加 Nginx 上的连接数,这样我就可以接受更多请求。我做这个。

nginx::worker_processes: "%{::processorcount}"
nginx::worker_connections: '2048'
nginx::keepalive_timeout: '65'

这是我的表演后的表现。

我认为这比以前更糟糕。

我使用加特林进行性能测试,这是代码。

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._

class LoadTestSparrowCapture extends Simulation {
  val httpConf = http
    .baseURL("http://ELB")
    .acceptHeader("application/json")
    .doNotTrackHeader("1")
    .acceptLanguageHeader("en-US,en;q=0.5")
    .acceptEncodingHeader("gzip, defalt")
    .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")

    val headers_10 = Map("Content-Type" -> "application/json")

    val scn = scenario("Load Test")
      .exec(http("request_1")
        .get("/track"))

    setUp(
      scn.inject(
        atOnceUsers(15000)
      ).protocols(httpConf))
}

我将其部署到我的加特林集群中。因此,我有 3 个 EC2 实例在 30 秒内向我的应用程序发出了 15,000 个请求。

问题是,我可以做些什么来提高应用程序的性能,还是我只需要添加更多机器?

我正在测试的路线非常简单,我收到请求并将其发送到 RabbitMQ,以便可以进一步处理。所以,该路线的响应速度相当快。


您已经提到您正在使用 AWS,并且在 ELB 中的 EC2 实例前面。据我所知,您收到了 502 和 503 状态代码。这些可以从 ELB 或您的 EC2 实例发送。确保在进行负载测试时您知道错误来自何处。您可以在 ELB 的 AWS 控制台中检查这一点CloudWatch 指标 http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-cloudwatch-metrics.html.

基本上HTTPCode_ELB_5XX意味着您的 ELB 发送了 50 次。在另一方面HTTPCode_Backend_5XX发送了 50 倍。您还可以在ELB的日志中验证这一点。你可以找到更好的 ELB 错误解释here http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ts-elb-error-message.html.

要在 AWS 上进行负载测试,您一定应该阅读this http://aws.amazon.com/articles/1636185810492479。重点是,ELB 只是另一组机器,如果负载增加,它就需要扩展。默认扩展策略是(引自“加速测试”部分):

一旦有了测试工具,您将需要定义负载的增长。我们建议您每五分钟增加负载的速度不超过 50%。

这意味着当您开始使用一定数量的并发用户(假设为 1000 个)时,默认情况下您应该在 5 分钟内仅增加到 1500 个。这将保证 ELB 将根据服务器上的负载进行扩展。确切的数字可能会有所不同,您必须自行测试。上次我测试了它持续负载 1200 请求/秒,没有出现问题,然后我开始接收 50 倍负载。您可以轻松地测试它,从单个客户端运行从 X 到 Y 个用户的启动场景并等待 50 倍。

接下来非常重要的事情(来自“DNS解析”部分)是:

如果客户端没有至少每分钟重新解析一次 DNS,则客户端将不会使用 Elastic Load Balancing 添加到 DNS 的新资源。

简而言之,这意味着您必须保证 DNS 中的 TTL 得到尊重,或者您的客户端重新解析并轮换通过 DNS 查找收到的 DNS IP,以保证以循环方式分配负载。如果不是(例如,仅从一个客户端进行测试,而不是您的情况),您可以通过将所有流量仅定位到一个实例来使 ELB 的一个实例超载,从而使结果出现偏差。这意味着 ELB 根本无法扩展。

希望它会有所帮助。

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

为什么增加 Nginx 中的worker_connections 会使应用程序在node.js 集群中变慢? 的相关文章

  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • Plesk Windows 部署 Node.js

    我创建了一个以 Node js 作为后端的 Angular 项目 这是服务器文件结构 Home directory httpdocs node hm dist browser folder server folder server js p
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • 具有 Firebase (FCM) 推送通知的 Node js

    我正在使用 Node js 开发 REST api 并且有一个休息端点来发送 firebase 推送通知 我的代码如下 const bodyParser require body parser var cors require cors v
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 在为 RXJS 可观察量编写测试时,如何避免让调度程序通过我的业务逻辑?

    我发现使某些测试通过的唯一方法是显式地将调度程序传递给函数 为了便于说明 请考虑以下函数 function doStuff stream return stream delay 100 filter x gt x 2 0 map x gt
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • 流星内存不足

    我正在使用流星来制作报废引擎 我必须执行一个 HTTP GET 请求 这会向我发送一个 xml 但这个 xml 大于 400 ko 我得到一个异常 内存不足 result Meteor http get http SomeUrl com 致
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • 将 javascript 整数转换为字节数组并返回

    function intFromBytes x var val 0 for var i 0 i lt x length i val x i if i lt x length 1 val val lt lt 8 return val func
  • Twitter 嵌入时间轴小部件

    我继续下载http platform twitter com widgets js http platform twitter com widgets js And the http platform twitter com embed t
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • 使用异步调用时如何从 javascript 更新元刷新?

    我有一个系统 它使用元刷新来注销页面 该系统会在空闲用户后进行清理 不用担心 服务器也会导致会话超时 我开始通过 ajax 进行一些操作 不是真正的 xml 但这不是重点 我可以运行从异步请求返回的javascript 所以我想知道是否可以
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗
  • NGinx $proxy_add_x_forwarded_for 和 real_ip_header

    我在 NGinx 下有一个 web 应用程序和另一个前端负载均衡器 如下所示 x x x x IP 地址 客户端 a a a a gt LB b b b b gt NGX c c c c gt WEBAPP d d d d 这是我的 NGi

随机推荐

  • 角度附加组件到各个选项卡

    我正在尝试使用角度材料将组件 动态创建 附加到相应的选项卡 viewChild但只有当我单击第二个选项卡中的按钮时 它才会转到第一个选项卡 Here is Stackblitz 角度附加组件到各自的选项卡 https stackblitz
  • 在 Objective-C 中,如何从类别访问私有属性

    我想从类的类别中访问该类的私有属性 但要访问私有财产 我必须在类别中重新声明相同的私有财产 如果我不重新声明 我会收到编译错误 Property
  • 使用 Commons Multiparthttpservlet 解析器上传文件

    我在 Spring Boot 中做了一个服务 在 Reactjs 中做了前端 但我的服务没有提供任何东西 没有结果 我正在上传带有文件图像或音频的表单数据 但我的休息服务没有收到任何文件 我的服务等级 CrossOrigin Request
  • C#:传递通用对象

    我想要一个通用的打印功能 PrintGeneric T 在以下情况下 我缺少什么 一如既往 感谢您的帮助 见解 public interface ITest public class MyClass1 ITest public string
  • Visual Studio - 从元数据查看类型

    我记得在以前安装的 Visual Studio 中 当我对当前解决方案中不存在的类型使用 转到定义 选项时 它会显示一个选项卡 显示从元数据反映的类型 我当前的安装直接进入对象浏览器 我更喜欢看到元数据版本 有没有什么方法可以选择默认行为
  • 将 Swift 字典转换为 NSDictionary

    我创建了一个 Swift Dictionary 对象 var params first name firstNameTextField text last name lastNameTextField text company compan
  • 如何替换回车符

    我有一个变量 myClass 0 gt comment 其中有回车符 我想将该变量中的所有回车替换为 n 我怎样才能做到这一点 下面可能会有所帮助 myClass 0 gt comment 这是一些输出 输出 array 0 gt stri
  • 使用 React Router 在页面的某个部分内导航

    我的导航栏包含以下内容 Home About Login Home is 具有多个部分的垂直滚动页面 e g About和其他部分 虽然登录是单独的反应组件 它被渲染在 login route 这是我的route js file
  • 如何强制 SDL_Init() 失败?

    有没有可靠的方法SDL Init 在测试用例中使用失败 我认为您可以通过不包含 SDL 动态链接库 SDL dll 来强制它失败
  • 忽略“检测到源架构漂移”错误,继续更新

    我在 Visual Studio 2017 中有一个 SQL 项目 我正在使用 SSDT 从 SQL 数据库更新我的项目 如下所示 通常 我用作源的数据库正在发生变化 通常以小且不相关的方式 当发生这种情况时 我无法更新我的项目 我得到 c
  • 如何在 Laravel 5 中删除会话

    我正在尝试删除基本会话 但它没有删除 这是代码 欢迎 blade php if Session has key Session get key a href logout Sign Out a else please signin endi
  • 如何使用streamreader以当前编码读取byte[]

    我想读byte 使用 C 和文件的当前编码 正如 MSDN 中所写 当构造函数没有编码时 默认编码将为 UTF 8 var reader new StreamReader new MemoryStream data 我也尝试过 但仍然以 U
  • mysql_insert_id() 返回 0

    我知道有很多主题具有相同的标题 但主要是查询插入到了错误的位置 但我认为我的定位是正确的 所以问题是 即使数据插入到数据库中 我仍然得到 0 有人知道我可能错的答案吗 这是我的代码 mysql query SET NAMES utf8 th
  • 如何在 Visual Studio Team Services 中的托管代理上查找 Android SDK 的位置?

    我想在 VSTS 中的托管构建代理上构建我的 android 项目 因此 我创建了一个 Android 构建定义 将其在 托管 Linux 预览 代理上排队 但我的构建失败并出现以下错误 未找到 SDK 位置 使用 sdk dir 定义位置
  • 如何在没有 FlexBuilder 的情况下将 Cairngorm 的 SWC 文件添加到我的应用程序中?

    我没有使用 FlexBuilder 我使用的是免费的 Flex SDKTextMate http macromates com 我有点不明白什么这个FlexBuilder进程 http nwebb co uk blog p 58实际上 在所
  • 如何在 F# 交互中使用断点?

    我已经开始使用 VS2010 和 F 交互式研究算法中的一些想法 所以 我创建了一个DebugScript fsx 我在那里编写了一些代码 并最终将其发送到 F Int 进行测试 有时我需要捕捉一个错误 但即使是简单的我也无法放置断点for
  • 将背景图像叠加到背景颜色上

    我的网站 http www webbuddies co za http www webbuddies co za 工作完美 但是当以 1280x1024 分辨率查看时 页面底部有一点可见的白色 我想去掉它 背景是渐变图像 我只想更改背景颜色
  • 如何将 TextBlock 设置为属性值?

    I used this http www c sharpcorner com uploadfile mahesh user control in wpf 构建自定义控件的教程 现在 我想向用户控件添加一条简单的消息 文本块 来为用户提供一些
  • 禁用 mongo docker 中的默认身份验证

    我想禁用默认身份验证 避免使用 mongo authenticationDatabase auth db 在 mongo 中使用 docker compose 这是我的docker 撰写 file version 2 services mo
  • 为什么增加 Nginx 中的worker_connections 会使应用程序在node.js 集群中变慢?

    我正在将我的应用程序转换为 Node js 集群 我希望它能够提高我的应用程序的性能 目前 我正在将该应用程序部署到 2 个 EC2 t2 medium 实例 我有 Nginx 作为代理和 ELB 这是我的 Express 集群应用程序 从