Назад | Перейти на главную страницу

socat tun устройство очень низкая пропускная способность

Я возился с socat и попытался использовать socat для создания устройства TUN для туннелирования между двумя серверами debian stretch. Однако пропускная способность казалась очень низкой, и по сравнению с iperf против TCP / TCP-Listen на локальном хосте, TUN имеет пропускную способность примерно на 5 порядков меньше.

Вот «минимальный рабочий пример», показывающий, как это влияет на скорость.

socat с устройством TUN

На стороне сервера:

# 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 с TCP / TCP-LISTEN

На стороне сервера:

# 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

Полученные результаты

Устройство TUN:

[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-39.7 sec   640 KBytes   132 Kbits/sec

TCP / TCP-СЛУШАТЬ:

[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-30.0 sec  3.30 GBytes   944 Mbits/sec

Если вы хотите воспроизвести результаты, используя приведенные выше строки, вам нужно каким-то образом запустить строки socat и сервер iperf в фоновом режиме или демонизировать, я просто использовал сеансы экрана.

Итак, хотя я предполагал, что пропускная способность в какой-то степени пострадает, мне кажется странным, что она снизится с предполагаемого гигабита (оба сервера на одном коммутаторе) до простых 100 Кбит. Быстрый взгляд на atop не показывает значительных узких мест, так что дело не только в загрузке ЦП или потреблении оперативной памяти.

Почему такая низкая пропускная способность? Я сделал какую-то логическую ошибку? Или проблема в ядре, плохая реализация в socat или неправильное использование iperf?

Есть ли какие-то параметры или настройки (ядро, socat, что-нибудь), чтобы улучшить это? Что я могу проверить? И, что наиболее важно, могу ли я использовать устройство TUN, которое дает мне полезную пропускную способность?