Windows-Server-2012-R2

緩慢上傳到 IIS 伺服器

  • February 8, 2017

我有一個在帶有 IIS 8.5 的 Amazon EC2 實例上執行的 Windows Server 2012 R2。它託管一個 Web 應用程序和一個與 Web 應用程序相同的數據庫互動的自定義 WebDAV 伺服器。

我做了一些速度測試,通過 Web 應用程序和自定義 WebDAV 伺服器上傳文件。我注意到使用 Microsoft 的內置迷你重定向器通過 WebDAV 上傳文件非常慢 - 大約 300 kB/s。正如預期的那樣,使用 Chrome 通過網站上傳的速度為 10+ MB/s。

對於在不同伺服器上執行的 Web 應用程序和 WebDAV 伺服器,我有完全相同的程式碼,執行 Windows Server 2008 和 IIS 7.5,並且 Web 應用程序和 WebDAV 伺服器上的上傳速度都是 10+ MB/s。所以我很確定我的程式碼中沒有任何東西導致上傳緩慢。我花了幾天時間研究這個問題,但無法將我的上傳速度提高到 WebDAV 伺服器應該達到的速度。

另一個有趣的注意事項:我嘗試使用 Internet Explorer 上傳到 Web 應用程序,但上傳速度很慢 - 大約 300 kb/s,就像使用迷你重定向器連接到 WebDAV 伺服器時一樣。我也測試了 Firefox,它就像 Chrome,速度為 10+ MB/s。

我打開 Fiddler 來檢查請求/響應,當 Fiddler 打開時,問題沒有發生,上傳速度是 10+ MB/s,所以我無法從 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,與目前上傳速度很快的伺服器相同,但在新伺服器上,上傳仍然很慢。所以可能區別在於 NIC,或者可能是特定的修補程序和更新檔、驅動程序等。

為了在 Windows Server 2012 R2 上提高上傳速度,我嘗試了以下一些方法:

SocketSendBuffer•客戶端電腦上系統資料庫中Winsock 長度增加

• 在伺服器上禁用 Nagle 算法

• 在伺服器上禁用 TCP 煙囪解除安裝

• 啟用/禁用大約 50 個其他與 TCP 相關的選項,這些選項是我在各種線上文章中讀到的。

• 嘗試從多個網路位置連接客戶端(如果客戶端上傳速度很慢,則無論它連接到哪裡都很慢)。

• 嘗試了HTTP 而不是HTTPS,但問題仍然存在,因此似乎與SSL 或TLS 無關。

• 確保在 IE 中未選中的自動檢測代理和自動配置腳本

• 確保keep-alive在客戶端請求標頭中啟用

有人對可能導致我的緩慢上傳問題的原因有任何想法嗎?

重申一下,使用 Chrome 或 Firefox 通過 Web 應用程序上傳不會出現此問題,但使用 IE 會出現此問題。並且在某些客戶端機器上使用迷你重定向器總是會出現此問題,但在其他機器上從未出現過。

我可以通過更改客戶端電腦的 Windows 系統資料庫中 Default Send Window的 Winsock 驅動程序來解決此問題。afd.sys

導航到以下系統資料庫​​項並添加一個新的 DWORD,其名稱DefaultSendWindow和 va 值(十進制)為 1920000.

HKLM\System\CurrentControlSet\Services\AFD\Parameters

筆記:

該值應至少與您宣傳的上傳速度一樣高,使用以下公式:

(Upload Speed Kbps / 8 ) * 1024 = DefaultSendWindow

例子:

廣告上傳速度:15 Mbps = 15,000 Kbps

(15000 / 8 ) * 1024 = 1920000

此值通常在 3rd 方軟體的程式碼中被覆蓋,但 Microsoft 產品似乎不會覆蓋它,因為它們假設自己使用的預設值afd.sys就足夠了。這就是為什麼我在使用 Chrome、Firefox、Filezilla 等時沒有看到問題的原因……因為它們自己覆蓋了這個值。似乎不同的文件版本afd.sys使用不同的預設發送視窗值,這就是為什麼這個錯誤沒有出現在所有客戶端機器上的原因。

引用自:https://serverfault.com/questions/705454