У меня самая простая/обычная сетевая архитектура.
Веб-сервер находится за маршрутизатором в локальной сети. Этот маршрутизатор выполняет iptables DNAT, поэтому осуществляется переадресация портов на веб-сервер.
Поэтому я могу загрузить файл с сервера 1 на свой компьютер через Интернет.
Мои вопросы
Как правильно настроить ядро, чтобы гарантировать, что маршрутизатор использует большую часть своего потенциала (около 2000 соединений и максимальная пропускная способность)? У меня проблема в ORANGE
Параметры ядра выглядят нормально на сервере 1?
Объясните, почему у меня с Сервера 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)