網卡多隊列是指在網路介面上配置多個發送和接收隊列,每個隊列可以由不同的CPU核心進行處理,其主要目的是通過允許多個CPU核心同時處理網路資料包來提升網路I/O輸送量和降低延遲。
為什麼需要網卡多隊列
傳統單隊列因依賴單核處理全部資料包易導致CPU過載、延遲增加及丟包,而現代伺服器多為多核CPU,多隊列可將網路流量分發至多核CPU的不同核心,從而實現對多核計算資源的高效利用。
根據測試結果,在相同的網路PPS和網路頻寬條件下,相較於單個隊列,使用兩個隊列的網路效能提升50%~100%,而使用四個隊列的效能提升則更加顯著:
更好地利用多核CPU架構:多隊列可以將網路流量分散到多個CPU核心上處理,這樣可以更均勻地分配負載,提高CPU的利用率。
提高輸送量:多隊列允許多個資料包同時被處理,這可以顯著提高網路的輸送量,尤其是在高負載情況下。
降低延遲:由於資料包可以分散到不同的隊列中處理,減少了單個隊列的擁堵,從而降低了延遲。
減少丟包:在高流量情況下,多隊列可以減少因單個隊列過載而導致的丟包。
雖然多隊列通常能夠帶來上述好處,但不當的配置也可能導致效能下降或其他問題。例如,網卡隊列和CPU親和性設定不當,可能會引起不必要的環境切換開銷;而網卡隊列數目設定過少則不能充分利用硬體資源。
通常彈性網卡在附加到特定執行個體規格的執行個體上後,網卡的隊列數即執行個體規格預設的網卡隊列數,且在系統內部自動生效。如果您需要手動調整網卡的隊列數,在調整前應該根據具體的使用情境和硬體條件仔細考慮如何合理地配置彈性網卡的多隊列參數。
多隊列的核心機制
隊列劃分
彈性網卡支援多個隊列,指的是支援多個Combined隊列,每個Combined隊列由獨立的CPU核心處理,實現平行處理資料包,減少鎖競爭,充分利用多核效能。
RX(Receive)隊列和TX(Transmit)隊列是網卡處理資料包時使用的兩種不同類型的隊列,每個Combined隊列包含一個RX隊列和一個TX隊列:
RX隊列(RX Queue):RX隊列主要用於處理從網路接收到的資料包。當資料包到達網卡時,會根據一定的規則(如輪詢、基於流的分配等策略)被分發到不同的RX隊列中。
TX隊列(TX Queue):TX隊列負責管理待發送的資料包。應用程式產生的輸出請求首先會被放入相應的TX隊列裡,然後由網卡按照順序或者優先順序等因素進行發送。
支援中斷親和性
每個隊列關聯獨立的中斷,通過中斷親和性將中斷處理分散到不同的CPU核心,避免單一核心過載。
除Red Hat Enterprise Linux以外的鏡像已預設支援網路中斷親和性,無需再配置。詳細資料,請參見配置網路中斷親和性。
約束和限制
目前部分執行個體規格支援網卡多隊列,詳細資料,請參見執行個體規格類型系列。當多隊列數值大於1時,表示支援網卡多隊列。
對於支援多隊列的執行個體規格,網卡在綁定到執行個體規格後多隊列自動生效。
執行個體規格文檔中的隊列數,表示該執行個體規格所允許的單塊網卡最大隊列數。
您可以通過調用DescribeInstanceTypes介面,查詢指定InstanceTypeFamily對應的目標執行個體規格類型系列的網卡隊列數相關指標:
網卡預設隊列數
返回的PrimaryEniQueueNumber為主網卡的預設隊列數,SecondaryEniQueueNumber為輔助網卡的預設隊列數。
單塊網卡最大隊列數
返回的MaximumQueueNumberPerEni為規格類型系列允許的單塊網卡最大隊列數。
隊列數總配額
返回的TotalEniQueueQuantity為規格類型系列允許的隊列數總配額。
一些早期上架的公用鏡像(核心版本小於2.6)可能不支援網卡多隊列,建議您使用最新的公用鏡像。
查看彈性網卡的隊列數
在控制台查看
訪問ECS控制台-彈性網卡。
在頁面左側頂部,選擇目標資源所在的資源群組和地區。
單擊目標輔助彈性網卡的ID,進入彈性網卡詳情頁。
在基本資料部分,可以看到網卡隊列數,具體數值表示當前該彈性網卡的隊列數。
如果彈性網卡修改過隊列數,則返回修改後的隊列數。
如果彈性網卡未修改過隊列數:
如果彈性網卡未綁定到執行個體,則傳回值為空白。
如果彈性網卡已綁定到執行個體上,則返回執行個體規格預設的網卡隊列數。
通過API查看
您可以通過DescribeNetworkInterfaceAttribute查看網卡的隊列數屬性,返回的QueueNumber表示該網卡的隊列數。
如果彈性網卡修改過隊列數,則返回修改後的隊列數。
如果彈性網卡未修改過隊列數:
如果彈性網卡未綁定到執行個體,則傳回值為空白。
如果彈性網卡已綁定到執行個體上,則返回執行個體規格預設的網卡隊列數。
在執行個體內部查看
遠端連線Linux執行個體。
說明Windows執行個體的網卡隊列數您可以在控制台或通過API查看。
具體操作,請參見使用Workbench終端串連登入Linux執行個體(SSH)。
執行
ip a
命令,查看網路設定相關資訊。執行以下命令,查看主網卡eth0支援多隊列的情況。
本例以主網卡為例說明,如果是輔助網卡,修改網卡標識即可,如eth1、eth2。
ethtool -l eth0
根據返回結果查看是否支援網卡多隊列:
如果 "Pre-set maximums" 下的 "Combined" 值大於1,表示網卡支援多隊列。該值表示該彈性網卡支援的最大隊列數。
“Current hardware settings”下的“Combined”值表示當前使用的隊列數。
本例中返回表示最多支援3個組合隊列(RX+TX),且當前使用的是3個隊列。
如果您要修改網卡最多支援的隊列數,請參見修改彈性網卡隊列數。
如果您要修改使用的網卡隊列數,請參見修改作業系統使用的網卡隊列數。
修改彈性網卡隊列數
通常彈性網卡在附加到特定執行個體規格的執行個體上後,網卡的隊列數即執行個體規格預設的網卡隊列數,且在系統內部自動生效。如果您需要手動調整網卡的隊列數,您可以通過控制台或API修改。注意事項如下:
只允許修改處於待綁定狀態,或者已綁定至執行個體且執行個體為已停止狀態的彈性網卡的隊列數。
網卡隊列數不能超過執行個體規格允許的單塊網卡最大隊列數。
執行個體的所有網卡累加隊列數不能超過執行個體規格允許的隊列數總配額。
在控制台修改
訪問ECS控制台-彈性網卡。
在頁面左側頂部,選擇目標資源所在的資源群組和地區。
單擊目標輔助彈性網卡的ID,進入彈性網卡詳情頁。
點擊修改網卡隊列數。
點擊“確定”,完成隊列數修改。
通過API修改
您可以通過調用ModifyNetworkInterfaceAttribute,設定QueueNumber參數的值實現修改彈性網卡隊列數。
已綁定至執行個體的彈性網卡修改隊列數後,新的網卡隊列數在執行個體啟動後生效。
修改作業系統使用的網卡隊列數
您通過控制台或API完成修改彈性網卡隊列數後,系統內部自動生效,即當前在系統內部,該網卡使用的隊列數為您設定的網卡隊列數。
您還可以根據實際情況,調整系統內部網卡實際使用的網卡隊列數,使其小於設定的網卡隊列數。
在執行個體內部修改的系統使用的網卡隊列數不會影響網卡當前支援的最大隊列數,不會顯示在控制台或API的返回資料中。
此修改為臨時修改,執行個體重啟後修改失效。
下面以支援多隊列的Alibaba Cloud Linux 3作業系統為例,介紹如何調整網卡使用的隊列數。
遠端連線Linux執行個體。
具體操作,請參見使用Workbench終端串連登入Linux執行個體(SSH)。
執行
ip address show
命令,查看網路設定相關資訊。執行以下命令,查看主網卡eth0支援多隊列的情況。
本例以主網卡為例說明,如果是輔助網卡,修改網卡標識即可,如eth1、eth2。
ethtool -l eth0
根據返回結果查看是否支援網卡多隊列:
如果 "Pre-set maximums" 下的 "Combined" 值大於1,表示網卡支援多隊列。該值表示該彈性網卡支援的最大隊列數。
“Current hardware settings”下的“Combined”值表示當前使用的隊列數。
本例中返回表示最多支援3個組合隊列(RX+TX),且當前使用的是3個隊列。
執行以下命令,調整主網卡eth0生效的隊列數為2。
本例以主網卡為例說明,如果是輔助網卡,修改網卡標識即可,如eth1、eth2。
sudo ethtool -L eth0 combined N
N
是您希望網卡使用的隊列數,且N
應該小於或等於 "Pre-set maximums" 下的 "Combined" 值。本樣本中,設定主網卡使用2個隊列:
sudo ethtool -L eth0 combined 2
配置網路中斷親和性
在使用網卡多隊列時,通常需要配置網路中斷親和性(IRQ Affinity),將不同的隊列中斷分配給特定的CPU處理,而不是由任意的CPU處理,這有助於減少CPU之間的爭用並提高網路效能。
除Red Hat Enterprise Linux以外的鏡像已預設支援網路中斷親和性,無需再配置。
Red Hat Enterprise Linux鏡像支援但未開啟網卡多隊列的網路中斷親和性,您需要參考本文進行配置。
下述操作以Red Hat 9.2鏡像系統為例,介紹如何通過ecs_mq
指令碼自動設定網卡多隊列的網路中斷親和性。如果您的系統鏡像並非Red Hat Enterprise Linux,已預設開啟,則無需再配置。
遠端連線Linux執行個體。
具體操作,請參見使用Workbench終端串連登入Linux執行個體(SSH)。
(可選)關閉irqbalance服務。
由於irqbalance服務會動態調整IRQ Affinity,配置
ecs_mq
指令碼會和irqbalance產生衝突,建議關閉irqbalance服務。systemctl stop irqbalance.service
執行以下命令,下載最新版本的網卡多隊列的自動設定指令碼
ecs_mq
。wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/ecs_mq/ecs_mq_2.0.5.tgz
執行以下命令,解壓
ecs_mq
指令碼。tar -xzf ecs_mq_2.0.5.tgz
執行以下命令,更換工作路徑。
cd ecs_mq/
執行以下命令,運行
ecs_mq
指令碼。bash install.sh redhat 9
說明請您根據實際環境替換命令中的 redhat 和 9為您自己的
<作業系統名稱>
和<作業系統主要版本號>
。執行以下命令,啟動
ecs_mq
指令碼。systemctl start ecs_mq
啟動指令碼後,系統自動啟動網路中斷親和性。
修改網卡多隊列數和配置網路中斷親和性是用於最佳化網路效能的不同方法,您需要根據系統的實際負載情況,通過測試不同的配置組合,觀察系統效能(如輸送量、延遲等指標),合理分配多隊列到不同的CPU核心,並相應地設定中斷親和性,確保負載平衡。