Плохо сбалансированный сокет принимает ядро Linux 3.2 против ядра 2.6

Я запускаю довольно крупномасштабное приложение Node.js 0.8.8, использующее кластер с 16 рабочими процессами на 16-процессорной коробке с гиперпоточностью (так 32 логических ядра). Мы обнаруживаем, что после перехода на ядро Linux 3.2.0 (с 2.6.32) балансировка входящих запросов между рабочими дочерними процессами кажется сильно взвешенной до 5 или около того процессов, а остальные 11 вообще не выполняют большой работы. Это может быть более эффективным для пропускной способности, но, по-видимому, увеличивает задержку запросов и не является оптимальным для нас, потому что многие из них являются долгоживущими соединениями веб-сокетов, которые могут начать работать одновременно.

Все дочерние процессы принимают на сокете (используя epoll), и хотя эта проблема исправлена в узле 0.9 (https://github.com/bnoordhuis/libuv/commit/be2a2176ce25d6a4190b10acd1de9fd53f7a6275), это исправление, похоже, не помогает наши тесты. Кто-нибудь знает о параметрах настройки ядра или опциях сборки, которые могут помочь, или нам лучше вернуться к ядру 2.6 или распределить нагрузку между рабочими процессами, используя другой подход?

Мы свели его к простому тесту HTTP Siege, хотя учтите, что он работает с 12 процессорами на 12-ядерном блоке с гиперпоточностью (24 логических ядра) и с 12 рабочими процессами, принимающими на сокете, в отличие от наших 16 ПРОЦЫ в производстве.

HTTP Siege с узлом 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

Ответы на вопрос(1)

Ваш ответ на вопрос