Сценарій: У нас багато клієнтів Windows регулярно завантажують великі файли (FTP / SVN / HTTP PUT / SCP) на сервери Linux, від яких ~ 100-160 м. У нас в офісі є синхронна пропускна здатність 1 Гбіт / с, а сервери є або AWS-прикладами, або фізично розміщені в постійних токах США.
Початковий звіт полягав у тому, що завантаження на новий екземпляр сервера відбувається набагато повільніше, ніж могло бути. Це було результатом тестування та з декількох локацій; клієнти бачили стабільні 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
Останній показник може суттєво відрізнятися від наступних тестів (Vagaries AWS), але зазвичай становить від 70 до 130 Мбіт / с, що більш ніж достатньо для наших потреб. Підключивши сеанс, я бачу:
iperf -c
Windows SYN - вікно 64kb, масштаб 1 - Linux SYN, ACK: вікно 14kb, масштаб: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64kb, масштаб 1 - Linux SYN, ACK: вікно 14kb, масштаб: 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. - Тут також ніяких змін.
- Алгоритм Nagle - Це має сенс і, принаймні, це означає, що я, мабуть, можу ігнорувати ці конкретні пробіли в графіку, як будь-які вказівки на проблему.
- Файли 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) за допомогою програмного забезпечення, яке розкриває функціональні можливості, налаштовуючи вкладки менеджера viadevice. Картка - це мікросхема 82579 В на борту NIC - (я збираюся зробити ще тестування від клієнтів з realtek або іншими постачальниками)
На деякий час зосередившись на NIC, я спробував таке (здебільшого просто виключаючи малоймовірних винуватців):
- Збільшення буферів прийому до 2k з 256 та передавання буферів до 2k від 512 (Обидва зараз максимум) - Без змін
- Вимкнено завантаження всіх контрольних сум IP / TCP / UDP. - Без змін.
- Інвалідизовані великі розвантаження відправки - Nada.
- Вимкнено IPv6, планування QoS - Nowt.
Оновлення 3 - 3 липня
Намагаючись усунути сторону сервера Linux, я запустив екземпляр Server 2012R2 і повторив тести з використанням iperf
(cygwin binary) та 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
8 Мб / с ставить його на рівні, які я отримував із явно великими вікнами в iperf
. Як не дивно, але 80 МБ у 1273 буфері = знову буфер 64 кБ. Подальший опис проводів показує хороший змінний 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): один з розміром сокета 128k і типом 64k за замовчуванням (знову обмежується ~ 5Mbit / s) і один з вікном відправлення 1MB та гніздом 8kb за замовчуванням розмір. (масштаби вище) - Один
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