免責聲明:本文為 ESX/ESXi hosts might experience read or write performance issues with certain storage arrays (1002598)的翻譯版本。盡管我們會不斷努力為本文提供最佳翻譯版本,但本地化的內容可能會過時。有關最新內容,請參見英文版本。
不同陣列供應商提供的某些 iSCSI 存儲陣列在網絡擁塞時間段出現不恰當行為。此問題與這些陣列的 TCP/IP 實施有關,並可能嚴重影響通過 iSCSI 啟動器連接到 ESXi/ESX 軟件的存儲的讀取性能。此問題在涉及 Microsoft iSCSI 啟動器的本地(非虛擬化)環境中已報告。
背景概念
要理解此問題,應熟悉幾個 TCP 概念:- 延遲 ACK
- 慢啟動
- 擁塞避免
延遲 ACK
TCP 網絡協議的中心規則是接收器確認收到通過 TCP 發送的數據。根據 RFC 813,“非常簡單,當數據到達接收器時,協議要求接收器返回此數據的確認。協議指定按順序將數據字節編號,以便接收器通過為接收到的編號最高的數據字節命名來確認數據,同時也確認之前的字節。 承載確認的 TCP 數據包稱為 ACK。
主機收到一串 TCP 數據段時,可以通過為收到的每條數據段發送一條以下 ACK 確認分段來提高網絡和主機的效率。這稱為延遲 ACK。常規做法是為每兩個完整大小的數據分段發送一條 ACK,並且通過多個指定閾值確保不會延遲某個分段的 ACK。此閾值在 100 ms 到 500 ms 之間變化。與大多數其他服務器一樣,ESXi/ESX 也使用延遲 ACK 的優勢。
慢啟動和擁塞避免
從源到目標的兩個網絡元素之間的數據處理能力不匹配時,可能會發生擁塞。擁塞表現為延遲、超時或數據包丟失。要避免擁塞以及從擁塞恢復,TCP 使用兩種算法:擁塞避免算法和慢啟動算法。盡管這兩個算法的底層機制不同,其基本概念都是一樣的:TCP 發送器在發生擁塞時必須降低其數據傳輸速率,然后在重新傳輸的數據段獲得確認時提高速率。
發生擁塞時,使用延遲 ACK 和慢啟動的 TCP/IP 網絡的典型恢復順序為:
- 發送器在重新傳輸超時時間段內未收到 ACK 確認時,會檢測擁塞。
- 發送器在將剩余分段排序以便重新傳輸之前,會重新傳輸第一個數據分段並等待 ACK。
- 接收器收到重新傳輸的數據分段后,啟動延遲 ACK 計時器。
- 延遲 ACK 計時器超時后,接收器會傳輸 ACK。在等待期間,發送器和接收器之間沒有其他傳輸。
- 發送 ACK 后,發送器會連續重新傳輸接下來的兩個數據段。
- 接收器收到第二個數據段后,立即傳輸 ACK。
- 發送器收到 ACK 后,將連續重新傳輸接下來的四個數據段。
- 擁塞時間段結束且網絡恢復正常流量速率之前,此順序將一直持續。
問題描述
問題中受影響的 iSCSI 陣列處理擁塞的方式稍有不同。與主機實施慢啟動算法或擁塞避免算法或同時實施兩者不同的是,陣列采用非常保守的方式每次只重新傳輸一個丟失的數據分段,並等待主機的 ACK 后再重新傳輸下一個數據分段。此過程將繼續,直到所有丟失的數據段全部恢復。
這種方法與 ESXi/ESX 主機上已實施的延遲 ACK 結合使用,可減慢擁塞網絡中的讀取性能直至停止。因此,使用此類型陣列的主機的內核日志會報告頻繁超時。最值得注意的是,由於 VMFS 使用較小的超時值,VMFS 檢測信號將出現大量超時。此配置也會出現客戶機報告過長的讀取響應時間(大約幾十秒)。讀取塊大小較大的數據時,此問題會更加嚴重。在這種情況下,高帶寬分配會造成網絡擁塞,且每個 I/O 由很多數據段組成,需要更長的恢復時間。
在 vmkernel.log
文件中,您可能會看到類似如下內容的條目:-09-17T15:07:19Z iscsid: discovery_sendtargets::Running discovery on IFACE iscsi_vmk@vmk2(iscsi_vmk) (drec.transport=iscsi_vmk)
-09-17T15:07:19Z iscsid: cannot make connection to 10.0.68.2:3260 (111)
-09-17T15:07:19Z iscsid: connection to discovery address 10.0.68.2 failed
-09-17T15:07:19Z iscsid: connection login retries (reopen_max) 5 exceeded
-09-17T15:07:19Z iscsid: Login Target Skipped: iqn.2003-10.com.lefthandnetworks:hvtiscsi:1808:vmwds01 if=iscsi_vmk@vmk1 addr=10.0.68.2:3260 (TPGT:1 ISID:0x2) (Already Running)
-09-17T15:07:19Z iscsid: Login Target Skipped: iqn.2003-10.com.lefthandnetworks:hvtiscsi:1808:vmwds01 if=iscsi_vmk@vmk2 addr=10.0.68.2:3260 (TPGT:1 ISID:0x3) (Already Running)
iSCSI 陣列供應商在終端解決此問題之前,請在設計 IP 存儲網絡時提供足夠的容量,以便滿足峰值使用量並降低擁塞風險。如果您遇到本文所描述的問題,且無法更改您的網絡配置或確保無擁塞環境,則可以嘗試以下解決辦法。
此權宜措施包括通過配置選項在 ESX/ESXi 主機上禁用延遲 ACK。注意:請聯系您的存儲供應商,確認禁用延遲 ACK 是否是針對其存儲陣列推薦的權宜措施。
ESX/ESXi 3.5 和 4.x/5.x/6.0 之間處理延遲 ACK 的差異
ESX/ESXi 3.5 和 4.x/5.x/6.0 之間禁用延遲 ACK 的方式略有差異。ESX/ESXi 3.5 和 4.x/5.x/6.0 之間的主要差異是延遲 ACK 設置的工作原理與其設置:- 在 ESX/ESXi 3.5 中,延遲 ACK 設置對於 ESX/ESXi 系統而言是全局的。
通過設置此選項,無論 TCP 是否嘗試進行擁塞恢復並正常運行,您都可以完全禁用延遲 ACK。此選項會影響整個 TCP/IP 堆棧,因此,如果您實施此更改,所有 TCP/IP 應用程序都會受影響。因而,設置此選項可能降低 iSCSI 和其他應用程序的性能(例如 NFS 和 vMotion),同樣會導致擁塞。盡管如此,此選項允許受影響的 iSCSI 陣列在其他事務期間,從擁塞中迅速恢復並保持合理的性能。
- 在 ESX/ESXi 4.x/5.x/6.0 中,配置延遲 ACK 設置的建議方法是在每個發現目標上配置。您也可以在每個單獨目標上配置延遲 ACK 設置。此外,盡管不推薦,您仍然可以為所有 iSCSI 目標全局配置延遲 ACK 設置。
在 ESXi 中配置延遲 ACK。
要在 ESXi 中實施此權宜措施,請使用 vSphere Client 禁用延遲 ACK。
在 ESXi 6.5、ESXi 6.7 中禁用延遲 ACK。
- 登錄到 Web Client,然后選擇主機。
- 右鍵單擊主機,然后單擊“維護模式”。
- 等待進入維護模式任務完成。
- 導航到“配置”選項卡。
- 單擊“存儲適配器”。
- 單擊要修改的 iSCSI vmhba。
- 要在發現地址上修改延遲 ACK 設置,請執行以下操作:
- 單擊“適配器詳細信息”的“目標”選項卡。
- 單擊“動態發現”。
- 單擊“高級設置”。
- 在延遲 ACK“高級參數”選項中,取消選中“從父項繼承”和 DelayedACK。
- 單擊“確定”
- 重新引導主機。
在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中禁用延遲 ACK。
- 登錄到 vSphere Client,然后選擇主機。
- 右鍵單擊主機,然后單擊維護模式。
- 等待進入維護模式任務完成。
- 導航到配置選項卡。
- 單擊存儲適配器。
- 單擊要修改的 iSCSI vmhba。
- 單擊屬性。
- 修改延遲 ACK 設置,使用最符合您站點要求的選項:
- 要在發現地址上修改延遲 ACK 設置,請執行以下操作(推薦):
- 在發現地址上,單擊動態發現選項卡。
- 單擊服務器地址選項卡。
- 單擊設置 > 高級。
- 在延遲 ACK“高級參數”選項中,取消選中從父項繼承和 DelayedACK。
- 單擊確定。
- 在一組特定目標上修改延遲 ACK 設置:
- 在發現地址上,單擊靜態發現選項卡。
- 選擇所使用陣列上的所有目標。
- 單擊“移除”以刪除所選條目。
- 單擊動態發現選項卡。
- 移除所使用陣列上的所有目標。
- 輸入發現地址,但是先不重新掃描適配器。
- 選擇要修改的發現地址,然后單擊設置 > 高級。
- 在延遲 ACK“高級參數”選項中,取消選中從父項繼承和 DelayedACK。
- 單擊確定。
- 為要修改的每個發現地址重復步驟 f-i。
- 要全局修改延遲 ACK 設置,請執行以下操作:
- 選擇常規選項卡。
- 單擊高級。
- 在延遲 ACK“高級參數”選項中,取消選中從父項繼承和 DelayedACK。
- 單擊確定。
- 要在發現地址上修改延遲 ACK 設置,請執行以下操作(推薦):
- 重新引導主機。
在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中重新啟用延遲 ACK
- 登錄到 vSphere Client,然后選擇主機。
- 導航到高級設置頁面,如上述“在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中禁用延遲 ACK”任務所述。
- 單擊從父項繼承 > DelayedAck。
- 重新引導主機。
在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中查看延遲 ACK 的當前設置
- 登錄到 vSphere Client,然后選擇主機。
- 導航到高級設置頁面,如上述“在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中禁用延遲 ACK”任務所述。
- 查看 DelayedAck 設置。
如果已查看 DelayedAck 設置,將啟用此選項。如果在更改延遲 ACK 設置后且在重新引導主機之前查看,結果將顯示新設置而不是當前使用的設置。
注意:- 要禁用 delayed_ack,請從命令行運行以下命令:
vmkiscsi-tool -W -a delayed_ack=0 -j vmhbaXX
要啟用 delayed_ack,請運行以下命令:vmkiscsi-tool -W -a delayed_ack=1
-j
vmhbaXX
- 要查看此參數,請運行以下命令:
vmkiscsi-tool -W vmhbaXX
- 要禁用 delayed_ack,請從命令行運行以下命令:
在 ESX/ESXi 3.5 中配置延遲 ACK
要在 ESX/ESXi 3.5 中實施此權宜措施,請使用 VI Client 更改 Net.TcpipDelayedAck
高級參數設置。默認情況下,此選項設置為 1,將啟用延遲 ACK。要禁用延遲 ACK,請執行以下步驟。
在 ESX/ESXi 3.5 中禁用延遲 ACK
- 登錄到 VI Client,然后選擇主機。
- 單擊配置選項卡,然后單擊高級設置。
- 單擊網絡,然后在高級參數列表上滾動直到找到
Net.TcpipDelayedAck
參數。 - 將參數值設置為 0.
- 單擊確定。
- 重新引導主機。
在 ESX/ESXi 3.5 上重新啟用延遲 ACK
- 登錄到 VI Client,然后選擇主機。
- 單擊配置選項卡,然后選擇高級設置。
- 選擇網絡,然后在高級參數列表上滾動直到找到
Net.TcpipDelayedAck
參數。 - 將參數值設置為 1。
- 單擊確定。
- 重新引導主機。
在 ESX/ESXi 3.5 中查看延遲 ACK 的當前設置
- 登錄到 VI Client,然后選擇主機。
- 單擊配置選項卡,然后選擇高級設置。
- 選擇網絡,然后在高級參數列表上滾動直到找到
Net.TcpipDelayedAck
參數。 - 查看設置。設置為 1 表示已啟用延遲 ACK,設置為 0 表示已禁用。
- 單擊確定。
注意:重新引導后,延遲 ACK 更改才會生效。如果在執行更改后未重新引導主機,則查看結果將顯示新的設置而不是當前使用的設置。