Я пытаюсь улучшить пропускную способность TCP через «сеть с высокой задержкой» между компьютерами Linux.
Я поставил tcp_mem
, tcp_wmem
и tcp_rmem
к «8192 7061504 7061504».
Я установил rmem_max
, wmem_max
, rmem_default
и wmem_default
в «7061504».
Я установил netdev_max_backlog
и txqueuelen
10000.
Я установил 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, называемая "Long Fat Pipe". Если вы воспользуетесь этой фразой Google и TCP, вы найдете много информации об этой проблеме и возможных решениях.
В этом потоке есть куча расчетов и предложений по настройке стека TCP Linux для такого рода вещей.
источник
Сайт
http://www.psc.edu/networking/projects/tcptune/
упоминает, что, поскольку Linux в настоящее время автоматически настраивает параметры TCP, использование этих значений, скорее всего, не улучшит ситуацию.
При этом, возможно, 100 мс вместе с большой пропускной способностью (по крайней мере, 790 Мбит / с) могут привести к огромному BDP, поэтому, возможно, автонастройка решит, что что-то не так, и не зайдет достаточно далеко ...
источник
Попробуйте установить размер окна iperf, чтобы он действительно определял произведение полосы пропускания и задержки для этой ссылки. Так в среднем RTT * 1 Гбит / с должен дать вам примерно 10 МБ. Посмотрим, улучшится ли это.
источник
Единственный способ начать понимать, что происходит, - это получить больше данных, иначе вы просто угадываете или просите других угадать. Я рекомендую получить представление уровня системы (процессор, память, прерывания и т. Д.)
sar
Изiostat
пакета. Также вы должны получить дамп пакета с помощью Wireshark или tcpdump. Затем вы можете использовать Wireshark для анализа, так как для этого есть много инструментов. Вы можете график размера окна с течением времени, потери пакетов и т. Д.Даже небольшая потеря пакетов в канале с высокой задержкой значительно снижает пропускную способность. Хотя быть смоделированным - это немного странно. Множество небольших пакетов также могут вызывать большие прерывания (даже если они также могут быть смоделированы?).
Короче говоря, получите TCPDump и Sar, чтобы увидеть, что происходит на уровне пакетов и с вашими системными ресурсами.
источник
Сколько памяти у этой машины? Эти
tcp_mem
настройки , кажется, с ума, он настроен 28gb (7061504 * 4kb) для данных TCP на глобальном уровне . (Но это не ваша проблема перфорации, так как вы, скорее всего, не достигнете этого предела при запуске теста с несколькими сокетами. Просто хотел бы упомянуть об этом, поскольку установка tcp_mem в значения tcp_xmem показывает очень распространенное ошибочное представление).7 МБ, которые вы настроили по умолчанию, кажется нормальным. Максимум, однако, может возрасти намного выше на трубах с большой задержкой. Для тестирования я бы использовал 64MB в качестве максимального числа для,
tcp_wmem
иtcp_rmem
тогда вы можете исключить, что это ваш ограничивающий фактор. (Это увеличивает ваши буферы, поэтому работает только в том случае, если у вас ограниченный параллелизм и у соединения низкий джиттер и дропс).источник