лучшая производительность TCP по «сети с большой задержкой»

8

Я пытаюсь улучшить пропускную способность TCP через «сеть с высокой задержкой» между компьютерами Linux.

Я поставил tcp_mem, tcp_wmemи tcp_rmemк «8192 7061504 7061504».
Я установил rmem_max, wmem_max, rmem_defaultи wmem_defaultв «7061504».
Я установил netdev_max_backlogи txqueuelen10000.
Я установил tcp_congestion_control«масштабируемый».

Я использую «nist» (cnistnet) для имитации задержки в 100 мс, а BW, которого я достигаю, составляет около 200 Мбит / с (без задержки я достигаю около 790 Мбит / с).

Я использую iperf для выполнения тестов и TCPTrace для анализа результатов, и вот что я получил:

На стороне получателя:
максимальный выигрыш adv: 5294720 байт
avg win adv: 5273959 байтов
sack отправлено pkts: 0

На стороне отправителя:
фактические байты данных: 3085179704
байты данных rexmt: 9018144
макс. Owin: 5294577 байт
avg owin: 3317125 байт
RTT min: 19,2 мс
RTT max: 218,2 мс
RTT avg: 98,0 мс

Почему я достигаю только 200 Мбит / с? Я подозреваю, что «owin» имеет какое-то отношение к этому, но я не уверен (эти результаты теста 2 минуты. Тест 1 минуты имел «avg owin» 1552900)…

Неправильно ли ожидать, что пропускная способность будет почти 790 Мбит / с, даже если задержка составляет 100 мс?

(Я попытался использовать большие числа в конфигурациях окна, но это, похоже, не дало эффекта)


источник
У вас есть настоящее оборудование здесь. TCP принимает процессор, NIC имеет свой собственный буфер, ACPI имеет свой собственный предел и т. Д.
J-16 SDiZ

Ответы:

3

Это распространенная проблема TCP, называемая "Long Fat Pipe". Если вы воспользуетесь этой фразой Google и TCP, вы найдете много информации об этой проблеме и возможных решениях.

В этом потоке есть куча расчетов и предложений по настройке стека TCP Linux для такого рода вещей.

3dinfluence
источник
1

Сайт

http://www.psc.edu/networking/projects/tcptune/

упоминает, что, поскольку Linux в настоящее время автоматически настраивает параметры TCP, использование этих значений, скорее всего, не улучшит ситуацию.

При этом, возможно, 100 мс вместе с большой пропускной способностью (по крайней мере, 790 Мбит / с) могут привести к огромному BDP, поэтому, возможно, автонастройка решит, что что-то не так, и не зайдет достаточно далеко ...

janneb
источник
В зависимости от версии ядра, я видел, что автонастройка выходит далеко за пределы 20 МБ.
PFO
Похоже, это переехало в psc.edu/index.php/networking/641-tcp-tune
dland
0

Попробуйте установить размер окна iperf, чтобы он действительно определял произведение полосы пропускания и задержки для этой ссылки. Так в среднем RTT * 1 Гбит / с должен дать вам примерно 10 МБ. Посмотрим, улучшится ли это.

PFO
источник
0

Единственный способ начать понимать, что происходит, - это получить больше данных, иначе вы просто угадываете или просите других угадать. Я рекомендую получить представление уровня системы (процессор, память, прерывания и т. Д.) sarИз iostatпакета. Также вы должны получить дамп пакета с помощью Wireshark или tcpdump. Затем вы можете использовать Wireshark для анализа, так как для этого есть много инструментов. Вы можете график размера окна с течением времени, потери пакетов и т. Д.

Даже небольшая потеря пакетов в канале с высокой задержкой значительно снижает пропускную способность. Хотя быть смоделированным - это немного странно. Множество небольших пакетов также могут вызывать большие прерывания (даже если они также могут быть смоделированы?).

Короче говоря, получите TCPDump и Sar, чтобы увидеть, что происходит на уровне пакетов и с вашими системными ресурсами.

Кайл Брандт
источник
0

Сколько памяти у этой машины? Эти tcp_memнастройки , кажется, с ума, он настроен 28gb (7061504 * 4kb) для данных TCP на глобальном уровне . (Но это не ваша проблема перфорации, так как вы, скорее всего, не достигнете этого предела при запуске теста с несколькими сокетами. Просто хотел бы упомянуть об этом, поскольку установка tcp_mem в значения tcp_xmem показывает очень распространенное ошибочное представление).

7 МБ, которые вы настроили по умолчанию, кажется нормальным. Максимум, однако, может возрасти намного выше на трубах с большой задержкой. Для тестирования я бы использовал 64MB в качестве максимального числа для, tcp_wmemи tcp_rmemтогда вы можете исключить, что это ваш ограничивающий фактор. (Это увеличивает ваши буферы, поэтому работает только в том случае, если у вас ограниченный параллелизм и у соединения низкий джиттер и дропс).

Экес
источник