【问题标题】:Optimizing Node.js inbound/outbound connections优化 Node.js 入站/出站连接
【发布时间】:2013-06-09 17:05:20
【问题描述】:

我对 node.js 入站/出站连接有疑问。 让我们考虑一下我的情况或我想要实现的目标:

例如,我每秒有 X 个入站 http 请求。 对于每个请求,我都会向某个第三方创建出站 https 请求(他们平均在 300 毫秒内回复我)。当我收到该第三方的回复时,我认为此请求已得到处理。让我们想象一下第三方有很多很多的服务器,并且可以并行管理请求。 对于每个请求,我都有很少的 mongoDB 查询(速度很快)。 我使用 express 框架。

在我的笔记本电脑中(4 核和 4 GB RAM,装有 Windows 和许多其他可能会损害性能的程序)我每秒能够收到 150 个请求,但只处理了 40 个。

我不知道的是:这真的是现实吗?理论上我无法取得更多成就,或者在这个宇宙的某个地方有一些解决方案/技巧可以提高我的表现?

感谢您的任何建议。

【问题讨论】:

    标签: performance node.js http express connection


    【解决方案1】:

    对于节点,您可以针对这种类型的场景进行非常简单的优化,那就是创建一个工作池。由于 v8 引擎的工作方式,以及节点如何使用事件循环等……单个节点进程实际上只能希望使用处理器内核的 50% 左右。假设一个相对标准的事件循环(不是大量的同步工作要做),您的描述似乎是典型的文件服务器(大量 I/O,但很少有处理器繁重的操作),您可以通过启动获得显着的性能提升许多节点工作者。这可以最大限度地减少您的一个节点进程未侦听事件的时间,并最大限度地提高 CPU 的工作量。当然,这不会加速单个事务,但它将允许单个硬件设置最大化它一次可以服务的事务量。

    https://github.com/isaacs/cluster-master

    Cluster-master 是一个方便的工具,用于管理工作人员,并保持创建工作人员池的过程稳定和简单,我相信可以与 NPM 一起安装。

    编辑:

    什么可以运行异步,什么必须运行同步并不总是很容易分辨。需要注意的一些经验法则:

    • 名称中带有同步的节点/库调用...

    • 大型函数,很少调用其他函数。

    • 忙碌的while循环

    一些替代方案:

    如果您有一个无法避免的繁忙 while 循环。你可以做一些很酷的逻辑,至少让你的事件循环时间抓住新的事件。这可能不是很有效的代码(不是在带有节点的电脑上),但它应该演示这个概念:

    var someInt;
    function callBack() {
        doWorkWith(someInt);
        someInt++;
        if(someInt < someMaximum) event.trigger(whileLoop);//The entire event loop will be able to run before we get to the next iteration of callback because we're using events!
    }
    
    event.register(whileLoop, callBack);
    

    我不记得在 node 中注册事件的代码,但是当你需要 while 循环时,这个逻辑很有用,因为它允许你的整个事件循环在每次迭代时运行,其中:

    while(someInt++ < someMax) {
        doWorkWith(someInt);
    }
    

    当 while 循环运行时,不会让任何其他事件被拾取。

    另一个需要注意的是库程序员的不良做法,尤其是 I/O 库。除非您有机会查看代码,或者对某个库有非常积极的评价,否则请假设您对任何库调用的情况更糟,并调查它们是否是问题的根源。

    【讨论】:

    • 对不起,我没有提到我已经使用了工人。为了提高绩效,我将工人分成两组。前 2 个工作人员正在接收请求和 1 个数据库查询,第二个 2 个工作人员正在从第三方请求/接收并进行 2 个数据库查询。
    • 如果你有 4 个核心,我建议你可能没有足够的工人。做一些 CPU 分析...这当然取决于您的应用程序,但在我的应用程序中,我的节点进程在处理器达到 40% 之前在负载测试下崩溃,因为我没有足够的工人。
    • hm ...通常人们说你应该让工人作为CPU核心的数量。进行负载测试时,我的 CPU 达到 >90%。我也不明白为什么你写的节点进程只使用 40% 的 CPU? ...我肯定会尝试更多的工人,但我认为我的问题是连接太多。此外,如果我必须等待 300 毫秒才能得到第三方连接的响应,那么它们就会一直出现:/
    • 我可以说您的问题不仅仅是基于连接数。人们使用节点每秒为数千个连接提供服务的场景有据可查。这可能是您的特定过程需要做太多工作,但这是一个更深层次的问题,然后只是“连接数”。 Workers=cpu cores 是一个很好的开始,但不一定总是最佳的,当然取决于您在事件循环中所做的工作类型。如果不查看您的代码,我只能推测您有一个大型同步调用会减慢您的事件循环。
    • 我之前听说这个同步调用会减慢进程,但不明白这是什么意思。我实际上正在构建一个推送通知“代理”,它将推送通知发送到谷歌和苹果云。在处理一个通知时,我必须有同步步骤,因为我必须在数据库中编写一些东西并在结果之后继续,但是在代码的每一部分中我都使用回调,所以它实际上是 asinc ......也许代码中有一些丑陋的部分正在阻塞进程,但我不知道如何找到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多