我正在与超线程(所以32个逻辑核心)16处理器机器上运行一个相当大规模的Node.js 0.8.8应用使用群集与16个的工作进程。 我们发现,自从搬到了Linux内核3.2.0(从2.6.32),工人子进程之间的传入请求的平衡似乎被权重较大,以5点左右的过程,与其他11没有做多少工作都没有。 这可能是吞吐量更有效,但似乎增加请求延迟和不是最佳的我们,因为许多这些是可以开始在同一时间做工作,长寿命的WebSocket连接。
该子进程的插座上的所有接受(使用epoll的),虽然这个问题在节点0.9(https://github.com/bnoordhuis/libuv/commit/be2a2176ce25d6a4190b10acd1de9fd53f7a6275)的修复,即修复似乎并没有在帮助我们的测试。 有没有人知道内核调节参数或编译选项,可以帮助,或使用不同的方法是我们最好的断搬回到2.6内核或负载整个工作进程的平衡?
我们煮下来到一个简单的HTTP攻城测试,但请注意,这是与12个特效运行与超线程(所以24个逻辑核心)12芯盒,并有12个工作进程接受插座上,而不是我们的16在特效制作。
HTTP围困与节点0.9.3在Debian挤压与2.6.32内核上裸露的金属:
reqs pid
146 2818
139 2820
211 2821
306 2823
129 2825
166 2827
138 2829
134 2831
227 2833
134 2835
129 2837
138 2838
同样的一切,除了与3.2.0内核:
reqs pid
99 3207
186 3209
42 3210
131 3212
34 3214
53 3216
39 3218
54 3220
33 3222
931 3224
345 3226
312 3228
不依赖于操作系统的多个插座接受跨Web服务器进程负载均衡。
在Linux内核行为不同于这里因版本,我们看到的是320的内核,这似乎是有点在以后的版本更加平衡的一个特别不平衡的行为。 如3.6。
我们的假设下运行,应该有一种方法,使Linux的像做循环赛这一点,但也有各种各样的这个问题,其中包括:
- Linux内核2.6表现出类似的裸露金属循环赛行为(失衡是约3比1),Linux内核3.2没有(10:1的失衡),和内核3.6.10又似乎还好。 我们并没有试图平分实际变化。
- 不管内核版本或编译选项中,我们看到了在亚马逊Web服务的32逻辑核HVM实例的行为对单个进程受到严重加权; 有可能是Xen的插座问题接受: https://serverfault.com/questions/272483/why-is-tcp-accept-performance-so-bad-under-xen
你可以看到我们使用与优秀团队的Node.js对应,开始对这里的GitHub的问题,我们非常详细的测试: https://github.com/joyent/node/issues/3241#issuecomment-11145233
那次谈话与Node.js的团队表示,他们正在认真考虑实现群集明确的循环,并开始为一个问题结束: https://github.com/joyent/node/issues/4435 ,并与Trello团队(这是美国)在接受水平将我们的后备计划,这是每个服务器上使用本地HAProxy的过程,代理在16个端口,每个端口上运行的2工人处理群集实例(用于快速故障转移在过程的情况下崩溃或挂起)。 该计划正在精美,与请求的等待时间,并大大减少变化的较低的平均等待时间,以及。
还有很多更在这里说,我没有采取邮寄的Linux内核邮件列表的步骤,因为目前还不清楚这是否是一个真正的Xen或Linux内核问题,或者真的只是多一个不正确的期望接受行为对我们的一部分。
我很乐意看到从多个接受专家的答案,但我们又回到了我们可以建立使用组件,我们更好地理解。 如果有人张贴一个更好的答案,我会很高兴接受的,而不是我的吧。