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

Posted

技术标签:

【中文标题】提高 Node JS 服务器应用程序吞吐量的步骤【英文标题】:Steps to improve throughput of Node JS server application 【发布时间】: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 我愿意接受您的回复作为答案,但这是一条评论。还能以某种方式完成吗? 【参考方案1】:

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

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

tomcat 通常会因为它的每个请求线程模型而更好吗?

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

我忘了提到对于 http,我们使用的是 express 而不是 node 提供的原生 http。希望它不会给请求处理带来开销?

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

【讨论】:

非常感谢,我会在练习完成后回复我们的发现【参考方案2】:

正如jfriend所说,你需要找到瓶颈, 您可以尝试的一件事是通过使用套接字传递 json 尤其是这个库 https://github.com/uNetworking/uWebSockets 来减少带宽/吞吐量。 主要原因是 http 请求比套接字连接重得多。

很好的例子:https://webcheerz.com/one-million-requests-per-second-node-js/

最后你也可以通过 (http gzip) 或第三方模块压缩 json。

锻炼体重^^

希望对你有帮助!

【讨论】:

感谢指向 websockets 的指针。事实上,我们正在考虑使用 MQTT。也会检查压缩选项。

以上是关于提高 Node JS 服务器应用程序吞吐量的步骤的主要内容,如果未能解决你的问题,请参考以下文章

如何创建高性能可扩展的Node.js应用?

Node.js初识

Node.js 框架简介

springboot应用如何提高服务吞吐量

5个提高Node.js应用性能的技巧

使用 node js 配置本地服务器