У нас на работе есть подключение к Интернету со скоростью 1 Гбит/с (вверх/вниз), и я заметил, что производительность при общении с нашими серверами в облаке была ужасной. Под ужасом я подразумеваю, что из теоретических 1000 Мбит/с мы получали максимум 30 Мбит/с. После длительных диагностических сеансов мы пришли к выводу, что у нас есть проблема с производительностью сети при получении данных с наших машин Windows Server. Как ни странно, мы получаем довольно приличные скорости, когда сервер представляет собой виртуальную машину Linux (мне пришлось внести несколько изменений, чтобы увеличить окно перегрузки TCP — точные изменения перечислены ниже).
В процессе исследования я удалял все больше и больше элементов, чтобы свести проблему к самой простой форме. Мой тестовый ноутбук теперь подключен напрямую к модему, без какого-либо программного обеспечения, которое могло бы повлиять на производительность сети. То же самое для моей тестовой ВМ в облаке (3 лучших провайдера). Я использовал iperf для оценки скорости передачи. Поскольку я исключил брандмауэр из уравнения, результат сильно изменился, и мы можем получить сотни Мбит/с, но я все еще не могу понять следующее:
Виртуальная машина Linux в облаке, отправляющая данные на ноутбук: я получил среднюю скорость 640 Мбит/с за 60 секунд в последний раз, когда я тестировал (самая низкая секунда в этом тесте была 530 Мбит/с).
Виртуальная машина Windows в облаке отправляет данные на ноутбук: иногда она начинается со скорости 400 Мбит/с и даже может достигать 500 Мбит/с в течение коротких периодов времени, но примерно в 90% случаев она начинается со скорости около 60 Мбит/с в первую секунду, затем падает до 30 Мбит/с, затем медленно поднимается. Если я оставлю тест на 60 секунд, он достигнет скорости около 400 Мбит / с через 20 с лишним секунд, но скорость передачи будет намного менее стабильной, чем у Linux (также кажется, что он медленнее в целом, но это трудно оценить сейчас). ).
Дополнительная информация
- Ноутбук (клиент в передаче данных) — ПК с Windows
- Когда ноутбук действует как сервер (выгружающий), скорость хорошая независимо от конфигурации (назначением может быть Linux, Windows, установленный корпоративный брандмауэр также ничего не меняет)
- Я экспериментировал с настройками виртуальной машины Windows (адаптер и TCP) всеми мыслимыми способами, но это никак не повлияло на проблему. Единственная выгода от подключения ноутбука напрямую к модему на работе (тогда я бы увеличил скорость примерно с 10 Мбит / с до 30-400 Мбит / с в зависимости от типа теста).
- Я использовал iperf3 для выполнения всех тестов (некоторые результаты показаны ниже).
- При создании виртуальной машины Windows Server я использовал ОС по умолчанию, предлагаемую облачным провайдером, поэтому здесь нет экзотической конфигурации.
- Пинг между нашим офисом и нашими серверами составляет около 28 мс.
- Пока я был подключен к брандмауэру, мы провели тест с коллегой, у которого есть деловое подключение к тому же интернет-провайдеру (такая же скорость, как у нас в офисе). Пинг от моего ноутбука до виртуальной машины Windows у него дома был где-то между 2 и 3 мс. Пропускная способность (его виртуальная машина работала как сервер) составляла около 120 Мбит/с. Тот же тест с ВМ в облаке (пинг 28 мс) был 10 Мбит/с.
- Мне пришлось установить параметр большого окна при использовании iperf из ОС Windows, чтобы разрешить максимальную пропускную способность (-w 5M), но в Linux это не было необходимо.
У меня сложилось впечатление, что существует проблема с масштабированием окна перегрузки Windows Server. Захват Wireshark показывает большое неиспользуемое окно TCP, но я не знаю, как исправить проблему или исследовать ее дальше.
Я включил некоторые тесты, которые я сделал ниже, но я могу предоставить больше, если это необходимо.
## IPERF (виртуальная машина Linux в облаке, отправляющая данные на ноутбук в офисе)
суперпользователь@testnr5linux:~$ iperf3 -c xx.xx.xx.xx -w 5M -t 60
Подключение к хосту xx.xx.xx.xx, порт 5201
[ 5] локальный порт 10.4.0.4 47268 подключен к порту xx.xx.xx.xx 5201
[ID] Интервал передачи Битрейт Retr Cwnd
[ 5] 0,00-1,00 с 76,2 МБ 640 Мбит/с 343 2,54 МБ
[ 5] 1,00-2,00 с 80,0 МБ 671 Мбит/с 53 1,88 МБ
[ 5] 2,00-3,00 с 73,8 МБ 619 Мбит/с 0 1,98 МБ
[ 5] 3,00-4,00 с 77,5 МБ 650 Мбит/с 0 2,06 МБ
[ 5] 4,00-5,00 с 80,0 МБ 671 Мбит/с 0 2,11 МБ
(еще 55 секунд в среднем 640 Мбит/с)
## Пример хорошей скорости от облачной ВМ (Windows) с последующим долгим медленным запуском
C:\Users\superuser>iperf3.exe -c xx.xx.xx.xx -w 5M
Подключение к хосту xx.xx.xx.xx, порт 5201
[4] локальный порт 10.3.0.4 51988 подключен к порту xx.xx.xx.xx 5201
[ID] Пропускная способность интервальной передачи
[ 4] 0,00-1,00 с 17,4 МБ 145 Мбит/с
[ 4] 1,00-2,00 с 28,9 МБ 243 Мбит/с
[ 4] 2,00-3,00 с 53,1 МБ 446 Мбит/с
[ 4] 3,00-4,00 с 54,0 МБ 453 Мбит/с
[ 4] 4,00-5,00 с 54,0 МБ 452 Мбит/с
[ 4] 5,00-6,00 с 54,9 Мбайт 461 Мбит/с
[ 4] 6.00-7.00 сек 55,5 МБ 465 Мбит/сек
[ 4] 7.00-8.00 сек 56,2 МБ 471 Мбит/сек
[ 4] 8.00-9.00 сек 58,2 МБ 490 Мбит/сек
[ 4] 9.00-10.00 сек 60,5 МБ 508 Мбит/сек
- - - - - - - - - - - - - - - - - - - - - - - - -
[ID] Пропускная способность интервальной передачи
[ 4] 0.00-10.00 сек 493 МБ 413 Мбит/сек отправитель
[ 4] 0.00-10.00 сек 490 МБ 411 Мбит/сек приемник
иперф Готово.
C:\Users\superuser>iperf3.exe -c xx.xx.xx.xx -w 5M
Подключение к хосту xx.xx.xx.xx, порт 5201
[4] локальный порт 10.3.0.4 51996 подключен к порту xx.xx.xx.xx 5201
[ID] Пропускная способность интервальной передачи
[ 4] 0,00–1,01 с 7,12 МБ 59,0 Мбит/с
[ 4] 1,01-2,01 с 3,25 МБ 27,4 Мбит/с
[ 4] 2,01-3,00 с 4,00 МБ 33,8 Мбит/с
[ 4] 3,00-4,00 с 5,00 МБ 41,9 Мбит/с
[ 4] 4,00-5,01 с 5,88 МБ 49,0 Мбит/с
[ 4] 5,01-6,00 с 6,62 МБ 56,0 Мбит/с
[ 4] 6,00-7,00 с 7,50 МБ 62,9 Мбит/с
[ 4] 7,00-8,01 с 8,62 МБ 71,8 Мбит/с
[ 4] 8,01-9,00 с 9,38 МБ 79,5 Мбит/с
[ 4] 9,00-10,01 с 10,4 МБ 86,3 Мбит/с
- - - - - - - - - - - - - - - - - - - - - - - - -
[ID] Пропускная способность интервальной передачи
[ 4] 0,00–10,01 с 67,8 МБ 56,8 Мбит/с отправитель
[ 4] 0,00-10,01 с 63,1 МБ 52,9 Мбит/с приемник
## Изменения, которые мне пришлось внести в /etc/sysctl.conf, чтобы увеличить CWND.
# разрешить тестирование с буферами до 64 МБ
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
# увеличьте лимит буфера TCP автонастройки Linux до 32 МБ
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
Примечание. Похоже, мне нужно как минимум 10 репутации, чтобы публиковать изображения, но вот ссылки. https://i.stack.imgur.com/IXhnS.png
https://i.stack.imgur.com/UyPYL.png