node.js - 提高 Node JS 服务器应用程序吞吐量的步骤

标签 node.js nginx throughput node-cluster

我有一个非常简单的 Nodejs 应用程序,它通过 POST 请求正文接受 json 数据(大约 1KB)。响应立即发送回客户端,并将 json 异步发布到 Apache Kafka 队列。同时请求的数量可以高达每秒 10000 个,我们使用在三台不同机器上运行的 Apache Jmeter 进行模拟。目标是实现平均吞吐量低于一秒且没有失败的请求。

在 4 核计算机上,应用程序每秒可处理多达 4015 个请求,不会出现任何故障。但是,由于目标是每秒 10000 个请求,因此我们在集群环境中部署了 Node 应用程序。

同一台机器中的集群和两台不同机器之间的集群(如here所述)均已实现。 Nginx 被用作负载均衡器来循环两个 Node 实例之间的传入请求。我们预计吞吐量会显着提高(如记录的 here ),但结果恰恰相反。 成功请求数下降至每秒 3100 个请求左右。

我的问题是:

  1. 集群方法可能出了什么问题?
  2. 这是否是提高 Node 应用程序吞吐量的正确方法?
  3. 我们还在 Tomcat 容器中使用 Java Web 应用程序进行了类似的练习,它按预期执行了 4000 个请求 单实例,集群中大约 5000 个成功请求 有两个实例。这与我们的信念相矛盾 Nodejs 的性能比 Tomcat 更好。 tomcat一般比较好 因为它的每个请求线程模型?

提前非常感谢。

最佳答案

根据您的要求,我会将我的评论放入答案中:

集群通常是正确的方法,但它是否有帮助取决于您的瓶颈在哪里。您需要进行一些测量和实验来确定这一点。如果您受 CPU 限制并在多核计算机上运行,​​那么集群应该会有很大帮助。我想知道你的瓶颈是否是 CPU 之外的其他东西,例如网络或其他共享 I/O 甚至 Nginx?如果是这种情况,那么您需要先解决这个问题,然后才能看到集群的好处。

Is tomcat generally better because of its thread per request model?

没有。这不是一个很好的概括。如果您受 CPU 限制,那么线程可以提供帮助(使用 Nodejs 进行集群也可以)。但是,如果你受 I/O 限制,那么线程通常比 Nodejs 等异步 I/O 更昂贵,因为线程本身的资源开销以及线程之间上下文切换的开销。许多应用程序都受 I/O 限制,这也是 Node.js 成为服务器设计非常好的选择的原因之一。

I forgot to mention that for http, we are using express instead of the native http provided by node. Hope it does not introduce an overhead to the request handling?

Express 非常高效,不应成为您任何问题的根源。

关于node.js - 提高 Node JS 服务器应用程序吞吐量的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44773214/

相关文章:

wcf - 为什么当我添加更多计算机时,我的 Azure 托管 WCF 服务无法扩展?

javascript - 请求结束后nodejs写入错误

node.js - 在 Nodejs 上使用 mtp 连接从设备读取/复制文件

PHP_SELF 返回/index.php/index.php

Spring Boot 2 tomcat ssl握手缓存

nginx - try_files 与 NGINX 中的空位置 block ?

javascript - 如何使用 React 或 Angular 创建仅在需要时加载的可重用画廊

javascript - 使用 multer 上传文件时 Node.js 连接重置

c++ - _mm256_setr_epi32() 的延迟和吞吐量

io - Erlang消费者队列