Рейтинг:2

Настройка маршрутизатора и сервера Linux для повышения производительности/устранение медленной скорости одного TCP-соединения

флаг au

У меня самая простая/обычная сетевая архитектура.

Веб-сервер находится за маршрутизатором в локальной сети. Этот маршрутизатор выполняет iptables DNAT, поэтому осуществляется переадресация портов на веб-сервер.

Поэтому я могу загрузить файл с сервера 1 на свой компьютер через Интернет.

введите описание изображения здесь

Мои вопросы

  1. Как правильно настроить ядро, чтобы гарантировать, что маршрутизатор использует большую часть своего потенциала (около 2000 соединений и максимальная пропускная способность)? У меня проблема в ORANGE

  2. Параметры ядра выглядят нормально на сервере 1?

  3. Объясните, почему у меня с Сервера 1 всего 3 Мбит/с, а ЦП и ОЗУ не перегружены? Итак, вы видите другие проблемы, кроме ядра Linux, процессора и оперативной памяти? Не могли бы вы перечислить эти возможные проблемы для изучения? 1Gbps сетевые интерфейсы, порты и т.д.? 2x1,5 ГГц ARM медленнее для маршрутизации? версия iptables?

ОС и ресурсы

Компьютер - Mac OS 8 ядер процессора x86, 16G/32G свободной оперативной памяти

Маршрутизатор - Linux DD-WRT 2 ядра процессора ARM, 270M/512M свободной оперативной памяти

Сервер 1 — Linux Ubuntu 18.04 4 ядра процессора x86, 240 МБ/32 ГБ свободной оперативной памяти (500 МБ заменены на SSD)

Сервер 2 — Linux Raspbian 1 ядро ​​процессора ARM, 95M/512M свободной оперативной памяти

МТУ

Везде 1500

ТКСКУЭЛЕН

Везде 1000

Протоколы

Скорость UDP в порядке

На скорость TCP влияет любой порт

Iptables-версия

Роутер - 1.3.7

Сервер 1 - 1.8.4

Сервер 2 - 1.6.0

Linux-версии

Роутер - 4.9.207

Сервер 1 — 5.4.0-67-универсальный

Сервер 2 - 4.14.79+

Теоретическая скорость соединения

С компа на роутер - 30 Мбит/с / 3,75 МБ/с

От роутера к веб-серверу 1 - 1 Гбит/с

От роутера к веб-серверу 2 - 1 Гбит/с

Скорость загрузки с веб-сервера (файл находится в оперативной памяти)

ТЕСТ 1: Сервер 2 -> Маршрутизатор = 800 Мбит/с

ТЕСТ 2: Сервер 2 -> Компьютер = 30 Мбит/с

ТЕСТ 3: Сервер 1 -> Маршрутизатор = 800 Мбит/с

ТЕСТ 4: Сервер 1 -> Компьютер, использующий 15 подключений = 15 Мбит/с.

ТЕСТ 5: Сервер 1 -> Компьютер = 3 Мбит/с (проблема!)

Использование ЦП составляет около нескольких процентов на любом устройстве. Средняя загрузка ЦП составляет 0,0x на всех устройствах, но сервер 1 имеет среднюю загрузку 4,6. Сервер 1 также обрабатывает около 500-1000 подключений для других целей, помимо тестов, но со скоростью около 1 Мбит/с, поэтому это не должно сильно влиять на пропускную способность тестов (если только эти подключения каким-то образом косвенно не ухудшают ситуацию).

Несмотря на то, что нагрузка выше, ТЕСТ 3 показал себя очень хорошо. Так что винить Сервер 1 по-прежнему сложно.

Нет проблем в dmesg на любом устройстве.

Мои мысли

Проблема появляется только при DNAT на маршрутизаторе и только с Сервером 1, который имеет большое количество других подключений (но эти подключения почти не работают, поэтому не должны сильно на все влиять?).

Самый интересный тест для описания в последних мыслях

Когда я выполняю многопоточную загрузку из Интернета (ТЕСТ 4), сервер 1 работает намного лучше. Таким образом, он способен достигать более высоких скоростей загрузки. Но почему одно соединение не может достичь той же скорости, что и несколько?

Параметры, которые я исследовал

Вы видите что-то, что плохо оптимизировано для Linux-маршрутизатора?

net.core.wmem_max - максимальный размер буфера отправки сокета tcp (в байтах). Увеличьте буферы чтения/записи TCP, чтобы включить масштабирование до большего размера окна. Окна большего размера увеличивают объем данных, которые необходимо передать до того, как потребуется подтверждение (ACK). Это снижает общие задержки и приводит к увеличению пропускной способности.

Для этого параметра обычно установлено очень консервативное значение 262 144 байта. Рекомендуется установить это значение настолько большим, насколько позволяет ядро. Здесь использовалось значение 4 136 960 байт. Однако ядра 4.x принимают значения более 16 МБ.

Роутер - 180224

Сервер 1 - 212992

Сервер 2 - 163840

Где-то еще б/у - 83886080

net.core.wmem_default

Роутер - 180224

Сервер 1 - 212992

Сервер 2 - 163840

Где-то еще б/у - 83886080

net.ipv4.rmem_max - максимальный размер буфера приема сокета tcp (в байтах)

Роутер - 180224

Сервер 1 - 212992

Сервер 2 - 163840

Где-то еще б/у - 335544320

net.core.rmem_default

Роутер - 180224

Сервер 1 - 212992

Сервер 2 - 163840

Где-то еще б/у - 335544320

net.ipv4.tcp_rmem - Содержит три значения, представляющие минимальный размер буфера приема сокета TCP, размер по умолчанию и максимальный размер. Рекомендуется использовать максимальное значение 16 Мбайт или выше (зависит от уровня ядра), особенно для 10-гигабитных адаптеров.

Роутер - 4096 87380 3776288

Сервер 1 - 4096 131072 6291456

Сервер 2 - 4096 87380 3515840

Где-то еще используется - 4096 87380 4136960 (IBM)

net.ipv4.tcp_wmem - Подобно net.ipv4.tcp_rmem, этот параметр состоит из 3 значений: минимум, значение по умолчанию и максимум. Рекомендуется использовать максимальное значение 16 Мбайт или выше (зависит от уровня ядра), особенно для 10-гигабитных адаптеров.

Роутер - 4096 16384 3776288

Сервер 1 - 4096 16384 4194304

Сервер 2 - 4096 16384 3515840

Где-то еще используется - 4096 87380 4136960 (IBM)

net.ipv4.tcp_tw_reuse - В средах с высоким трафиком сокеты создаются и уничтожаются с очень высокой скоростью. Этот параметр, если он установлен, позволяет использовать ненужные и находящиеся на грани уничтожения сокеты для новых соединений. Если этот параметр включен, он может обходить накладные расходы на выделение и инициализацию, обычно связанные с созданием сокета, что позволяет экономить циклы ЦП, загрузку системы и время.

Значение по умолчанию — 0 (выкл.). Рекомендуемое значение 1 (включено).

Роутер - 0

Сервер 1–2

Сервер 2 - 0

Где-то еще используется - 1

net.ipv4.tcp_tw_reuse

Роутер - 0

Сервер 1–2

Сервер 2 - 0

Где-то еще используется - 1

net.ipv4.tcp_max_tw_buckets - Определяет максимальное количество сокетов в состоянии "время ожидания", которое может существовать в любое время. При превышении максимального значения сокеты в состоянии «время ожидания» немедленно уничтожаются и отображается предупреждение. Этот параметр существует для предотвращения определенных типов атак типа «отказ в обслуживании». Следует соблюдать осторожность, прежде чем снижать это значение. При изменении его значение должно быть увеличено, особенно когда в систему добавлено больше памяти или когда требования к сети высоки, а среда менее подвержена внешним угрозам.

Роутер - 2048

Сервер 1 - 131072

Сервер 2 - 2048

Где-то еще б/у - 65536, 262144 (IBM), 45000 (IBM)

net.ipv4.tcp_tw_reuse

Роутер - 0

Сервер 1–2

Сервер 2 - 0

Где-то еще используется - 1

net.ipv4.tcp_fin_timeout

Роутер - 60

Сервер 1 - 60

Сервер 2 - 60

Где-то еще б/у - 15

net.ipv4.tcp_max_syn_backlog

Роутер - 128

Сервер 1 - 2048

Сервер 2 - 128

Где-то еще б/у - 65536

net.ipv4.ip_local_port_range - диапазон портов, используемых для исходящих TCP-соединений (полезно изменить, если у вас много исходящих соединений с хоста)

Роутер - 32768 60999

Сервер 1 - 32768 60999

Сервер 2 - 32768 60999

Где-то еще б/у - 1024 65535

net.core.netdev_max_backlog - количество слотов в кольцевом буфере приемника для поступающих пакетов (ядро ставит пакеты в эту очередь, если ЦП недоступен для их обработки, например приложением)

Роутер - 120

Сервер 1 - 1000

Сервер 2 - 1000

Где-то еще б/у - 100000, 1000 (IBM), 25000 (IBM)

net.ipv4.neigh.default.gc_thresh1

Роутер - 1

Сервер 1 - 128

Сервер 2 - 128

Где-то еще б/у - 128

net.ipv4.neigh.default.gc_thresh2

Роутер - 512

Сервер 1 - 512

Сервер 2 - 512

Где-то еще б/у - 512

net.ipv4.neigh.default.gc_thresh3

Роутер - 1024

Сервер 1 - 1024

Сервер 2 - 1024

Где-то еще б/у - 1024

net.ipv4.neigh.default.gc_thresh3

Роутер - 1024

Сервер 1 - 1024

Сервер 2 - 1024

Где-то еще б/у - 1024

net.core.somaxconn - максимальный размер очереди прослушивания для сокетов (полезная и часто упускаемая из виду настройка для балансировщиков нагрузки, веб-серверов и серверов приложений (например, unicorn, php-fpm). Если все серверные процессы/потоки заняты, то входящие клиентские соединения помещаются в «бэклог». ожидание обслуживания). Полное отставание приводит к немедленному отклонению клиентских подключений, что приводит к ошибке клиента.

Роутер - 128

Сервер 1 - 4096

Сервер 2 - 128

net.ipv4.tcp_mem - Пороги использования буферной памяти TCP для автонастройки, в страницах памяти (1 страница = 4 КБ)

Роутер - 5529 7375 11058

Сервер 1 - 381144 508193 762288

Сервер 2 - 5148 6866 10296

net.nf_conntrack_max - максимальное количество подключений

Роутер - 32768

Сервер 1 - 262144

Сервер 2 - нет информации

net.netfilter.nf_conntrack_max - максимальное количество подключений? Если это правильный параметр, то 1560 недостаточно

Роутер - 1560

Сервер 1 - 262144

Сервер 2 - нет информации

/proc/sys/net/ipv4/tcp_congestion_control - Перегрузка сети в сетях передачи данных [...] - это снижение качества обслуживания, которое происходит, когда сетевой узел передает больше данных, чем он может обработать. Типичные последствия включают задержку в очереди, потерю пакетов или блокировку новых подключений. Сети используют методы управления перегрузкой и предотвращения перегрузки, чтобы попытаться избежать коллапса перегрузки.1

Роутер - Вествуд

Сервер 1 - кубический

Сервер 2 - кубический

net.ipv4.tcp_syn_retries - Указывает, сколько раз нужно попытаться повторно передать начальный пакет SYN для активной попытки подключения TCP. Текущее значение равно 20, что означает 20 попыток повторной передачи до истечения времени ожидания соединения. Это может занять несколько минут, в зависимости от продолжительности попытки повторной передачи.

Роутер - 6

Сервер 1–6

Сервер 2 - 6

net.ipv4.tcp_low_latency - Значение по умолчанию: 0 (выкл.). Для рабочих нагрузок или сред, в которых задержка имеет более высокий приоритет, рекомендуемое значение равно 1 (включено).

Роутер - 0

Сервер 1 - 0

Сервер 2 - 0

net.ipv4.tcp_limit_output_bytes - Используя этот параметр, TCP управляет небольшими ограничениями очереди для каждого сокета TCP. TCP имеет тенденцию увеличивать объем передаваемых данных до тех пор, пока не будут получены уведомления о потере. Из-за аспектов автоматической настройки отправки TCP большие объемы данных могут быть помещены в очередь на устройстве на локальном компьютере, что может отрицательно сказаться на задержке для других потоков.tcp_limit_output_bytes ограничивает количество байтов на устройстве, чтобы уменьшить эффекты задержки, вызванные большим размером очереди.

Роутер - 262144

Сервер 1 - 1048576

Сервер 2 - 262144

Где-то еще б/у - 262 144 (IBM), 131 072 (IBM)

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

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