【问题标题】:Single threaded Node.js on a multi core CPU vs Java (Tomcat)多核 CPU 上的单线程 Node.js 与 Java(Tomcat)
【发布时间】:2017-03-07 15:49:30
【问题描述】:

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

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

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

【问题讨论】:

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

标签: java node.js multithreading tomcat


【解决方案1】:

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

假设您不派生任何子进程,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 核?

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2011-12-24
      • 2012-01-24
      相关资源
      最近更新 更多