Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多核CPU与Java(Tomcat)上的单线程Node.js_Java_Node.js_Multithreading_Tomcat - Fatal编程技术网

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

多核CPU与Java(Tomcat)上的单线程Node.js,java,node.js,multithreading,tomcat,Java,Node.js,Multithreading,Tomcat,由于Node.js是单线程的,如果我运行的应用程序在Node.js上没有任何IO,那么即使它在8核CPU机器上运行,它是否总是只使用一个CPU核 假设我有一个服务,它在节点上运行,返回两个数字的总和,同时有1000个请求命中该服务(假设该服务在主线程上计算总和,并且不使用回调,因为这是一个简单的任务)。所以,即使有7个内核处于空闲状态,节点一次也只能处理一个请求?在Java世界中,如果我在应用服务器Tomcat中将HTTP线程池大小设置为8,同样的1000个请求的执行速度将是node的8倍 那么

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

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

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

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

假设您不分叉任何子进程,节点一次最多使用一个核心,是的,不管有多少个核心可用。不过,拥有多个核心会有所帮助,因为这样可以减少节点和其他进程之间的争用

所以,即使有7个内核处于空闲状态,节点一次也只能处理一个请求

基本上是的,但在实践中,您不太可能让所有其他内核空闲

在Java世界中,如果我在应用服务器Tomcat中将HTTP线程池大小设置为8,同样的1000个请求的执行速度将是node的8倍

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

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


我确信在细节上可能会有变化,但基本上是这样。

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

和你一样,我也想知道这些不同的线程模型对性能有什么影响,这就是我为什么要在这个主题中进行研究的原因。我编写了两个功能完全相同的I/O绑定微服务,一个在Node.js中,另一个在Java/DropWizard中(使用Jetty)。我在这两个服务器上运行了相同的负载测试,然后捕获了性能数据并比较了结果


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

“如果我在应用服务器Tomcat中将HTTP线程池大小设置为8,那么同样的1000个请求的执行速度将是Node的8倍”-您对此进行了测量,还是这只是猜测?@Gimby,只是猜测,假设两个数字的总和在Java中与Node的时间相同。我忽略了额外线程的成本,因为它们是从池中使用的,对于这种不与其他线程共享任何内容的方法,Java中不需要任何同步。相关: