分叉更多的工人可以让我平衡CPU繁重的工作吗?

我喜欢node.js的evented模型,但它只是到目前为止 – 当你有一个function(如HTTP连接请求处理程序),在CPU上做了很多繁重的工作,它仍然是“阻塞”,直到它函数返回。 这是可以预料的。 但是如果我想平衡这一点,那么使用操作系统安排stream程的能力,给定的请求需要更长的时间来处理,但整体响应时间会更短。

我的产品代码使用节点的非常简单的Cluster模块来分派许多等于系统CPU所具有的内核数量的工作者。 分叉多于这个 – 每个核心可能有两三名工人? 我知道这里会有内存开销,但内存不是我的限制。 我做了什么读,提到你想避免“超额订阅”,但是在现代系统中肯定会有两三个进程在处理器上争夺时间。

我认为你的想法听起来很不错。 特别是因为许多处理器支持超线程 。 超线程并不神奇,不会突然增加应用程序的速度或吞吐量,但是当第一个线程需要等待一个内存请求被填充时, 可以让另一个线程准备好在内核中执行。

启动多个工作人员时要小心:Linux内核确实倾向于让进程在整个生命周期内在同一个处理器上执行,以提供强大的caching关联性。 这很有道理。 但是我已经看到几个耗费CPU资源的进程争夺核或者更糟糕的一个单线程实例,而不是系统重新平衡所有内核或者所有同胞的进程。 通过运行ps -eo pid,psr,comm (或者任何你最喜欢的ps(1)命令是;添加psr列)检查你的处理器的亲和力。

为了解决这个问题,你可能想用一个明显的有限的CPU亲和力来启动你的工作:

 taskset -c 0,1 node worker 1 taskset -c 2,3 node worker 2 taskset -c 4,5 node worker 3 taskset -c 6,7 node worker 4 

或者,也许每个HT兄弟姐妹八个或八个,将每一个CPU限制在自己的一套CPU中,或者说十六个,每个核心只允许四个核心或两个兄弟等等(你可以坚持尝试微观pipe理。这很简单,如果可以的话)。详情请参阅taskset(1)页。