Вчера я получил новое и блестящее соединение VDSL2 дома! Он рассчитан на 100 Мбит /10 Мбит, и, кажется, довольно близко к отметке.

Теперь у меня есть Debian Linux, работающий как домашний NAS и маршрутизатор. Это работает shorewall, с включенным NAT и tc. У меня также есть рабочая станция OSX, подключенная через коммутатор к указанному маршрутизатору Linux:

Рабочая станция OSX <-> Switch <-> Маршрутизатор Debian <-> Модем VDSL2 <-> Интернет <-> Сервер

Я провел тесты на моем быстром сервере в интернете:

На роутере Linux, TCP:

$ iperf -c server -p 3333
------------------------------------------------------------
Client connecting to server, TCP port 3333
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local xxx.yyy.bbb.ccc port 41982 connected with xxx.yyy.bbb.ccc port 3333
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  2.89 MBytes  2.42 Mbits/sec

На вышесказанном есть проблема. Восходящий канал должен быть ~ 10 Мбит, а не 2,4 Мбит. Ниже вы можете увидеть, что UDP работает нормально.

На роутере Linux, UDP:

$ iperf -u -c server -p 60008 -b 9M
------------------------------------------------------------
Client connecting to server, UDP port 60008
Sending 1470 byte datagrams
UDP buffer size: 1.00 MByte (default)
------------------------------------------------------------
[  3] local xxx.yyy.bbb.ccc port 56484 connected with xxx.yyy.bbb.ccc port 60008
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  10.7 MBytes  9.00 Mbits/sec
[  3] Sent 7658 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec  10.7 MBytes  9.00 Mbits/sec  0.251 ms    0/ 7657 (0%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

И на рабочей станции OSX (за NAT) TCP:

$ iperf -c server -p 3333
------------------------------------------------------------
Client connecting to server, TCP port 3333
TCP window size: 65.0 KByte (default)
------------------------------------------------------------
[  5] local 192.168.9.141 port 54388 connected with xxx.yyy.bbb.ccc port 3333
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0-10.0 sec  13.2 MBytes  11.1 Mbits/sec

OSX позади маршрутизатора linux, кажется, не затронуты проблемами на маршрутизаторе linux. Как это может случиться? UDP тоже работает нормально.

И на рабочей станции OSX (за NAT) UDP:

$ iperf -u -c server -p 60008 -b 9M
------------------------------------------------------------
Client connecting to server, UDP port 60008
Sending 1470 byte datagrams
UDP buffer size: 9.00 KByte (default)
------------------------------------------------------------
[  5] local 192.168.9.141 port 64588 connected with xxx.yyy.bbb.ccc port 60008
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0-10.0 sec  10.7 MBytes  9.00 Mbits/sec
[  5] Sent 7658 datagrams
[  5] Server Report:
[ ID] Interval       Transfer     Bandwidth       Jitter   Lost/Total Datagrams
[  5]  0.0-10.0 sec  10.7 MBytes  9.00 Mbits/sec  0.133 ms    0/ 7658 (0%)

Как видите, окно linux застряло на исходящем TCP со скоростью 2,5 Мбит / с. UDP работает нормально, а рабочая станция за маршрутизатором работает нормально.

Чтобы упростить ситуацию, я изменил свой Shorewall TC до базового уровня. Я также попытался полностью отключить TC от shorewall без какого-либо эффекта. :

tcdevices:

#INTERFACE  IN-BANDWITH OUT-BANDWIDTH
eth0        -           12000kbit

tcclasses:

#INTERFACE      MARK    RATE            CEIL        PRIORITY    OPTIONS
eth0            1       full            full        1           default

tcrules:

#MARK           SOURCE          DEST            PROTO   PORT(S) CLIENT   USER
1:F             0.0.0.0/0       0.0.0.0/0       icmp    echo-request
1:F             0.0.0.0/0       0.0.0.0/0       icmp    echo-reply

У вас есть идеи, где может быть проблема? Единственное, что не используется по умолчанию в Debian - это ядро 3.2.0 из backports. Это мощная машина Xeon с большим количеством оперативной памяти и сетевых карт Intel. Все тесты были выполнены в короткие сроки практически без другого сетевого трафика. И повторяется несколько раз. Где я могу начать отладку?

2 ответа2

0

Я нашел решение проблемы. Все, что мне нужно было сделать, это отключить разгрузку сегментации на сетевой карте:

ethtool -K eth0 gso off tso off

Это решило проблему для меня. Видимо, это довольно часто.

0

Пара баллов:

1.) TCP может потребоваться немного, чтобы разогнаться до полной скорости - как с точки зрения нахождения подходящего размера окна для более длинных потоков, так и с точки зрения времени установки для более коротких потоков (то есть 1,5 x RTT, выполняющих рукопожатия с TCP / против немедленного запуска с UDP). 10 мегабайт не очень много данных. По мере приближения к отметке 1G средняя скорость TCP улучшается.

2.) Даже при полной оптимизации существует компромисс между надежностью и производительностью. TCP может быть чрезмерно чувствительным к микровзрывам даже в идеальных лабораторных условиях. Запуск через настройку DSL (независимо от того, насколько быстро) потенциально может подвергать поток трафика различным объемам буферизации, задержке сериализации и т.д. Опять же, это имеет тенденцию усредняться по более длинным потокам. UDP (особенно в тестах производительности) будет передавать данные настолько интенсивно, насколько это возможно, без учета потери пакетов, переполнения буфера и т.д.

Таким образом, идея с оконным TCP-соединением заключается в том, что если он работает идеально, то мы сталкиваемся с ситуацией, когда существует оптимальный объем трафика в полете с наименьшим возможным процентом накладных расходов (т. Е. Подтверждения, заголовки TCP и т.д.). Действительно, объем транзитного трафика должен обеспечивать постоянную пропускную способность, даже если будут поступать подтверждения. Производительность TCP будет асимптотически приближаться к широко открытой передаче данных.

UDP, напротив, является широко открытой передачей данных ...

Теперь - разница в производительности между различными платформами будет зависеть от конкретной реализации TCP, а также от того, как сама система будет определять приоритеты ввода / вывода и обработки протокола. Может быть твик или два, которые приведут эти два значения в лучшее соотношение. Размер выборки все еще будет проблемой, хотя. Чем больше тестов и чем больше размер, тем точнее результаты.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .