Я возился с socat и попытался использовать socat для создания устройства TUN для туннелирования между двумя серверами debian stretch. Однако пропускная способность казалась очень низкой, и по сравнению с iperf против TCP / TCP-Listen на локальном хосте, TUN имеет пропускную способность примерно на 5 порядков меньше.
Вот «минимальный рабочий пример», показывающий, как это влияет на скорость.
# socat
socat TUN:10.10.0.2/16,iff-up TCP4-LISTEN:54321,bind=192.168.1.2,fork
# iperf service
iperf -s -p 15001 -B 10.10.0.2
# socat
socat TUN:10.10.0.1/16,iff-up TCP4:192.168.1.2:54321
# iperf
iperf -c 10.10.0.2 -p 15001 -t 30
# socat
socat TCP4-LISTEN:12345,bind=192.168.1.2,fork TCP4:127.0.0.1:15001
# iperf service
iperf -s -p 15001 -B 127.0.0.1
# socat
socat TCP4-LISTEN:54321,bind=127.0.0.1,fork TCP4:192.168.1.2:12345
# iperf
iperf -c 127.0.0.1 -p 54321 -t 30
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-39.7 sec 640 KBytes 132 Kbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-30.0 sec 3.30 GBytes 944 Mbits/sec
Если вы хотите воспроизвести результаты, используя приведенные выше строки, вам нужно каким-то образом запустить строки socat и сервер iperf в фоновом режиме или демонизировать, я просто использовал сеансы экрана.
Итак, хотя я предполагал, что пропускная способность в какой-то степени пострадает, мне кажется странным, что она снизится с предполагаемого гигабита (оба сервера на одном коммутаторе) до простых 100 Кбит. Быстрый взгляд на atop
не показывает значительных узких мест, так что дело не только в загрузке ЦП или потреблении оперативной памяти.
Почему такая низкая пропускная способность? Я сделал какую-то логическую ошибку? Или проблема в ядре, плохая реализация в socat или неправильное использование iperf?
Есть ли какие-то параметры или настройки (ядро, socat, что-нибудь), чтобы улучшить это? Что я могу проверить? И, что наиболее важно, могу ли я использовать устройство TUN, которое дает мне полезную пропускную способность?