Кстати, вот тут пишут что node.js тянет до миллиона одновременных соединений. Без балансеров и прочего. На одной машине. И это, черт возьми, голимый js! (хотя, справедливости ради, этот голимый js в подобном тесте является тонкой надстройкой над pure low level C либой). Впрочем, со сборщиком мусора там все равно проблемы начинаются на миллионе соединений, приходится немного иначе работать.
Сами по себе соединения процессора особо-то не жрут. Если тот мужик раздобудет компьютер в котором в десять раз больше оперативки, то может громко закричать, что он теперь держит десять миллионов соединений. Но это лохотрон.
Процессор жрут: установление соединения, разрыв соединения, обработка сообщений.
Скорость установления соединений у него получилась как он пишет 5000-7000 в секунду (для определённости пусть будет 5000), скорость завершения соединений 400'000 за 3 минуты, то есть 2200 в секунду.
Пусть
x -- количество устанавливаемых соединений, а
y -- количество разрываемых соединений за одну секунду, тогда при максимальной нагрузке будет:
x/5000 + y/2200 = 1
В стационарном режиме количество устанавливаемых соединений за одну секунду равно количеству разрываемых. Из предыдущего уравнения находим его корень при
x=y:
x = 1527 соединений в секунду (устанавливается и разрывается).
Жалкие полторы тысячи соединений в секунду. И это без полезной нагрузки: просто на установление и на разрыв соединения.
Установив миллион соединений он пустил по ним жалкие 50'000 сообщений в секунду израсходовав на них 2-3 ядра из 8. Почему он пустил такую маленькую нагрузку и что конкретно это были за сообщения не уточняется. Предположим, что при полной загрузке его серверок может обработать 150'000 сообщений в секунду.
Пусть
p количество "звонков" в секунду (установлений соединения + разрыв соединения), а
q -- количество сообщений в секунду. Тогда при максимальной нагрузке справедлива формула:
p/1527 + q/150000 = 1
Из этой формулы получаем следующее.
Сценарий 1.
Установили соединение, послали 1 сообщение (q = p), разорвали соединение.
Максимальная нагрузка: p = 1511 "звонков" в секунду.
Сценарий 2.
Установили соединение, послали 10 сообщений (q = 10*p), разорвали соединение.
Максимальная нагрузка: p = 1385 "звонков" в секунду.
Сценарий 3.
Установили соединение, послали 100 сообщений (q = 100*p), разорвали соединение.
Максимальная нагрузка: p = 756 "звонков" в секунду.
Сценарий 4.
Установили соединение, послали 1000 сообщений (q = 1000*p), разорвали соединение.
Максимальная нагрузка: p = 136 "звонков" в секунду.
Короче, лохотрон. При такой низкой скорости обслуживания миллион одновременных "звонков" не нужны.
Для сравнения, на работе у нас балансеры держут 500-1000 звонков в секунду каждый. Далее балансеры перенаправляют звонки в мою программу на C#. Она запущенная под 64 разрядной Windows 7 на 2600K может обслуживать до 7000 звонков в секунду если отключить запись CDR в базу данных и акаунтинг по RADIUS серверу.