問題描述
用戶使用 Azure 虛擬機訪問其他資源,做壓力 / 負載測試(并發數非常高)時,可能會出現以下情況 :
測試初期 Client VM 的延遲結果正常; 測試后期 Client VM 的延遲偶爾突增/連接失敗,越后期超高延遲(比如 30 秒)出現越多;
問題分析
造成這一現象的根本原因很可能是 SNAT(Source NAT)數量過高。
什么是 SNAT 呢?
對于 ASM 虛擬機,出于可拓展性的考慮,云服務中每臺虛擬機都隱藏在云服務面向公網的 VIP 之后,各自有自己的 DIP。
對于 ARM 虛擬機,默認會分配一個面向公網的 VIP 和一個面向內部的 DIP。用戶可以自定義設置,不為 ARM 虛擬機分配公網 IP。
當這些未部署特定公網 IP 的虛擬機訪問公網資源時,出站流量將通過 NAT 層(更改虛擬機的 DIP 和端口為面向公網的 VIP 和對應端口,以便流量被路由,否則虛擬機單憑 DIP 無法在公網中被路由)。
這個過程即 SNAT:更改源信息(源 IP 地址和源端口)。
SNAT 數量建議上限是多少?
出于整體性能考慮,Azure 為每個虛擬機預分配了 160 個源端口。虛擬機訪問公網資源時, Azure 會為該會話分配這 160 個中可用的端口。如果同時有 160 個請求正在運行,第 161 個及之后的請求需等 Azure 分配了新的端口才能使用。
當用戶的并發非常高時,Azure 分配新端口的速度可能不足以保障每個請求都能及時獲得 Azure 分配的 SNAT 端口。未被分配到端口的請求就可能出現出站連接嘗試失敗 / 延遲高的情況。
解決方法
資源管理器模式
對于 ARM 部署的虛擬機,可以為它的網卡 NIC 配置公網 IP 通過 Portal 或 PowerShell 創建公網 IP,具體操作步驟可以參考官網:創建公共 IP 地址。
在 Portal 上虛擬機對應的 "網絡接口" 內, 點擊IP 配置,配置對應的公共 IP 地址 即可。
經典模式
一般對此的解決方法是為這臺高負載的機器配置獨有的公網 IP —— 實例層級公共 IP(ILPIP)。
對于 ASM 部署的虛擬機,將創建的公網 IP 配置為虛擬機的 ILPIP:
ILPIP(Instance Level Public IP) 為用戶虛擬機提供了一個獨有的公網 IP,于是用戶可用此 IP 直接訪問虛擬機,出站流量也無需作 SNAT。
具體說明可參考官網:實例層級公共 IP(經典)概述。
具體配置方法如下,具體參數請根據實際情況修改。
如何檢索虛擬機的 ILPIP 信息:
若要查看虛擬機的 ILPIP 信息,請運行以下 PowerShell 命令,然后觀察 PublicIPAddress 和 PublicIPName 的值:
PowerShell復制
Get-AzureVM-NameFTPInstance-ServiceNameFTPService
預期輸出:
復制
DeploymentName? : FTPService
Name? ? ? ? ? ? ? ? : FTPInstance
Label? ? ? ? ? ? ? :
VM? ? ? ? ? ? ? ? ? : Microsoft.WindowsAzure.Commands.ServiceManagement.Model.PersistentVM
InstanceStatus? ? ? ? ? ? ? : ReadyRole
IpAddress? ? ? ? ? ? ? ? ? ? ? : 100.74.118.91
InstanceStateDetails? ? ? ? :
PowerState? ? ? ? ? ? ? ? ? ? ? : Started
InstanceErrorCode? ? ? ? ? :
InstanceFaultDomain? ? ? ? : 0
InstanceName? ? ? ? ? ? ? ? : FTPInstance
InstanceUpgradeDomain? ? ? : 0
InstanceSize? ? ? ? ? ? ? ? : Small
HostName? ? ? ? ? ? ? ? ? ? : FTPInstance
AvailabilitySetName? ? ? ? :
DNSName? ? ? ? ? ? ? ? ? ? : http://ftpservice888.chinacloudapp.cn/
Status? ? ? ? ? ? ? ? ? ? ? : ReadyRole
GuestAgentStatus? ? ? ? ? ? :? ? Microsoft.WindowsAzure.Commands.ServiceManagement.Model.GuestAgentStatus
ResourceExtensionStatusList : {Microsoft.Compute.BGInfo}
PublicIPAddress? ? ? ? ? ? ? ? : 104.43.142.188
PublicIPName? ? ? ? ? ? ? ? : ftpip
NetworkInterfaces? ? ? ? ? : {}
ServiceName? ? ? ? ? ? ? ? : FTPService
OperationDescription? ? ? ? : Get-AzureVM
OperationId? ? ? ? ? ? ? ? : 568d88d2be7c98f4bbb875e4d823718e
OperationStatus? ? ? ? ? ? : OK
如何向現有的虛擬機配置 ILPIP
運行以下 PowerShell 命令(僅支持使用 Powershell 配置 ILPIP),下面的示例為 FTPInstance 這臺虛擬機新建了一個名為 ftpip2 的 ILPIP:
復制
Get-AzureVM -ServiceName FTPService -Name FTPInstance | Set-AzurePublicIP -PublicIPName ftpip2 | Update-AzureVM
配置 ILPIP 是否會造成虛擬機重啟?
用戶可能擔心此操作是否會造成虛擬機重啟、業務中斷等等。
配置 ILPIP 不會導致虛擬機重啟,配置成功后 Cloud Service IP 和 ILPIP 都可以用來連接虛擬機。
ILPIP 能否被保留 / 設置為靜態?
ILPIP 不可設置為靜態。如有需要建議部署 ARM 的虛擬機,并設置虛擬機的 Public IP(VIP)為 Reserved IP。
統計現有的 ILPIP
ILPIP 單獨計價,具體價格可以參考:IP 地址價格詳情。
每個訂閱最多可以分配 5 個 ILPIP 地址。然而,查看訂閱下已經使用了多少個 ILPIP 只能通過查詢每一臺虛擬機看是否有 PublicIP Address 項,過程比較費時。
具體查詢的 PowerShell 命令如下:
PowerShell復制
$vm=Get-AzureVM-Namexxx-ServiceNamexxx
其中$vm.publicIPAddress即 ILPIP。 為便于查詢某訂閱下的所有 ILPIP,我們在 GitHub 中提供自動化獲取訂閱下所有 ILPIP 的腳本供用戶使用,直接下載后在 PowerShell 中運行即可。
ILPIP 帶來的安全問題
配置 ILPIP 后相當于直接將虛擬機暴露在公網,安全方面建議在虛擬機內部配置防火墻。 更多詳細的安全策略解釋可以參考:Microsoft 云服務和網絡安全性,這里也提到了外圍網絡的安全概念和具體示例。
立即訪問http://market.azure.cn