多核CPU上的单线程Node.js与Java(Tomcat)

时间:2016-10-25 14:25:38

标签: java node.js multithreading tomcat

由于Node.js是单线程的,如果我运行的应用程序没有任何涉及Node.js的IO,即使它在8核CPU机器上运行,它也总是只使用一个CPU核心?

假设我有一个服务返回在Node上运行的两个数字的总和,并且有1000个请求同时命中该服务(假设服务计算主线程上的总和并且不使用调用回来,因为这是一个简单的任务)。那么,即使有7个内核闲置,Node也一次只能处理一个请求?在Java世界中,如果我在应用服务器Tomcat中将HTTP线程池大小设置为8,则相同的1000个请求将比节点快8倍。

那么我是否必须在8核计算机上运行8个Node.js实例并使用负载平衡器将其运行,以便使用所有8个核心?

2 个答案:

答案 0 :(得分:2)

  

由于Node.js是单线程的,如果我运行的应用程序没有任何涉及Node.js的IO,它是否总是只使用一个CPU核心,即使它在8核CPU机器上运行? / p>

假设您不分叉任何子进程,Node一次最多只使用一个核心,是的,无论有多少核心可用。但是,拥有多个内核会有所帮助,因为这可以减少Node与其他进程之间的争用。

  

即使有7个内核闲置,Node也一次只能处理一个请求?

基本上是的,虽然在实践中,你不可能让所有其他核心闲置。

  

在Java世界中,如果我在应用服务器Tomcat中将HTTP线程池大小设置为8,则相同的1000个请求将比节点快8倍。

仅当Java webapp在与Node相同的时间内处理请求时才会出现这种情况。它是否会这样做取决于很多因素,因此或多或少无法预测。它只能被测量。可以想象,测量webapp vs 的Java实现的性能。同一个webapp的Node实现会发现特定的Java实现比测试条件下的特定的Node实现慢得多。或者不是。

  

那么我是否必须在8核计算机上运行8个Node.js实例并使用负载平衡器将其运行,以便使用所有8个核心?

我确信细节上可能有变化,但基本上是肯定的。

答案 1 :(得分:0)

使用负载均衡器在多个服务器之间分配负载。要在同一服务器上的多个进程中运行Node.js,请使用cluster mode

和您一样,我也想知道这些不同的线程模型在性能方面会产生什么影响,这就是我将investigation引入该主题的原因。我编写了两个功能相同的I / O绑定微服务,一个在Node.js中,另一个在Java / DropWizard中(使用Jetty)。我对两者进行了相同的负载测试,然后捕获了性能数据并比较了结果。

我发现两个微服务的延迟非常相似。吞吐量不同。在没有集群模式的情况下,Node.js服务的吞吐量降低了40%。在集群模式下,Node.js服务的吞吐量降低了16%。