Pull to refresh

Comments 27

Круто, действительно интересно, спасибо за перевод. Однако я бы еще пару выводов для себя сделал в этом контексте — macOS не нужен, jvm не нужен
Типа если уж принимать миллионы клиентов — можно и заточиться под конкретное железо и ос, и тут jvm скорее мешает чем помогает, а мак очевидно не лучший выбор по итогам тестов :)

Что-то мне не кажется, что это "круто". Это такой приём "распространено заблуждение что ...", и дальше идёт его опровержение. А на самом деле это заблуждение не так уж и распространено.
Вот 12 миллионов сокетов: https://habr.com/ru/post/460847/
Можно и 20 ... Весь вопрос в ресурсах (ЦПУ/ОЗУ).

Какая-то очень странная тут задача у автора. Если он хотел обеспечить обработку максимума сокетов, то добро пожаловать в обработку сырых TCP ... и это не так страшно. Можно сделать хоть миллион, а можно хоть и миллиард сокетов, но дело тут не в количестве, а в качестве обслуживания. Если компания ставит задачей обработку такого числа подключений, то возникает вопрос: "За какое время будет обработан тот или иной запрос?" Скажем если у автора даже NMI операции движения мышки уже испытывали голодание, то говорить о разумном времени обслуживания - нет смысла. Я все это к тому, что изначально нет вопроса в количестве сокетов и подключений, а стоит вопрос именно в эффективности. И конечно когда мы докатились до эффективности, то вопрос каким образом тут оказалось macOS и Java? Эти инструменты вообще про красоту и лень программиста (разумный баланс цена/время). Я все к тому, что важно наверное сначала верно обозначать решаемый вопрос - перед какими-то титаническими подвигами в детских песочницах.

Движения мышки это не NMI, это polling. А отрисовка курсора — вообще в userspace.

Можно конечно и заточиться, но если ты стартап с непроверенной гипотезой и сомнительным финансированием - ты хочешь писать быстро в прототипном стиле силами двух с половиной человек, а потом магически отмасштабировать решение на миллионы пользователей.
И это я сейчас про whatsapp + erlang | discord + elixir, подозрительно одинаковые истории успеха. И ВМ там очень помогла.

Теоретический предел немного меньше указанного. Портов не 65536, а только 65535, потому что нулевого порта нет.

Кроме того, если доверить операционной системе выбор клиентского порта, то Windows выбирает только номера, начиная с 1024.

В коде для эксперимента connectionsPerAddress по умолчанию 5000, а не 65536 и даже не 65535

Кстати, а в Linux клиентский порт и вовсе с 32768 начинается:

~ $ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999

Кроме того, если доверить операционной системе выбор клиентского порта, то Windows выбирает только номера, начиная с 1024.

Старая информация, верная только для Windows NT/2K/XP/2K3
Возможно, проще было не назначать алиасы лупбэку, а просто использовать другие адреса из подсети 127.0.0.1/8

Немного непонятны некоторые моменты.
Если сервер и клиенты на одной машине, зачем 10.* подсеть, чем 127.* не устроила?
Если суть поставить рекорд, то стоило уменьшить до минимума буферы под TCP, а на стороне сервера увеличить backlog очередь соединений до максимума.

Так не на одной. Мак+Линукс.

Интересно, сколько сможет пройти соединений через NAT. Около 65к?

Сколько в настройках conntrack сделаете, столько и будет. Больше миллиона записей conntrack точно выдерживает.

а есть какие-то способы отслеживания соединений кроме порта? Потому что если все клиенты за NAT будут стучаться к одному и тому же серверу по одному айпи, то как раз теоретический предел меньше этих 65к соединений. По tcp там возможно есть какие-то механизмы, а с udp вопрос

Спасибо за статью, очень интересно!

Hidden text

 серию фальшивых адресов замыкания на себя (loopback address)

Я чаще наталкивался на вариант перевода "петлевой интерфейс" или "петлевой адрес".

На самом деле проблема нехватки портов обычно касается апстримов у проксирующих серверов (собственно, исходящие соединения). На практике "открытый порт" - это фикция ОС, формализм в её базе. Сколько можно реалистично обслуживать соединений? Чаще всего этот показатель ограничен числом pps, которые может обработать сетевой стек (последний раз, когда я серьёзно занимался бенчмарками - около миллиона на сетевую карту, наверное, сейчас больше).

Забавно что автор статьи тоже упёрся в исходящие соединения, но почему-то не пришел к выводу что ноги этого "мифа" растут как раз из исходящих соединений на балансере :-).

Смешались кони и люди, а потом распутались :).

Изначально перепутаны понятия "сокет" (суть дескриптор соединения) и "порт", на чём и построена интрига.

Всю статью можно уместить в пару абзацев:

"Клиент в сторону одной пары server ip:port с одного IP может открыть до 65535 tcp-соединений, с той стороны они потребуют 65535 сокетов, которых можно завести - на сколько памяти и проца хватит. Ибо в tcp-пакетах прописана пары (изменяемый) client IP/port и (неизменный) server ip/port. Кому хочется большего - делает NAT с помощью пула адресов и соединяется с пулом адресов сервера. Хочется странного - можете делать свой протокол поверх UDP или вообще свой протокол.

Обработать дофигища входящих подключений - можно, если у сервера достаточно памяти и проца, и в ОС возможно задать нужные лимиты по сокетам и прочим дескрипторам, но иногда это потребует усилий мозгом - если нужно это сделать быстро."

У меня сервера на RHEL с 64GB оперативы начинают уходить в себя при ~14500 входящих сессий TWAMP (perfSONAR). Каждая сессия резервирует ~4KB виртуальной памяти. Много ковырял всякие конфиги но ничего внятного добиться не смог. Так что считаю перечитаю несколько раз. Если у кого-то есть готовый рецепт, буду весьма благодарен.

Спустя несколько секунд после начала эксперимента операционная система решила задействовать swap, хотя у меня ещё была память.

Это нормальное поведение. Регулируется с помощью параметра vm.swappiness в файле /etc/sysctl.conf (после сохранения надо перезагрузиться). Он определяет процент оставшейся свободной оперативной памяти, при котором начинается задействоваться swap. Текущее значение этого параметра можно посмотреть с помощью команды cat /proc/sys/vm/swappiness.

Не совсем

vm.swappiness определяет баланс между файловыми и анонимными страницами, что системе предпочтительнее высвобождать
Если система решит, что оптимальнее будет скинуть что-то в своп вместо сброса файловых кешей, то она имеет полное право так сделать

Вот тут есть перевод классной статьи, где очень подробно разбирается механизм работы swap

Sign up to leave a comment.

Articles