По умолчанию сетевой стек Linux не настроен на высокоскоростную передачу больших файлов через WAN-каналы. Это сделано для экономии ресурсов памяти. Вы можете легко настроить сетевой стек Linux, увеличив размер сетевых буферов для высокоскоростных сетей, соединяющих серверные системы для обработки большего количества сетевых пакетов.
Проверка текущих значений
Максимальные размеры буферов TCP в Linux по умолчанию слишком малы. Память TCP рассчитывается автоматически на основе системной памяти; вы можете найти фактические значения, набрав следующие команды:
1 | cat /proc/sys/net/ipv4/tcp_mem |
Стандартное и максимальное значение для памяти сокета приема:
1 2 | cat /proc/sys/net/core/rmem_default cat /proc/sys/net/core/rmem_max |
Объем по умолчанию и максимальный объем памяти сокета отправки:
1 2 | cat /proc/sys/net/core/wmem_default cat /proc/sys/net/core/wmem_max |
Максимальный объем буферов памяти параметров:
1 | cat /proc/sys/net/core/optmem_max |
Настройте значения
Установите максимальный размер буфера отправки (wmem) и буфера получения (rmem) ОС на 12 МБ для очередей по всем протоколам. Другими словами, установите объем памяти, который выделяется для каждого TCP-сокета при его открытии или создании при передаче файлов:
Значение по умолчанию rmem_max и wmem_max составляет около 128 КБ в большинстве дистрибутивов Linux, что может быть достаточно для сетевой среды общего назначения с низкой задержкой или для таких приложений, как DNS / Web-сервер. Однако, если задержка велика, размер по умолчанию может оказаться слишком маленьким. Обратите внимание, что следующие настройки приведут к увеличению использования памяти на вашем сервере.
1 2 | echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf |
Также необходимо установить минимальный размер, начальный размер и максимальный размер в байтах:
1 2 | echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf |
Масштабирование окна, которое может быть опцией для увеличения окна передачи данных:
1 | echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf |
Временные метки, как определено в RFC1323:
1 | echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf |
Выборочные подтверждения:
1 | echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf |
По умолчанию TCP сохраняет различные метрики соединения в кэше маршрутов при закрытии соединения, чтобы соединения, установленные в ближайшем будущем, могли использовать их для задания начальных условий. Обычно это повышает общую производительность, но иногда может привести к снижению производительности. Если установлено, TCP не будет кэшировать метрики при закрытии соединений.
1 | echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf |
Установите максимальное количество пакетов, которые ставятся в очередь на стороне INPUT, когда интерфейс получает пакеты быстрее, чем ядро может их обработать.
1 | echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf |
Теперь примените изменения:
1 | sysctl -p |