Сценарий. У нас есть ряд клиентов Windows, которые регулярно загружают большие файлы (FTP / SVN / HTTP PUT / SCP) на серверы Linux, которые находятся на расстоянии ~ 100-160 мс. У нас есть синхронная пропускная способность 1 Гбит / с в офисе, и серверы являются либо экземплярами AWS, либо физически размещены в DC США.
Первоначальный отчет состоял в том, что загрузка на новый экземпляр сервера была намного медленнее, чем могла бы быть. Это подтвердилось в тестировании и из разных мест; клиенты видели стабильные 2-5 Мбит / с на хосте из своих систем Windows.
Я iperf -s
подключился к экземпляру AWS, а затем к клиенту Windows в офисе:
iperf -c 1.2.3.4
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55185
[ 5] 0.0-10.0 sec 6.55 MBytes 5.48 Mbits/sec
iperf -w1M -c 1.2.3.4
[ 4] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55239
[ 4] 0.0-18.3 sec 196 MBytes 89.6 Mbits/sec
Последняя цифра может значительно отличаться в последующих тестах (капризы AWS), но обычно она составляет от 70 до 130 Мбит / с, что более чем достаточно для наших нужд. Перефразируя сеанс, я вижу:
iperf -c
Windows SYN - окно 64 КБ, масштаб 1 - Linux SYN, ACK: окно 14 КБ, масштаб: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64 КБ, Масштаб 1 - Linux SYN, ACK: Окно 14 КБ, Масштаб: 9
Ясно, что ссылка может поддерживать эту высокую пропускную способность, но я должен подробно установить размер окна, чтобы использовать его, что большинство реальных приложений мне не позволят. TCP-рукопожатия используют одинаковые начальные точки в каждом случае, но принудительное масштабирование
И наоборот, из клиента Linux в той же сети прямой iperf -c
(с использованием системного значения по умолчанию 85 КБ) дает мне:
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 33263
[ 5] 0.0-10.8 sec 142 MBytes 110 Mbits/sec
Без какого-либо принуждения он масштабируется, как и ожидалось. Это не может быть что-то в промежуточных переходах или наших локальных коммутаторах / маршрутизаторах и, похоже, влияет на клиентов Windows 7 и 8 одинаково. Я прочитал много руководств по автонастройке, но они, как правило, вообще отключают масштабирование, чтобы обойти плохой ужасный комплект домашней сети.
Может кто-нибудь сказать мне, что здесь происходит, и дать мне способ исправить это? (Желательно что-то, что я могу прикрепить к реестру через GPO.)
Примечания
В рассматриваемом экземпляре AWS Linux применяются следующие настройки ядра sysctl.conf
:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_rmem = 4096 1048576 16777216
net.ipv4.tcp_wmem = 4096 1048576 16777216
Я использовал dd if=/dev/zero | nc
перенаправление /dev/null
на конец сервера, чтобы исключить iperf
и устранить любые другие возможные узкие места, но результаты практически одинаковы. Тесты с ncftp
(Cygwin, Native Windows, Linux) масштабируются во многом так же, как и вышеупомянутые тесты iperf на соответствующих платформах.
редактировать
Здесь я обнаружил еще одну непротиворечивую вещь, которая может иметь значение:
Это первая секунда захвата 1 МБ, увеличенная. Вы можете увидеть медленный запуск в действии, когда окно масштабируется и буфер увеличивается. Затем появляется это крошечное плато, равное ~ 0,2 с, точно в той точке, в которой тест iperf окна по умолчанию выравнивается навсегда. Это, конечно, масштабируется до гораздо более высоких головокружительных высот, но любопытно, что есть такая пауза в масштабировании (значения составляют 1022 байта * 512 = 523264), прежде чем он это сделает.
Обновление - 30 июня.
Вслед за различными ответами:
- Включение CTCP - это не имеет значения; масштабирование окна идентично. (Если я правильно понимаю, этот параметр увеличивает скорость, с которой увеличивается окно перегрузки, а не максимальный размер, который он может достичь)
- Включение меток времени TCP. - Здесь тоже без изменений.
- Алгоритм Нэгла - это имеет смысл, и, по крайней мере, это означает, что я, вероятно, могу игнорировать эти специфические всплески на графике как любое указание на проблему.
- Файлы pcap: Zip-файл доступен здесь: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (анонимизируется с помощью bittwiste, извлекается в ~ 150 МБ, поскольку есть по одному от каждого клиента ОС для сравнения)
Обновление 2 - 30 июня
О, так что, следуя предложению Кайла, я включил ctcp и отключил разгрузку дымохода: TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : ctcp
ECN Capability : disabled
RFC 1323 Timestamps : enabled
Initial RTO : 3000
Non Sack Rtt Resiliency : disabled
Но, к сожалению, без изменений в пропускной способности.
У меня действительно есть вопрос причины / следствия здесь, хотя: Графики имеют значение RWIN, установленное в ACK сервера для клиента. Что касается клиентов Windows, то правильно ли я считаю, что Linux не масштабирует это значение выше этой нижней точки, поскольку ограниченный CWIN клиента не позволяет заполнить даже этот буфер? Может ли быть какая-то другая причина, по которой Linux искусственно ограничивает RWIN?
Примечание: я пытался включить ECN, черт побери; но без изменений, там.
Обновление 3 - 31 июня.
Без изменений после отключения эвристики и автонастройки RWIN. Обновите сетевые драйверы Intel до последней версии (12.10.28.0) с помощью программного обеспечения, которое предоставляет функциональные настройки с помощью вкладок диспетчера устройств. Плата представляет собой встроенную сетевую плату с набором микросхем 82579 В (я собираюсь провести дополнительное тестирование от клиентов с Realtek или других поставщиков).
Сосредоточившись на сетевой карте, я попробовал следующее (в основном просто исключаю маловероятных преступников):
- Увеличьте приемные буферы до 2k с 256 и передайте буферы до 2k с 512 (оба теперь максимально) - без изменений
- Отключена вся выгрузка контрольной суммы IP / TCP / UDP. - Без изменений.
- Отключено Большая отправка разгрузки - Nada.
- Выключил IPv6, планирование QoS - Nowt.
Обновление 3 - 3 июля
Пытаясь устранить сторону сервера Linux, я запустил экземпляр Server 2012R2 и повторил тесты, используя iperf
(бинарный файл cygwin) и NTttcp .
С iperf
, я должен был явно указать -w1m
на обе стороны , прежде чем соединение будет масштабироваться за ~ 5 Мбит / с. (Между прочим, я мог быть проверен, и BDP ~ 5 Мбит с задержкой 91 мс почти точно 64 КБ. Определите предел ...)
Двоичные файлы ntttcp показали такое ограничение. Используя ntttcpr -m 1,0,1.2.3.5
на сервере и ntttcp -s -m 1,0,1.2.3.5 -t 10
на клиенте, я вижу гораздо лучшую пропускную способность:
Copyright Version 5.28
Network activity progressing...
Thread Time(s) Throughput(KB/s) Avg B / Compl
====== ======= ================ =============
0 9.990 8155.355 65536.000
##### Totals: #####
Bytes(MEG) realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
79.562500 10.001 1442.556 7.955
Throughput(Buffers/s) Cycles/Byte Buffers
===================== =========== =============
127.287 308.256 1273.000
DPCs(count/s) Pkts(num/DPC) Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
1868.713 0.785 9336.366 0.157
Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
57833 14664 0 0 9.476
8MB / s поднимает это на уровнях, которые я получал с явно большими окнами iperf
. Как ни странно, 80 МБ в 1273 буферах снова = буфер 64 КБ. Еще один Wireshark показывает хороший, переменный RWIN, возвращаемый с сервера (масштабный коэффициент 256), который клиент, кажется, выполняет; так что, возможно, ntttcp искажает окно отправки.
Обновление 4 - 3 июля
По запросу @ karyhead я провел еще несколько тестов и сгенерировал еще несколько снимков, здесь: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Еще два
iperf
s, оба с Windows на тот же сервер Linux, что и раньше (1.2.3.4): один с размером сокета 128 КБ и окном по умолчанию 64 КБ (снова ограничивается ~ 5 Мбит / с), а другой с окном отправки 1 МБ и сокетом по умолчанию 8 КБ размер. (весы выше) - Одна
ntttcp
трассировка от того же клиента Windows к экземпляру Server 2012R2 EC2 (1.2.3.5). Здесь пропускная способность хорошо масштабируется. Примечание: NTttcp делает что-то странное с портом 6001 перед тем, как открыть тестовое соединение. Не уверен, что там происходит. - Одна трассировка данных FTP с загрузкой 20 МБ
/dev/urandom
на почти идентичный хост Linux (1.2.3.6) с использованием Cygwinncftp
. Опять предел есть. Пример такой же, как в Windows Filezilla.
Изменение iperf
длины буфера делает ожидаемую разницу с графиком временной последовательности (намного больше вертикальных секций), но фактическая пропускная способность остается неизменной.
netsh int tcp set global timestamps=enabled