在 IBM iSeries 上使用 node express,我们应该使用工作线程还是集群?

问题描述

我已经了解了 node express 和 cluster 并且已经能够成功 在 Windows 操作系统上实现它。 Windows 上 cpu 内核的概念很容易掌握,因为我了解 os.cpu 内核。我们还计划在 iSeries 上测试 Web 服务,这将获得大量并发量。当我搜索有关在 iSeries 上的集群中运行 nodejs 的信息时,我发现这篇文章提到了“工作线程”。

https://community.ibm.com/community/user/ibmz-and-linuxone/blogs/blog-entry1/2020/04/02/optimizing-your-workload-using-worker-threads-in-ibm-sdk-for-nodejs-zos-v12

这让我想到了“在 IBM iSeries 上使用 node express,我们应该使用工作线程还是集群?”

解决方法

请注意,该特定文章讨论的是 z/OS 大型机上的节点,而不是 IBM i(又名 iSeries)中端系统。

话虽如此,Z/OS 或 IBM i 上的 nodejs 与 Windows/Linux 上的 nodejs 并没有什么不同。

看看这篇关于 Single thread vs child process vs worker threads vs cluster in nodejs

的文章

结论
尽管 Node js 为 多线程,这并不一定意味着我们应该总是 我们的 Web 应用程序是多线程的。 Node js就是这样构建的 默认的单线程行为优于 网络服务器的多线程行为,因为网络服务器倾向于 受 IO 限制,nodejs 非常适合处理异步 IO 以最少的系统资源进行操作,Nodejs 以此闻名 特征。另一个线程的额外开销和复杂性或 过程使程序员很难使用简单的 IO 任务。但是在某些情况下,Web 服务器会受到 CPU 限制 操作,在这种情况下,启动一个工人真的很容易 线程或子进程并委托该任务。所以,我们的设计 架构真正归结为我们的应用程序的需求和 要求,我们应该基于此做出决定。

鉴于 IBM i 是为 DB 操作定制的,nodejs 对非阻塞 I/O 的内置支持是完美的。如果您收到的请求数量超过单个实例的处理能力,请务必建立一个集群。

如果您碰巧在 nodejs 中执行 CPU 密集型工作,请考虑使用子进程或工作进程。

IBM i(或 z/OS)的关键在于,与“单一应用程序”Window/Linux 系统相比,这些系统往往能一次性完成更多工作。在给定的 IBM i 系统(或逻辑分区)中,您可能有 64 个或更多内核,但我强烈建议不要尝试将所有内核用于 nodejs。

与简单的 Windows/Linux 系统相比,IBM i 的另一个关键在于它具有完全不同的工作管理级别。这就是它能够同时做这么多不同事情的原因。

IBM i 中的工作是在单线程或多线程作业(基本上是一个进程)中完成的。但是这些作业在一个子系统中运行,该子系统分配了特定的内存池,并且对该子系统/内存池中可以同时激活的线程数量有明确的限制。

因此,即使您告诉 node 使用 4 个工作线程集群,它实际上也可能不会这样做,具体取决于您的作业运行的位置。

您需要与您的管理员一起确定在何处运行您的 nodejs 应用程序,或者甚至是否在他们自己的子系统/内存池中运行您的 nodejs 作业是有意义的。