【发布时间】:2012-11-26 02:07:00
【问题描述】:
我正在运行一个相当大规模的 Node.js 0.8.8 应用程序,它使用具有 16 个工作进程的集群,在具有超线程的 16 处理器机器上(所以 32 个逻辑核心)。我们发现,自从迁移到 Linux 3.2.0 内核(从 2.6.32 开始)后,工作子进程之间传入请求的平衡似乎被重压到 5 个左右的进程,而其他 11 个根本没有做太多工作。这可能对吞吐量更有效,但似乎会增加请求延迟,并且对我们来说并不是最佳选择,因为其中许多是可以同时开始工作的长期 Websocket 连接。
子进程都在一个套接字上接受(使用 epoll),虽然这个问题在 Node 0.9 中有一个修复(https://github.com/bnoordhuis/libuv/commit/be2a2176ce25d6a4190b10acd1de9fd53f7a6275),但该修复似乎没有帮助我们的测试。是否有人知道内核调整参数或构建选项可能会有所帮助,或者我们是否最好回到 2.6 内核或使用不同的方法跨工作进程进行负载平衡?
我们将其归结为一个简单的 HTTP Siege 测试,但请注意,这是在具有超线程(即 24 个逻辑核心)的 12 核机器上使用 12 个 proc 运行,并且在套接字上接受 12 个工作进程,而不是到我们的 16 个生产过程中。
在裸机上使用 2.6.32 内核的 Debian Squeeze 上使用 Node 0.9.3 的 HTTP Siege:
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
【问题讨论】:
-
您是否尝试过创建 16 个服务器(作为单独的进程)并将(例如)haproxy 放在前面?这是一款不错的代理软件。此外,您还需要一个代理来进一步扩展。
-
是的!本地 HAProxy 在进程之间进行完美的循环,如果我们无法解决这个问题,我们可能会使用它。但是,似乎最好避免添加额外的服务(更不用说在进程崩溃或无响应时额外的来回),所以我们正在探索这条途径。
-
这篇文章看起来值得发布在 linux 内核邮件列表中。网络/平衡算法经常发生变化,所以最好找到最初“搞砸”这个的原始人......
-
我同意;我们看到的结果与我们构建的 3.7 内核的 2.6 内核相似,因此当我们对导致问题的内核版本和/或构建配置更加清楚时,我们可能会询问内核邮件列表。
-
3.6.10 内核在裸机上可以很好地完成这项工作,但在 Amazon Web Services 上的 HVM AMI 上,事情仍然非常不平衡,所以现在我们认为存在问题一般是 3.2 内核,以及 Xen 中的另一个问题,可能是这里引起问题的问题:serverfault.com/questions/272483/…
标签: linux node.js http kernel epoll