Рейтинг:1

Сервер Linux не допускает более 2048 одновременных подключений

флаг in

Я попытался выполнить нагрузочный тест на MQTT с моего MACOS и смог успешно установить более 12 тысяч подключений, пока моя пропускная способность не исчерпана.

Я попытался выполнить тот же тест на машине GCP, и он дал мне исключение из-за тайм-аута соединения, когда открытые порты достигли 2048 и 2048 соединений с брокером MQTT.

При подключении мой ConnectionTimeout равен 100 с (ожидание подтверждения) и KeepAlive = 300 с (после установления соединения)

Эта проблема возникает независимо от программного обеспечения для нагрузочного тестирования, например, mzbench, jmeter и emqtt-bench. Итак, я думаю, что эта проблема связана с сервером Linux.

Я не стремлюсь достичь 1 миллиона открытых соединений, но ищу как минимум 30 тысяч открытых соединений.

Я уже пытался изменить ulimit, и это мои настройки ulimit

размер основного файла (блоки, -c) 0
размер сегмента данных (кбайт, -d) не ограничен
приоритет планирования (-e) 0
размер файла (блоки, -f) не ограничен
ожидающие сигналы (-i) 63887
максимальная заблокированная память (кбайт, -l) 64
максимальный размер памяти (кбайт, -m) не ограничен
открытые файлы (-n) 102400
размер канала (512 байт, -p) 8
Очереди сообщений POSIX (байты, -q) 819200
приоритет реального времени (-r) 0
размер стека (кбайт, -с) 8192
время процессора (секунды, -t) не ограничено
максимальное количество пользовательских процессов (-u) 200000
виртуальная память (кбайт, -v) не ограничена
блокировка файлов (-x) не ограничена

cat на proc также дает максимальный файл, открытый как 102400

также это значения, установленные в моем sysctl

fs.file-max = 200000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_mem = 50576 64768 98152
net.core.netdev_max_backlog = 2500

Изменить: добавлены сведения о машине и тестовый шаблон.

Тип машины: n2-highcpu-16 (16 виртуальных ЦП, 16 ГБ памяти)

Результат lscpu

Архитектура: x86_64
Режим работы процессора: 32-битный, 64-битный
Порядок байтов: Little Endian
ЦП: 16
Список процессоров в сети: 0-15
Количество потоков на ядро: 2
Количество ядер на сокет: 8
Розетка(и): 1
NUMA-узлы: 1
Идентификатор поставщика: GenuineIntel
Семейство процессоров: 6
Модель: 85
Название модели: ЦП Intel(R) Xeon(R)
Шаг: 7
ЦП МГц: 2800.200
БогоMIPS: 5600,40
Поставщик гипервизора: KVM
Тип виртуализации: полная
Кэш L1d: 32 КБ
Кэш L1i: 32 КБ
Кэш L2: 1024 КБ
Кэш L3: 33792 КБ
ЦП NUMA node0: 0-15
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves arat avx512_vnni md_clear arch_capabilities

Тестовый образец: Открытие 200 соединений в секунду и ожидание подтверждения с постоянной скоростью.

флаг jp
Какой тип машины вы использовали? Как быстро вы установили все свои связи?
флаг in
@SerhiiRohoza отредактировали вопрос и добавили заданные детали.
Matthew Ife avatar
флаг jo
Можете ли вы предоставить дополнительную информацию о брокере, который вы используете в Linux?
флаг in
@MatthewIfe Да, брокер, которого я использую, также работает в Linux. Однако я не думаю, что это должно быть основной причиной, поскольку я могу открывать 12-тысячные соединения с моего локального сервера, но только 2-тысячные соединения с моего тестового сервера.
Matthew Ife avatar
флаг jo
Меня интересует программная реализация, которую вы используете, поскольку разные механизмы параллелизма имеют разные ограничения. Кроме того, ваши ulimits в вашей оболочке не обязательно являются ulimits программного обеспечения, но, поскольку вы не предложили ни реализацию используемого вами брокера, ни средства, с помощью которых вы его развернули, недостаточно информации для работы.
флаг in
Используемые брокеры — это брокеры emqx, развернутые на аналогичной машине gcloud. Ulimits, указанные выше, являются ulimit клиента, который пытается установить соединение с брокером.
John Hanley avatar
флаг cn
Я могу ошибаться, но я думаю, что ваша виртуальная машина GCP может одновременно открывать порты брандмауэром/шлюзом VPC. Соединения в Google Cloud сохраняют состояние и отслеживаются, поэтому обратный трафик принимается.
John Hanley avatar
флаг cn
Типы машин с 1–8 виртуальными ЦП ограничены 500 подключениями на виртуальный ЦП за 5 секунд, а для более крупных типов машин — до 4000. https://cloud.google.com/vpc/docs/quota#per_instance Это не соответствует вашему потолку 2000 года...
Рейтинг:1
флаг in

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

Я нажимал общедоступный IP-адрес LoadBalancer со своей тестовой виртуальной машины. Однако GCP имеет ограничение на максимальное количество подключений 2048 от виртуальной машины к общедоступному IP-адресу. Как только я изменил это на частный IP, я смог установить около 65 тысяч подключений.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.