为了账号安全,请及时绑定邮箱和手机立即绑定

通过使用集群优化Node.js性能(第二篇)

标签:
Node.js

掌握 Node.js 的运行机制
回顾

如果你直接跳到这篇文章,我建议你先阅读前一部分,了解一下聚类对Node.js的影响:阅读前一部分

Node.js性能提升:集群技术入门(第1部分)

如果你刚开始接触 Node.Js,并且想了解 Node.Js 的内部运作,读这篇帖子 文章

本文将专注于上一期中未解决的问题。

1. 有没有比加载/slow和/fast路由之外的其他更实用的方法来测试集群流量?

是的,我们可以使用AB(Apache 基准测试)这个优秀的命令行工具来测量和记录HTTP服务器的表现和统计数据。它可以记录并显示我们的HTTP服务器每秒能处理多少请求。

我们来看一个例子,我们将创建一个路由_/getGoogleData,它将使用Node.JS的'https'模块,调用https://www .google.com,当HTTP调用成功时,它将返回一个示例响应数据。

  1. 现在我们来执行此应用程序并打开终端窗口。
  2. 然后,我们来打开一个新的终端窗口,并通过此 Apache Benchmark 工具和此命令来监控应用程序。

ab -c 4 -n 500 localhost:5000/getGoogleData

在本地主机上运行压力测试,可以使用命令 ab -c 4 -n 500 localhost:5000/getGoogleData

了解这个命令是怎么用的:

-c : 同时执行的请求数量
-n : 压测期间执行的请求数量
路径 我们要监控的.

输出结果

让我们集中关注这些突出的指标,我们可以观察到50%的请求在254毫秒内完成,75%的请求在274毫秒内完成,等等。最后,我们可以看到所有请求都在991毫秒内完成。

现在我们已经观察到完成所有请求用了991毫秒,我们将分叉线程的数量增加到4,正如我们在前一篇文章中讨论过的。然后我们将检查指标差异。

输出结果:

我们可以观察到,完成这100个请求用了501毫秒,这几乎是缩短了一半的时间(单集群运行时需要991毫秒)。这说明通过使用集群技术在Node.js中显著提升了性能。

第2问:我们应该创建多少个子进程(fork() 调用次数)才能获得最佳的吞吐量?

创建任意数量的子进程其实很简单。我们来举同样的例子,将 fork() 的调用次数从 4 次增加到 16 次。

完成全部请求所需的时间从501毫秒增加到670毫秒。

这是怎么发生的?

增加工作进程的数量超过某个阈值后,最终会导致总响应时间增加。这是因为操作系统会尝试同时处理所有请求,导致频繁的上下文切换,从而降低效率。

当聚类数量等于逻辑CPU核心数量时,聚类是有效的。

物理核心指的是 CPU 中实际的硬件部分。

逻辑核心的数量是由物理核心的数量乘以每个物理核心通过超线程技术可以运行的线程数得到的。举个例子,如果你有一个4核的处理器,每个核心可以同时运行两个线程,那么你将有8个逻辑核心。

3. 调用 fork() 是否是使用集群计算的唯一方法,因为我没在大规模项目中见过人们使用它?

不,我们可以使用PM2,这是一个通用的过程管理器,可以控制从启动到结束的过程管理。PM2的核心功能之一是简化手动创建集群的过程,这意味着我们不需要导入Node的cluster模块、进行像cluster.isMaster这样的if/else检查或使用fork()来创建工作进程。PM2会负责所有这些工作。我们只需要使用下面的命令启动应用程序。

pm2 start <<myApplication.js>> -i 3
(该命令用于启动myApplication.js应用,并使用3个工作进程来运行。)

— i 用来表示要创建的簇数。

我已经用PM2启动了同一个应用程序的三个实例。

图像显示了命令的输出结果,其中三个实例运行的index3.js在集群模式下运行。

  • 每个实例都有一个唯一的 pid(进程ID)。
  • 所有实例的 状态 都是 在线 状态。
  • 每个实例的 CPU 和 内存 使用情况会显示。
  • 运行时长 显示每个实例运行了多久。
  • 启动这些进程的 用户(如 salilkumar)会被显示。

通过使用PM2,您可以更高效地管理这些集群,无需在代码中手动处理集群的底层逻辑。

最后

接下来是结论部分

聚类是必不可少的,这是一种提高应用程序性能的强大机制。它是每个应用程序都应首先追求的扩展层次,在实际的水平或垂直扩展之前。但与此同时,不经意间创建了过多的集群最终可能降低性能。因此,我们可以得出结论,如果你想在你的应用程序中引入聚类,那么在选择创建的集群数量之前,了解你机器的CPU核心数是必要的。

下一步是什么?

我们还有很多议题需要详细讨论。在接下来的几篇博文中,我会详细讲讲以下这些话题:

  • Node.js事件循环如何内部工作
  • 选择Hapi还是Express来启动您的项目
  • 在Node.js中应用设计模式

请说说您对这篇文章的看法,或者把它分享到 Twitter。别忘了在 Medium 上关注我,获取更多更新。感谢您的阅读支持!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消