Как я могу ускорить передачу TCP-файлов в Windows 7 по каналу со скоростью 100 Мбит / с между Чикаго и Лондоном?
Прямо сейчас я передаю два файла по 4 ГБ за два сеанса sftp. Каждая передача файла выполняется со скоростью 500 КБ / с (4 Мбит / с). (B == байтов, b == бит, естественно). Это довольно медленно, поскольку тесты iperf показывают скорость 16,8 Мбит / сек для одного потока TCP. Это 2 МБ / сек.
Запуск второго сеанса sftp не влияет на скорость первого йота. Для меня это имеет смысл, поскольку я заметил, что мои тесты iperf были ограничены TCP - каждое соединение составляло 16 Мбит / с, что оставляет место для дополнительных подключений. Я смог заставить iperf насыщать мою линию, запустив много параллельных соединений, и это было линейное увеличение пропускной способности. То есть с 5 параллельными подключениями я достиг пропускной способности около 5x16 == 80 Мбит / с.
Замечу, что локальная передача файлов с использованием sftp составляет около 30 МБ / с ... неплохо. Поэтому я не думаю, что шифрование канала SSH является узким местом.
Я просмотрел Как лучше всего передать один большой файл по высокоскоростному каналу WAN с высокой задержкой? а также другие вопросы о сбоях сервера, и есть много интересных инструментов, но то, что я ищу, - это способ для меня настроить TCP-стек Windows, чтобы убедиться, что я получаю полные 2 МБ, по крайней мере ... и, возможно, больше, поскольку тесты iPerf проводились на ненастроенных машинах.
Я также замечаю, что когда я перетаскиваю файл на лондонский компьютер с моего файлового сервера в Чикаго, кажется, что он передается довольно неплохо (как видно из подробностей во время передачи), но через несколько минут он падает со скалы на скорости 10 Кбит / с. Это было очень странно.
Моя задержка стабильна и составляет около 88 мс, поэтому я считаю, что сетевая инфраструктура в порядке. У нас есть выделенная линия; это не VPN через Интернет или что-то в этом роде.
========
У меня есть виртуальная машина Linux, которая с точки зрения сети «близка» к моему рабочему столу Windows. То есть они находятся в разных подсетях, но обе машины подключены к коммутаторам, которые оба подключаются к другому коммутатору, который идет в Лондон. Прямо сейчас я использую sftp из Linux в Лондон, и он работает со скоростью 8 МБ / с, а мой рабочий стол продолжает работать со скоростью 500 КБ / с.
======== Хорошо, я поставил свой ноутбук с Linux на тот же переключатель, что и рабочий стол. Если в этот момент настольный компьютер выполняет sftp со скоростью 500 КБ / с, ноутбук с Linux отправляет файл 4Gig со скоростью 7,6 МБ / с. Конечно, на тот же сервер в Лондоне.
======== Другой тест: я использовал SecureFX от VanDyke Corp. У меня также есть Cygwin на моем ПК, и я просто пошел и использовал там команду CLI sftp. Я только что увеличил пропускную способность в пять раз ... Теперь я получаю 2,5 МБ / с вместо 500к! : - \ Это сравнимо с моими результатами iPerf со скоростью 16 Мбит / с. Этим я был бы доволен ... хотя теперь я замечаю, что мой ноутбук в три раза быстрее этого.
======== Другой тест: на моем лондонском компьютере я запустил копию файла Windows Explorer с моего файлового сервера в Чикаго в локально смонтированную папку Downloads (то есть на внутреннем жестком диске). Пропускная способность была стабильной 5,49 МБ / с в течение примерно 12 минут. Для меня это почти нормально! И снова копирование через SecureCRT было ужасно медленным - стабильные 500 КБ / с.
Единственное, что я могу заключить, это то, что, хотя могут быть полезны настройки TCP, приложение, которое вы используете, может иметь большое значение! Более того, я не знаю, почему моя файловая копия на днях вела себя так странно. Если это произойдет снова, я попытаюсь отладить.
Спасибо за предложения и ответы.
======================
Хорошо, я проследовал по ссылкам Тодда Уилкокса и понял несколько вещей:
netsh
для изменения уровня автонастройки окна приема с нормального на отключенный. Скорость передачи по сети не изменилась, поэтому я перезагрузил машину и снова выполнил sftp со своего рабочего стола на лондонский сервер.Пропускная способность в битах в секунду * Круговая задержка в секундах = размер окна TCP в битах / 8 = размер окна TCP в байтах
В твоем случае: 100000000 * .088 = 8 800 000 бит или 1 100 000 байт
Это можно настроить в реестре Windows в ключе TcpWindowSize в допустимом диапазоне 0–0x3FFFFFFF (1 073 741 823 десятичных числа), так что это число находится в допустимом диапазоне.
Значение по умолчанию - наименьшее из следующих (Примечание: "Значения более 64 КБ могут быть достигнуты только при подключении к другим системам, поддерживающим масштабирование окна RFC 1323."):
- 0xFFFF
- GlobalMaxTcpWindowSize (еще один параметр реестра)
- Большее из четырех значений MSS (максимального размера сегмента)
- 16384 округлено до четного кратного MSS
Стек также настраивается в зависимости от скорости носителя:
- Ниже 1 Мбит / с: 8 КБ
- 1 Мбит / с - 100 Мбит / с: 17 КБ
- Более 100 Мбит / с: 64 КБ
Источник (Эта ссылка сейчас в основном мертвая - слегка живая, но только чудо могло вернуть ее)
Также см: http://bradhedlund.com/2008/12/19/how-to-calculate-tcp-throughput-for-long-distance-links/
И: https://technet.microsoft.com/en-us/library/cc938219.aspx