WA: 3 млн tcp соединений на одном сервере
От: Sharov Россия  
Дата: 28.07.20 15:16
Оценка:
Здравствуйте.

Вот тут человек не может понять как это возможно на одном сервере -- https://youtu.be/vQ5o4wPvUXg

Понятно, что это erlang+elixir. Но все же при физическом ограничении в ~60т. сокетов как это возможно?
Т.е. я понимаю про non-blocking IO, c10k и т.д., но с10М как? Как возможно наплодить такое кол-во сокетов на одной машине?
Кодом людям нужно помогать!
Re: WA: 3 млн tcp соединений на одном сервере
От: Слава  
Дата: 28.07.20 15:22
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Понятно, что это erlang+elixir. Но все же при физическом ограничении в ~60т. сокетов как это возможно?

S>Т.е. я понимаю про non-blocking IO, c10k и т.д., но с10М как? Как возможно наплодить такое кол-во сокетов на одной машине?

Откуда берётся ограничение в 60т. сокетов? Значение подозрительно похоже на максимальное для двухбайтового значения.

Взяли и написали патч для ядра. Или даже не патч, а просто изменили параметр, это же FreeBSD, а не линукс.
Re: WA: 3 млн tcp соединений на одном сервере
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 28.07.20 15:32
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте.


S>Вот тут человек не может понять как это возможно на одном сервере -- https://youtu.be/vQ5o4wPvUXg


S>Понятно, что это erlang+elixir. Но все же при физическом ограничении в ~60т. сокетов как это возможно?

S>Т.е. я понимаю про non-blocking IO, c10k и т.д., но с10М как? Как возможно наплодить такое кол-во сокетов на одной машине?

BEAM реально творит чудеса в вопросах разработки сетевых приложений.
Re: WA: 3 млн tcp соединений на одном сервере
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.07.20 15:34
Оценка: 16 (4) +1
Здравствуйте, Sharov, Вы писали:

S>Вот тут человек не может понять как это возможно на одном сервере -- https://youtu.be/vQ5o4wPvUXg


S>Понятно, что это erlang+elixir. Но все же при физическом ограничении в ~60т. сокетов как это возможно?


Такого ограничения нет и никогда не было.
Если вы про TCP, все сокеты установленных соединений, созданных коннектом к серверу, имеют один и тот же номер порта с серверной стороны. Ядро их различает по комбинации всех 4 параметров — 2 адреса хоста и 2 порта двух сторон.

Для IPv4 таким образом предел это около 2^79 таких сокетов

Erlang по части держания коннектов и производительности ничуть не лучше, а почти всегда хуже, компилируемых аналогов (разве что они сделали свой JIT). Единственное чем он тут способен побить — это встроенной системой автообновления без рестарта.

S>Т.е. я понимаю про non-blocking IO, c10k и т.д., но с10М как? Как возможно наплодить такое кол-во сокетов на одной машине?


Таки перечитайте теорию, тут всё банально.
The God is real, unless declared integer.
Re[2]: WA: 3 млн tcp соединений на одном сервере
От: Sharov Россия  
Дата: 28.07.20 16:14
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, Sharov, Вы писали:


S>>Вот тут человек не может понять как это возможно на одном сервере -- https://youtu.be/vQ5o4wPvUXg


S>>Понятно, что это erlang+elixir. Но все же при физическом ограничении в ~60т. сокетов как это возможно?


N>Такого ограничения нет и никогда не было.

N>Если вы про TCP, все сокеты установленных соединений, созданных коннектом к серверу, имеют один и тот же номер порта с серверной стороны. Ядро их различает по комбинации всех 4 параметров — 2 адреса хоста и 2 порта двух сторон.8

N>Для IPv4 таким образом предел это около 2^79 таких сокетов


Гугл выдал:

Maximum number of sockets. For most socket interfaces, the maximum number of sockets allowed per each connection between an application and the TCP/IP sockets interface is 65535.


N>Erlang по части держания коннектов и производительности ничуть не лучше, а почти всегда хуже, компилируемых аналогов (разве что они сделали свой JIT). Единственное чем он тут способен побить — это встроенной системой автообновления без рестарта.


Подождем Skydance'а. Он как раз performance engineer в wa.
Кодом людям нужно помогать!
Re: WA: 3 млн tcp соединений на одном сервере
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.07.20 16:33
Оценка: 10 (1)
Здравствуйте, Sharov, Вы писали:

S>Понятно, что это erlang+elixir. Но все же при физическом ограничении в ~60т. сокетов как это возможно?

S>Т.е. я понимаю про non-blocking IO, c10k и т.д., но с10М как? Как возможно наплодить такое кол-во сокетов на одной машине?

Я без особых проблем держал на Си ~300K сокетов, и держал бы и больше, если бы больше ко мне приходило

Никакого ограничения в 60К сокетов нет. Есть ограничение в 60K портов. Но TCP-соединение идеинтифицируется сочетанием адресов/портов на обеих сторонах, так что если у тебя внешние адреса разные, то внутренний порт может быть хоть один на всех.

Кстати, я количество внутренних портов принудительно ограничивал. Иначе оно имеет тенденцию занимать их все, и другим программам начинает не хватать.
Re[2]: WA: 3 млн tcp соединений на одном сервере
От: Sharov Россия  
Дата: 28.07.20 17:37
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Я без особых проблем держал на Си ~300K сокетов, и держал бы и больше, если бы больше ко мне приходило




Pzz>Никакого ограничения в 60К сокетов нет. Есть ограничение в 60K портов. Но TCP-соединение идеинтифицируется сочетанием адресов/портов на обеих сторонах, так что если у тебя внешние адреса разные, то внутренний порт может быть хоть один на всех.


Вы это мне уже объясняли, было дело. Математика с ув. netch80 не бьется -- под внешней парой понимается адрес:порт? Тогда всего (грубо) 2^32 адресов на 2^16 портов (это все клиент) и на 2^16 портов на сервере, т.е. всего 2^64 возможных соединений. Откуда 2^79?
Кодом людям нужно помогать!
Re[2]: WA: 3 млн tcp соединений на одном сервере
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 28.07.20 17:59
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Никакого ограничения в 60К сокетов нет. Есть ограничение в 60K портов. Но TCP-соединение идеинтифицируется сочетанием адресов/портов на обеих сторонах, так что если у тебя внешние адреса разные, то внутренний порт может быть хоть один на всех.

Имеется ввиду максимальное количество дескрипторов сокета который вроде как int от 0 до max_int которое можно открыть и их ~60к.
Sic luceat lux!
Re[3]: WA: 3 млн tcp соединений на одном сервере
От: Mystic Artifact  
Дата: 28.07.20 18:15
Оценка: 10 (1) +1
Здравствуйте, Sharov, Вы писали:

S>Вы это мне уже объясняли, было дело. Математика с ув. netch80 не бьется -- под внешней парой понимается адрес:порт? Тогда всего (грубо) 2^32 адресов на 2^16 портов (это все клиент) и на 2^16 портов на сервере, т.е. всего 2^64 возможных соединений. Откуда 2^79?

netch80 говорит, что внутренняя пара так же учитывается. Ты же из внутренней пары считаешь только номера портов, полагая что у сервера только один сетевой интерфейс, но ничего не мешает иметь больше одного.
Re[3]: WA: 3 млн tcp соединений на одном сервере
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.07.20 18:35
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Вы это мне уже объясняли, было дело. Математика с ув. netch80 не бьется -- под внешней парой понимается адрес:порт? Тогда всего (грубо) 2^32 адресов на 2^16 портов (это все клиент) и на 2^16 портов на сервере, т.е. всего 2^64 возможных соединений. Откуда 2^79?


Ну, видимо Валентин решил, что локальных IP-адресов тоже может быть много.
Re[3]: WA: 3 млн tcp соединений на одном сервере
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.07.20 18:38
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Имеется ввиду максимальное количество дескрипторов сокета который вроде как int от 0 до max_int которое можно открыть и их ~60к.


Они уж сто лет в обед, как 32-битные.
Re: WA: 3 млн tcp соединений на одном сервере
От: Bill Baklushi СССР  
Дата: 28.07.20 18:46
Оценка:
Sharov:

S>Вот тут человек не может понять как это возможно на одном сервере -- https://youtu.be/vQ5o4wPvUXg


S>Понятно, что это erlang+elixir. Но все же при физическом ограничении в ~60т. сокетов как это возможно?

S>Т.е. я понимаю про non-blocking IO, c10k и т.д., но с10М как? Как возможно наплодить такое кол-во сокетов на одной машине?

И главное — зачем?

Не смотрел, но осуждаю.
Есть же UDP, RTP, групповые адреса и пр. страшные слова, чтобы не хранить дофига миллионов состояний каждого соединения...
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re[3]: WA: 3 млн tcp соединений на одном сервере
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.07.20 19:00
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Гугл выдал:

S>

S>Maximum number of sockets. For most socket interfaces, the maximum number of sockets allowed per each connection between an application and the TCP/IP sockets interface is 65535.


Эээ
ссылку можно?
А то я такой текст нашёл только для z/OS — вы в курсе, что это не Unix, не Windows, не Mac-что-угодно, и вообще настолько далёкая от типовых решений индустрии, что у них всё иначе и называется иначе?
The God is real, unless declared integer.
Re[3]: WA: 3 млн tcp соединений на одном сервере
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.07.20 19:02
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Pzz, Вы писали:


Pzz>>Я без особых проблем держал на Си ~300K сокетов, и держал бы и больше, если бы больше ко мне приходило


S>


Pzz>>Никакого ограничения в 60К сокетов нет. Есть ограничение в 60K портов. Но TCP-соединение идеинтифицируется сочетанием адресов/портов на обеих сторонах, так что если у тебя внешние адреса разные, то внутренний порт может быть хоть один на всех.


S>Вы это мне уже объясняли, было дело. Математика с ув. netch80 не бьется -- под внешней парой понимается адрес:порт? Тогда всего (грубо) 2^32 адресов на 2^16 портов (это все клиент) и на 2^16 портов на сервере, т.е. всего 2^64 возможных соединений. Откуда 2^79?


Я считал, разумеется, и возможность назначить локальной машине сколько угодно адресов.
Исключить 1/8 адресного пространства на всякие мультикасты и класс E и предположить, что сервер сам к себе обычно не ходит...
The God is real, unless declared integer.
Re[2]: WA: 3 млн tcp соединений на одном сервере
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.07.20 19:02
Оценка:
Здравствуйте, Bill Baklushi, Вы писали:

BB>И главное — зачем?


BB>Не смотрел, но осуждаю.

BB>Есть же UDP, RTP, групповые адреса и пр. страшные слова, чтобы не хранить дофига миллионов состояний каждого соединения...

Почему бы не хранить, если мощность сервера позволяет это?
The God is real, unless declared integer.
Re[4]: WA: 3 млн tcp соединений на одном сервере
От: Sharov Россия  
Дата: 28.07.20 19:32
Оценка: +1
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, Sharov, Вы писали:


S>>Гугл выдал:

S>>

S>>Maximum number of sockets. For most socket interfaces, the maximum number of sockets allowed per each connection between an application and the TCP/IP sockets interface is 65535.


N>Эээ

N>ссылку можно?
N>А то я такой текст нашёл только для z/OS — вы в курсе, что это не Unix, не Windows, не Mac-что-угодно, и вообще настолько далёкая от типовых решений индустрии, что у них всё иначе и называется иначе?
N>)

да-да, я вбил "maximum number of sockets" в гугол и он мне, в рамочке, выдал это определение. Но вообще, я это помню из книжек\вуза, что есть некое ограничение на сокет в виде 2^16. Я это ограничение запомнил на кол-во сокетов в системе (ОС).
Кодом людям нужно помогать!
Re[3]: WA: 3 млн tcp соединений на одном сервере
От: SkyDance Земля  
Дата: 28.07.20 19:41
Оценка: 15 (3)
N>>Erlang по части держания коннектов и производительности ничуть не лучше, а почти всегда хуже, компилируемых аналогов (разве что они сделали свой JIT). Единственное чем он тут способен побить — это встроенной системой автообновления без рестарта.

S>Подождем Skydance'а. Он как раз performance engineer в wa.


По совместительству еще и один из директоров Erlang Ecosystem Foundation. Занятно, что в данный момент я как раз исправляю часть, которая связана с поддержкой сетевых соединений.

Что именно интересует? Просто открыть 3 млн соединений проблем нет почти на любой языке.

Преимущество Эрланга (и вообще BEAM languages) в том, что:
1. Сделать такое можно буквально в десяток строк кода — сам язык хорошо заточен под подобное использование.
2. Программисту гораздо сложнее выстрелить себе в ногу. Но, конечено, чем более сеньором себя программист считает, тем чаще стреляет даже в Эрланге — от умного дурака защититься сложнее, чем от глупого.

JIT для BEAM пока существует только в экспериментальном проекте, хорошо если через год будет продакшн. Hot code load — да, ценная и важная фича, но не единственное, что важно.
А вот что важно, так это фреймворк, который заставляет программиста думать асинхронно. Все то самое "reactive programming", только очень-очень взрослое по сравнению со смешными поделками, которые сейчас массово вылезают в виде разных react.js и прочего. Все-таки, за 30 лет Эрланг и BEAM повзрослели. Там уже заложены все те концепции, до которых сейчас только думают дорасти очередные итерации "серебряных пуль". Начиная от supervision, и заканчивая immutable releases.

Лучше всего про Эрланг сказал один из его авторов, Роберт Вирдинг:

Virding's First Rule of Programming
After reading the blogs about how good Erlang's concurrency model is and how we just just made a super implementation of it in XXX I have been led to formulate Virding's First Rule of Programming:

Any sufficiently complicated concurrent program in another language contains an ad hoc informally-specified bug-ridden slow implementation of half of Erlang.

With all respect to Greenspun.

Re[2]: WA: 3 млн tcp соединений на одном сервере
От: SkyDance Земля  
Дата: 28.07.20 19:42
Оценка:
KP>BEAM реально творит чудеса в вопросах разработки сетевых приложений.

никаких чудес, просто грамотное использование kqueue/epoll. Но да, читать этот код ох непросто, и вот сейчас как раз epoll-related баг выносит мне мозг капитально.
Re: WA: 3 млн tcp соединений на одном сервере
От: Reset  
Дата: 29.07.20 08:13
Оценка: 26 (2) :)
S>Вот тут человек не может понять как это возможно на одном сервере -- https://youtu.be/vQ5o4wPvUXg

Т.е. это ты не для себя спрашиваешь, а для друга. Ясно-понятно.

Ну, про количество IP:port с одной и другой стороны тебе уже рассказали (у пользователей могут быть разные IP и у сервера тоже много IP на одном интерфейсе, с портами аналогично), про int вместимостью в 31 бит тоже.

Однако, про IPv6 чё-та совсем и не упомянули, а там каждому клиенту полагается сеть /64 (в стандарте так написано, но правда, даже хостеры стандарты не читают и умудряются на клиента выдавать IPv6 адреса в штуках, откусывая их от своей сети /48 или сколько там дают провайдеру по умолчанию). Впрочем, с таким провайдером я бы не пытался держать 10M сокетов на одной машине.

Также от себя добавлю, что для таких масштабов вполне могут использовать какой-нибудь DPDK, где между приложением и сетевушкой никакого ядра и нет вовсе (драйвер сетевухи со всем сетевым стеком находится прямо в userspace). Там и трафик (количество пакетов) можно сделать больше, и количество соединений держи сколько в память влезет.

Еще полезно отключить, все что мешается — огнестенку, например, с conntrack, да и просто фильтр там будет тормозить. Впрочем, с DPDK, это, наверняка, не актуально, а если сокеты держит ядро, то файрвол, однозначно, будет мешать, даже без conntrack. Фильтровать придется через eBPF (каждый школьник уже может осилить).
Отредактировано 29.07.2020 9:45 Reset . Предыдущая версия . Еще …
Отредактировано 29.07.2020 9:45 Reset . Предыдущая версия .
Re[5]: WA: 3 млн tcp соединений на одном сервере
От: Mystic Artifact  
Дата: 29.07.20 15:31
Оценка:
Здравствуйте, Sharov, Вы писали:

S>да-да, я вбил "maximum number of sockets" в гугол и он мне, в рамочке, выдал это определение. Но вообще, я это помню из книжек\вуза, что есть некое ограничение на сокет в виде 2^16. Я это ограничение запомнил на кол-во сокетов в системе (ОС).


У меня было точно такое же интуитивное понятие на ограничение числа коннектов на порты. Не знаю даже откуда... А потом столкнулся поближе с темой (нет нет, кучи коннектов не нужно было, наверное скорее делал poor-man in-process "файерволл", что бы это ни было), и пришло озарение, что это не так. А потом даже смешно немного стало, ведь если присмотреться что творится со списком коннектов, то можно когда и никогда разглядеть несогласовааность этой интуитивной теории с реальным миром.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.