У меня два сервера, расположенных в двух разных центрах обработки данных. Оба сервера имеют дело с множеством одновременных передач больших файлов. Но производительность сети очень низкая для больших файлов, и снижение производительности происходит с большими файлами. Как мне настроить TCP под Linux, чтобы решить эту проблему?
По умолчанию сетевой стек Linux не настроен для высокоскоростной передачи больших файлов по каналам WAN. Это сделано для экономии ресурсов памяти. Вы можете легко настроить сетевой стек Linux, увеличив размер сетевых буферов для высокоскоростных сетей, которые соединяют серверные системы для обработки большего количества сетевых пакетов.
Максимальный размер буфера TCP в Linux по умолчанию слишком мал. Память TCP рассчитывается автоматически на основе системной памяти; вы можете найти фактические значения, введя следующие команды:
cat /proc/sys/net/ipv4/tcp_mem
Объём для принимающей памяти сокета по умолчанию и максимальный:
cat /proc/sys/net/core/rmem_default cat /proc/sys/net/core/rmem_max
По умолчанию и максимальный объём памяти для сокета отправки:
cat /proc/sys/net/core/wmem_default cat /proc/sys/net/core/wmem_max
Максимальный объём опциональных буферов памяти:
cat /proc/sys/net/core/optmem_max
Как настроить эти значения
Внимание: значение по умолчанию для rmem_max и wmem_max составляет около 208 КБ в большинстве дистрибутивов Linux, что может быть достаточно для сетевой среды общего назначения с низкой задержкой или для таких приложений, как DNS/веб-сервер. Однако, если задержка велика, размер по умолчанию может быть слишком маленьким. Обратите внимание, что следующие настройки увеличивают использование памяти на вашем сервере.
Установите максимальный размер буфера отправки (wmem) ОС и размер буфера приёма (rmem) равным 12 МБ для очередей по всем протоколам. Другими словами, установите объём памяти, который выделяется для каждого сокета TCP, когда он открывается или создаётся при передаче файлов:
sudo su - echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
Вам также необходимо установить минимальный размер, начальный размер и максимальный размер в байтах:
echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf
Включите масштабирование окна, которое может быть опцией увеличения окна передачи:
echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf
Включите отметки времени, как определено в RFC1323:
echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf
Включить выбор подтверждений:
echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf
По умолчанию TCP сохраняет различные метрики соединения в кэше маршрута при закрытии соединения, так что соединения, установленные в ближайшем будущем, могут использовать их для установки начальных условий. Обычно это увеличивает общую производительность, но иногда может вызывать снижение производительности. Если установлено, TCP не будет кэшировать метрики при закрытии соединений.
echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf
Установите максимальное количество пакетов, помещаемых в очередь на стороне INPUT, когда интерфейс получает пакеты быстрее, чем ядро может их обработать.
echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
Теперь перезагрузите изменения:
sysctl -p
Используйте tcpdump для просмотра изменений для eth0:
sudo tcpdump -ni eth0
Связанные статьи:
- Как использовать команду ip в Linux (100%)
- Ошибка «sendmsg: Недостаточно буферного пространства» (РЕШЕНО) (100%)
- Где NetworkManager хранит настройки (РЕШЕНО) (100%)
- Как запретить NetworkManager управлять определённым интерфейсом? (РЕШЕНО) (77.5%)
- Почему при смене MAC-адреса в VirtualBox пропадает подключение (РЕШЕНО) (77.5%)
- Как сервер TigerVNC сделать доступным из вне. Как подключиться к серверу TigerVNC через SSH туннель (RANDOM - 27.5%)