Есть две полностью идентичные машинки, на которых объединены в один интерфейс пары сабжевых сетевых карт.
На двух хостах идентичные параметры сетевого стека:
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 65536 8388608
net.core.netdev_max_backlog = 15000
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = cubic
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
Поскольку RTL8111/8168B не поддерживает MTU свыше 7200, то это значение и было указано для всех участвующих в тесте интерфейсов:
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
bond0 7200 0 16388743 0 0 0 17106828 0 92 0 BMmRU
eth1 7200 0 8194372 0 0 0 8553414 0 46 0 BMsRU
eth2 7200 0 8194371 0 0 0 8553414 0 46 0 BMsRU
Я не стал изобретать что-то своё и использовал для тестирования TCP-соединений iperf в режиме TCP-сервера, т.к. основной трафик исследуемого канала будет TCP, а не UDP.
Соответственно, на одном хосте включил сервер с буфером в 25 Кб, максимально широким окном и размером сегмента :
iperf -s -m -M 100000 -w 1M -l 24K
На другом — запустил скрипт примерно такого вида:
for y in $(seq 1 1);
do
for i in $(seq $1 $2 $3);
do
DIMENS=$(iperf -c $4 -w 1M -l 24K -M $i -f K | grep '3\]' | grep -v 'connected' | sed 's/^.\+ sec//' | awk '{print $3}');
echo "$i $DIMENS" >> "test-mtu-Kbytes-$4-iteration-$y" ;
done;
done
который в цикле перебирает размер сегмента и соединяется с сервером на первом хосте.
// внешний цикл для того, чтобы, создать несколько файлов с отчётом, в данном случае мне понадобился один прогон, чтобы определить, куда рыть
Как видно на картинке (а мне и в файле), для MTU между 2300 б и 2400 б наблюдается катастрофическое падение скорости: с 214478 Кб/с до 150 Кб/с в среднем.
На этом я не закончил, далее, если вскроются интересные особенности, напишу.