优化Node.js入站/出站连接

时间:2013-06-13 10:35:57

标签: performance node.js http express connection

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

我每秒有X个入站http请求。 对于每个请求,我都会向某个第三方创建出站https请求(他们平均回复300毫秒)。当我收到第三方的回复时,我会考虑处理此请求。让我们想象第三方有很多很多服务器,可以并行管理请求。 对于每个请求,我都有很少的mongoDB查询(这很快)。 我使用快速框架。

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

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

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

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

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

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

编辑:

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

  • 在名称中使用同步的节点/库调用...

  • 功能强大,几乎无需调用其他功能。

  • 忙碌的循环

一些替代方案:

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

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);

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

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

在while循环运行时,不会接受任何其他事件。

需要注意的另一件事是库程序员的不良做法,特别是I / O库。除非您有机会查看代码,或者对库有积极的评价,否则假设您调用的库调用更糟糕,并调查它们是否是问题的根源。