網路傳輸單元最大值MTU(Maximum Transmission Unit)決定了網路上單次可傳輸資料包的最大尺寸,包含IP資料包頭和載荷,不包含乙太網路頭部。理論上MTU越大,可在單個資料包中傳遞的資料越多,網路通訊越高效。本文介紹巨型幀相關功能以及如何修改ECS執行個體網卡的MTU。
巨型幀(Jumbo frames)
巨型幀是指承載超過IEEE 802.3標準所限制的1500位元組的乙太網路幀,增大的有效載荷百分比有助於提高鏈路利用率,獲得更好的網路效能。阿里雲支援8500位元組的巨型幀,允許您發送8500位元組載荷的乙太網路幀。
當前所有ECS執行個體都支援1500 MTU,8代主售執行個體規格類型系列(g8i/c8i/r8i/g8a/c8a/r8a/g8ae/c8ae/r8ae/g8y/c8y/r8y)還可以支援8500 MTU。更多資訊,請參見執行個體規格類型系列。
注意事項
能否使用巨型幀進行網路通訊還需要考慮到網路鏈路以及對端主機的MTU限制,超過MTU限制的資料包將會被阿里雲轉寄組件分區或丟棄。更多資訊,請參見超過鏈路MTU時的處理。
目前已知在以下情境使用巨型幀可能存在連通性或效能問題:
使用非TCP(UDP/ICMP)的巨型幀訪問雲端服務或者目的主機使用負載平衡產品時,可能由於分區報文無法被負載平衡器正常轉寄而丟棄,造成網路不通的風險。更多資訊,請參見雲網路產品MTU限制。
使用非TCP(UDP/ICMP)的巨型幀在MTU不匹配的情境下進行通訊時,可能因為分區而導致網路效能下降。更多資訊,請參見ECS互訪鏈路MTU限制和雲網路產品MTU限制。
因此,建議在使用支援巨型幀的ECS執行個體部署業務之前,先測試業務情境下是否存在因為MTU不匹配帶來的連通性和效能問題,並管理好這些情境下的資料包尺寸以降低不必要的效能損失。
開啟/關閉巨型幀
您可以通過以下方式開啟、關閉ECS執行個體的巨型幀。
方式一:
在執行個體建立頁,選擇支援巨型幀的執行個體規格時,可選擇開啟、關閉巨型幀。
方式二:
執行個體建立完成後,在ECS執行個體操作列開啟、關閉巨型幀。
登入ECS管理主控台。
在左側導覽列,選擇 。
在頁面左側頂部,選擇目標資源所在的資源群組和地區。
找到已建立的支援巨型幀的執行個體,在操作列選擇
在修改巨型幀配置對話方塊,根據實際需要開啟、關閉巨型幀。
方式三:
通過調用ModifyInstanceAttribute介面開啟、關閉巨型幀。
通過方式二或者方式三開啟、關閉巨型幀後,根據作業系統的不同,您還需要完成如下操作才能使配置生效:
重啟ECS執行個體。
(可選)登入系統內部修改MTU配置,僅Windows系統開啟巨型幀情境需要完成該操作。具體操作,請參見修改ECS網卡MTU。
說明Linux系統的DHCP伺服器會自動擷取MTU,重啟後無需手動修改即可在執行個體內部看到開啟或者關閉後的MTU(開啟8500、關閉1500)。
Windows系統關閉巨型幀後,重啟後無需再登入系統內部手動修改MTU配置即可生效(即MTU為1500)。
ECS互訪鏈路MTU限制
在阿里雲網路內,鏈路預設支援1500 MTU,對於不支援巨型幀的ECS執行個體通訊時,只需要關注VPN網關等網路組件自身的MTU限制即可。更多資訊,請參見雲網路產品MTU限制。
支援巨型幀的ECS執行個體作為源主機時,目的主機在不同通訊情境下的鏈路最大MTU限制如下表所示:
目的主機 | 允許的最大MTU |
“同VPC內” 或 “同region對等串連的VPC內” 開啟巨型幀的ECS執行個體 | 8500 |
“同VPC內” 或 “同region對等串連的VPC內” 未開啟巨型幀的ECS執行個體 | 1500 |
“通過CEN實現互連的VPC內”任意ECS執行個體 | |
“通過Express Connect串連的線下IDC內”的主機 | |
“通過EIP、PIP訪問”的外部主機 |
對於超過鏈路最大MTU限制的資料包,阿里雲轉寄組件會依據RFC標準對報文進行分區或協商,但是這隻能保證連通性,不能保證網路通訊的效能。因此在鏈路最大MTU為1500的通訊情境下,盡量避免使用巨型幀進行UDP、ICMP通訊。對於阿里雲上轉寄組件在資料包大於鏈路最大MTU情境下的行為,請參見超過鏈路MTU時的處理。
雲網路產品MTU限制
除此之外,在使用非TCP協議(UDP、ICMP)訪問特定網路產品時,需要注意不同網路產品自身的MTU限制。當前阿里雲雲產品普遍不支援巨型幀,部分網路產品的最大MTU限制如下表所示:
網路產品 | 支援的最大MTU | 說明 |
NAT Gateway | 1500 | 無 |
負載平衡(包括ALB、NLB、CLB) | ALB和CLB不支援分區報文的轉寄,因此使用UDP/ICMP進行通訊時,需要嚴格控制源ECS執行個體發出的資料包的整包大小不超過1500。 | |
雲端服務(OSS,RDS等) | 由於流量會經過負載平衡產品,需注意負載平衡產品的限制。 | |
Global Acceleration | 無 | |
Cloud Firewall | 無 | |
私網串連PrivateLink | 無 | |
VPN網關 | 1399 | 更多資訊,請參見MTU配置說明。 |
對於超過雲產品最大MTU限制的資料包,阿里雲轉寄組件會依據RFC標準對報文進行分區或協商,但是這隻能保證連通性,不能保證網路通訊的效能。因此在雲產品最大MTU為1500或1399的通訊情境下,盡量避免使用巨型幀進行UDP、ICMP通訊。對於阿里雲上轉寄組件在資料包大於雲產品最大MTU情境下的行為,請參見超過鏈路MTU時的處理。
超過鏈路MTU時的處理
為了保證網路連通性,當資料包超過網路鏈路最大MTU限制時,阿里雲轉寄組件會依據RFC標準進行如下處理。
TCP-固定MSS
在TCP建立串連期間,兩個主機會為串連通告自己的最大分段大小 (MSS),MSS表示系統在TCP分段(不包括TCP和IP標題)中接受的最巨量資料包長度。MSS與MTU的關係為:MSS = MTU - (IP標題 + TCP標題)
。因此,為了保證資料包正常通訊,MSS加上TCP標題(20位元組)和IP標題(對於IPv4是20位元組,對於IPv6是40位元組),必須小於或等於網路鏈路的最大MTU限制。
對於MSS值與鏈路MTU不匹配時,阿里雲網路轉寄組件會修改MSS值,從而降低同步序列編號SYN(Synchronize Sequence Numbers)資料包中寄件者通告的MSS值或SYN-ACK資料包中接收者通告的MSS值。
非TCP(UDP/ICMP)-路徑MTU發現(PMTUD)
對於非TCP資料包,缺乏類似TCP MSS的端到端MTU協商機制,阿里雲轉寄組件通過PMTUD機制去協助使用者探測和協商MTU。
當資料包超過路徑上的MTU限制時,按照標準,如果沒有設定Don't-Fragment (DF) 位,轉寄組件需要對該資料包按照鏈路MTU進行分區轉寄;如果DF位為1,則該資料包會被直接丟棄。資料包被丟棄後:
對於IPv4協議,轉寄組件會發送一個包含Fragmentation-Needed (代碼4,類型3)的ICMP資料包給發送方,指示鏈路可以接受的MTU。
對於IPv6協議,轉寄組件會發送一個Packet-Too-Long (類型2)的ICMPv6資料包給發送方,指示鏈路可接受MTU。
PMTUD機制是以丟包為代價地協商MTU,只能保證網路連通性,構造和響應PMTU、以及對分區報文的處理,都會增加ECS系統核心與底層轉寄組件的資源開銷,極大地降低效能。因此為了更好的效能,建議在MTU不匹配的通訊情境下,通過ModifyInstanceAttribute介面關閉巨型幀,並重啟ECS執行個體生效。
ECS執行個體響應PMTUD機制依賴作業系統支援,要求作業系統支援且開啟了PMTU響應(例如在Linux系統中,/proc/sys/net/ipv4/ip_no_pmtu_disc檔案內容為0),同時執行個體的安全性群組配置也需要設定為允許存取ICMP流量以接收來自不同轉寄組件的ICMP協商資料包。
修改ECS網卡MTU
在阿里雲上,一些通訊情境或網路產品(例如VPN網關、流量鏡像)對ECS發出的資料包大小有著更加嚴格的要求,需要您主動縮小資料包尺寸,以保證網路連通性或更好的使用者體驗。您可以通過如下操作方法來修改ECS網卡的MTU值,以滿足這些產品的要求。
修改ECS網卡MTU時,注意不要超過ECS執行個體支援的最大MTU上限(開啟巨型幀時為8500,關閉或不支援巨型幀時為1500),否則可能導致網路不通。
Linux系統MTU會通過DHCP伺服器自動擷取,除了VPN網關等隧道情境,一般情況下無需手動修改網卡MTU。
Windows系統不支援DHCP自動擷取MTU,在開啟/關閉巨型幀時,才需要用此方法修改網卡MTU。
在本樣本中,我們示範不同作業系統下修改ECS網卡MTU到1399位元組。
Windows
以Windows Server 2019為例,操作步驟如下:
遠端連線Windows執行個體。
具體操作,請參見通過密碼或密鑰認證登入Windows執行個體。
開啟PowerShell。
執行以下命令,查看系統網卡裝置列表。
Get-NetAdapter
回顯類似如下所示,表示系統網卡的網卡名稱為乙太網路。
執行以下命令,查看乙太網路網卡的MTU。
Get-NetAdapterAdvancedProperty -Name "乙太網路"
回顯類似如下所示,表示乙太網路網卡當前的MTU值為1514。
說明Windows系統的MTU計算方式隨驅動有差異,大部分情境下驅動計算MTU包含了14位元組乙太網路頭,因此預設值是1514。
執行以下命令,根據需要設定網卡MTU值。
Get-NetAdapterAdvancedProperty -Name <"網卡名稱"> -RegistryKeyword "*JumboPacket" -RegistryValue <目標MTU值>
例如,將乙太網路網卡的MTU值設定為1413(包含乙太網路資料包頭的14位元組):
Set-NetAdapterAdvancedProperty -Name "乙太網路" -RegistryKeyword "*JumboPacket" -RegistryValue 1413
設定完成後,您可以執行
Get-NetAdapterAdvancedProperty -Name "乙太網路" -RegistryKeyword "*JumboPacket"
命令查看以網卡的MTU值是否生效。回顯類似如下所示,乙太網路網卡的MTU值已變為1413(包含乙太網路資料包頭的14位元組)。
Ubuntu
以Ubuntu16.04為例,操作步驟如下:
遠端連線ECS執行個體。
具體操作,請參見通過密碼或密鑰認證登入Linux執行個體。
執行以下命令,查看系統網卡以及網卡的MTU值。
ifconfig
回顯類似如下所示,系統網卡eth0的MTU值為1500。
執行以下命令,根據需要設定網卡MTU值。
例如,設定eth0網卡的MTU為1399:
mtu=1399 ifconfig eth0 mtu ${mtu} echo "/sbin/ifconfig eth0 mtu ${mtu}" > /etc/network/if-up.d/setmtu && chmod a+x /etc/network/if-up.d/setmtu
設定完成後,您可以執行
ifconfig
命令查看網卡的MTU值是否生效。回顯類似如下所示,eth0網卡的MTU值已變為1399。
CentOS
以CentOS 7.8為例,操作步驟如下:
遠端連線ECS執行個體。
具體操作,請參見通過密碼或密鑰認證登入Linux執行個體。
執行以下命令,查看IP地址綁定的網卡,如eth0。
ifconfig
回顯類似如下所示,系統網卡eth0的MTU值為1500。
執行以下命令,根據需要設定網卡MTU值。
例如,設定eth0網卡的MTU為1399:
mtu=1399 echo "${mtu}" > /sys/class/net/eth0/mtu echo "echo \""${mtu}"\" > /sys/class/net/eth0/mtu">> /etc/rc.d/rc.local && chmod +x /etc/rc.d/rc.local
設定完成後,您可以執行
ifconfig
命令查看網卡的MTU值是否生效。回顯類似如下所示,eth0網卡的MTU值已變為1399。
常見問題
問題描述:使用巨型幀進行UDP/ICMP通訊時,如果遇到效能急劇下降的情況,如何解決?
解決方案:檢查資料包分區情況,必要時關閉ECS執行個體的巨型幀。具體操作,請參見開啟/關閉巨型幀。
問題描述:ECS執行個體開啟巨型幀的情況下,通過UDP/ICMP協議訪問雲端服務(OSS、RDS等)時,遇到網路不通的問題,如何解決?
問題原因:當前ECS訪問雲端服務的流量會經過負載平衡產品,受限於負載平衡產品不支援分區報文的轉寄,因而可能網路不通。
解決方案:縮小ECS訪問雲端服務的訊息大小,以確保資料包不分區,且尺寸小於等於1500位元組。
問題描述:ECS執行個體無法接收到PMTU訊息(ICMP差錯報文),如何解決?
問題原因:PMTU訊息被安全性群組丟棄或者因為超過限速值丟棄。
解決方案:
檢查安全性群組設定是否允許存取ICMP流量。更多資訊,請參見查詢安全性群組規則。
檢查網路流量是否達到限速值。