zaLinux.ru

Тонкая настройка сетевого стека Linux (размер буферов) для повышения производительности сети


У меня два сервера, расположенных в двух разных центрах обработки данных. Оба сервера имеют дело с множеством одновременных передач больших файлов. Но производительность сети очень низкая для больших файлов, и снижение производительности происходит с большими файлами. Как мне настроить 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

Рекомендуемые статьи:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *