Я использую довольно крупное приложение Node.js 0.8.8, используя кластер с 16 рабочими процессами на 16-процессорном поле с гиперпотоком (так 32 логических ядра). Мы находим, что с момента перехода к ядру Linux 3.2.0 (от 2.6.32) балансировка входящих запросов между рабочими дочерними процессами, по-видимому, сильно взвешена до 5 или около того процессов, а остальные 11 вообще не работают. Это может быть более эффективным для пропускной способности, но, по-видимому, увеличивает задержку запроса и не является оптимальным для нас, потому что многие из них являются долговременными соединениями в сети, которые могут начать выполнять работу одновременно.
Все дочерние процессы принимают в сокет (используя epoll), и хотя эта проблема имеет исправление в Node 0.9 (https://github.com/bnoordhuis/libuv/commit/be2a2176ce25d6a4190b10acd1de9fd53f7a6275), это исправление похоже, не помогают в наших тестах. Кто-нибудь знает параметры настройки ядра или параметры сборки, которые могут помочь, или мы лучше всего вернемся к ядру 2.6 или балансировке нагрузки между рабочими процессами с использованием другого подхода?
Мы сводили его к простому тесту HTTP Siege, хотя учтите, что он работает с 12 procs в 12-ядерном ящике с гиперпотоком (так 24 логических ядра) и 12 рабочими процессами, принимающими на сокет, в противоположность к нашим 16 производственным процессам.
HTTP Siege с Node 0.9.3 на Debian Squeeze с ядром 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