【发布时间】:2017-11-30 02:09:59
【问题描述】:
我有一个非常简单的 nodejs 应用程序,它通过 POST 请求正文接受 json 数据(大约 1KB)。响应会立即发送回客户端,并且 json 会异步发布到 Apache Kafka 队列。同时请求的数量可以高达每秒 10000 个,我们使用在三台不同机器上运行的 Apache Jmeter 进行模拟。目标是在没有失败请求的情况下实现不到一秒的平均吞吐量。
在 4 核机器上,该应用每秒处理多达 4015 个请求而不会出现任何故障。然而,由于目标是每秒 10000 个请求,我们将节点应用程序部署在集群环境中。
在同一台机器上的集群和两台不同机器之间的集群(如here 所述)都已实现。 Nginx 被用作负载均衡器,以轮询两个节点实例之间的传入请求。我们预计吞吐量会显着提高(如记录的here),但结果恰恰相反。 成功请求的数量下降到每秒约 3100 个请求。
我的问题是:
- 集群方法可能出了什么问题?
- 这是提高 Node 应用程序吞吐量的正确方法吗?
- 我们还对 Tomcat 容器中的 Java Web 应用程序进行了类似的练习,它按预期执行了 4000 个请求 单个实例和集群中大约 5000 个成功请求 有两个实例。这与我们的信念相矛盾 nodejs 的性能优于 Tomcat。是tomcat一般更好吗 因为它的线程每个请求模型?
非常感谢。
【问题讨论】:
-
集群通常是正确的方法,但它是否有帮助取决于你的瓶颈在哪里。您将需要进行一些测量和一些实验来确定这一点。如果您受 CPU 限制并在多核计算机上运行,那么集群应该会有很大帮助。我想知道你的瓶颈是否是除了 CPU 之外的东西,比如网络或其他共享 I/O 甚至 Nginx?如果是这种情况,那么您需要先解决这个问题,然后才能看到集群的好处。
-
tomcat 通常会因为它的每个请求线程模型而更好吗? 不,这不是一个很好的概括。如果您受 CPU 限制,那么线程可以提供帮助(使用 nodejs 进行集群也可以)。但是,如果您受 I/O 限制,那么线程通常比 nodejs 之类的异步 I/O 更昂贵,因为线程本身的资源开销和线程之间的上下文切换开销。
-
@jfriend00 感谢您的意见。我将尝试一次执行此步骤,以查看吞吐量的变化。猜猜这应该给我们一个关于瓶颈在哪里的提示。我忘了提到对于 http,我们使用的是 express 而不是 node 提供的本机 http。希望它不会给请求处理带来开销?如果在其他领域没有突破,将检查。
-
@jfriend00 我愿意接受您的回复作为答案,但这是一条评论。还能以某种方式完成吗?
标签: node.js nginx throughput node-cluster