У меня Windows Server 2012 R2 работает на экземпляре Amazon EC2 с IIS 8.5. На нем размещается веб-приложение и настраиваемый сервер WebDAV, который взаимодействует с той же базой данных, что и веб-приложение.
Я провел несколько тестов скорости загрузки файлов через веб-приложение и настраиваемый сервер WebDAV. Я заметил, что загрузка файлов через WebDAV с использованием встроенного мини-перенаправителя Microsoft была очень медленной - около 300 кБ / с. Загрузки через веб-сайт с использованием Chrome, как и ожидалось, составляли 10+ МБ / с.
У меня точно такой же код для веб-приложения и сервера WebDAV, работающих на другом сервере под управлением Windows Server 2008 и IIS 7.5, а скорость загрузки составляет 10+ МБ / с как для веб-приложения, так и для сервера WebDAV. Поэтому я почти уверен, что в моем коде нет ничего, что вызывает медленную загрузку. Я потратил несколько дней на изучение этой проблемы и не смог получить скорость загрузки, которая должна быть на сервере WebDAV.
Еще одно интересное замечание: я попытался загрузить в веб-приложение с помощью Internet Explorer, и скорость загрузки была медленной - около 300 кб / с, как при использовании мини-перенаправителя для подключения к серверу WebDAV. Я также тестировал Firefox, и он был похож на Chrome, со скоростью 10+ МБ / с.
Я открыл Fiddler, чтобы изучить запрос / ответы, и пока Fiddler открыт, проблемы не возникает, скорость загрузки составляет 10+ МБ / с, поэтому я не могу получить какую-либо полезную информацию от Fiddler.
Я использовал Wireshark для изучения TCP-пакетов и сравнения различий между моим Windows Server 2008, который работает быстро, и Windows Server 2012, который работает медленно.
Порядок и размер TCP - пакеты одинаковы: два пакета и ACK, два пакета и ACK и т. Д. Размер пакетов составляет около 4k. Единственное отличие - это скорость отправки пакетов, которая на несколько порядков выше в Windows Server 2008.
Я тестировал скорость загрузки на нескольких разных клиентских машинах - Linux, Windows 7 и Windows 8. Я видел, что проблема возникает только в Windows 7, хотя это могло быть совпадением. Это происходит примерно на 75% компьютеров с Windows 7, но не на всех компьютерах с Windows 7.
Все это наводит меня на мысль, что эта проблема должна быть комбинацией конфигурации клиент / сервер, поскольку я не могу привязать проблему к конкретному серверу или только к конкретному клиенту. Фактически, я установил еще один Windows Server 2008, идентичный текущему, где загрузка выполняется быстро, но на новом сервере загрузка по-прежнему выполняется медленно. Так что, может быть, разница в сетевом адаптере или, может быть, в конкретных исправлениях и патчах, драйверах и т. Д.
Вот несколько вещей, которые я пробовал, чтобы увеличить скорость загрузки в Windows Server 2012 R2:
• Увеличенный Winsock SocketSendBuffer
длина в реестре на клиентских машинах
• Отключен алгоритм Нэгла на сервере
• Отключена разгрузка TCP Chimney на сервере.
• Включено / отключено около 50 других параметров, связанных с TCP, о которых я читал в различных статьях в Интернете.
• Пытался подключиться к клиенту из нескольких сетевых расположений (если клиент медленно загружается, это происходит медленно, независимо от того, где он подключается).
• Пробовал HTTP вместо HTTPS, но проблема все еще возникает, поэтому, похоже, не связана с SSL или TLS.
• Гарантированный, автоопределение прокси и скрипт автонастройки, где не отмечены в IE.
• Гарантировано, что keep-alive
включен в заголовках клиентских запросов
Есть ли у кого-нибудь идеи о том, что могло вызвать мою медленную проблему с загрузкой?
Повторюсь, проблема НЕ возникает при использовании Chrome или Firefox для загрузки через веб-приложение, но возникает при использовании IE. И проблема всегда возникает при использовании мини-перенаправителя на некоторых клиентских машинах, но никогда не возникает на других.
Мне удалось решить проблему, изменив Default Send Window
для драйвера Winsock - afd.sys
- в реестре Windows клиентского компьютера.
Перейдите к следующему разделу реестра и добавьте новый DWORD с именем DefaultSendWindow
и v значение (десятичное) 1920000
.
HKLM\System\CurrentControlSet\Services\AFD\Parameters
Примечание:
Значение должно быть как минимум равным заявленной скорости загрузки с использованием следующего уравнения:
(Upload Speed Kbps / 8 ) * 1024 = DefaultSendWindow
Пример:
Объявленная скорость загрузки: 15 Мбит / с = 15 000 Кбит / с
(15000/8) * 1024 = 1920000
Это значение обычно переопределяется в коде для стороннего программного обеспечения, однако продукты Microsoft, похоже, не переопределяют его, вероятно, поскольку они предполагают значение по умолчанию, используемое их собственными afd.sys
достаточно. Вот почему я не видел проблемы с использованием Chrome, Firefox, Filezilla и т. Д., Поскольку они сами переопределяли это значение. Казалось бы, разные версии файлов afd.sys
используйте разные значения окна отправки по умолчанию, поэтому эта ошибка не обнаруживалась на всех клиентских машинах.