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

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

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

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

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

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

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

      core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63887
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 102400
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 200000
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

cat on 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

      Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                16
On-line CPU(s) list:   0-15
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 85
Model name:            Intel(R) Xeon(R) CPU
Stepping:              7
CPU MHz:               2800.200
BogoMIPS:              5600.40
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              1024K
L3 cache:              33792K
NUMA node0 CPU(s):     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 соединений в секунду и ожидание подтверждения с постоянной скоростью.

1 ответ

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

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

Другие вопросы по тегам