多隊列是指網絡接口卡具有在多個發送和接收隊列上并行處理網絡數據包的能力。在使用網卡多隊列時,通常需要配置網絡中斷親和性(IRQ Affinity),將不同的隊列中斷分配給特定的CPU處理,而不是由任意的CPU處理,這有助于減少CPU之間的爭用并提高網絡性能。本文介紹如何配置Linux系統的網卡多隊列的網絡中斷親和性和修改網卡多隊列數。
前提條件
您的實例規格支持網卡多隊列功能。
支持多隊列的實例規格請參見實例規格族,多隊列數值大于1時,表示支持網卡多隊列。
您的鏡像支持網卡多隊列功能。
重要一些早期上架的公共鏡像(內核版本小于2.6)可能不支持網卡多隊列,建議您使用最新的公共鏡像。
除Red Hat Enterprise Linux以外的鏡像已默認支持網絡中斷親和性,無需再配置。
Red Hat Enterprise Linux鏡像支持但未開啟網卡多隊列的網絡中斷親和性,您需要按照本文進行配置。
修改網卡多隊列數和配置網絡中斷親和性是用于優化網絡性能的不同方法,您需要根據系統的實際負載情況,通過測試不同的配置組合,觀察系統性能(如吞吐量、延遲等指標),合理分配多隊列到不同的CPU核心,并相應地設置中斷親和性,確保負載均衡。
配置網絡中斷親和性
下述操作以Red Hat 9.2鏡像系統為例,介紹如何通過ecs_mq
腳本自動配置網卡多隊列的網絡中斷親和性。如果您的系統鏡像并非Red Hat Enterprise Linux,已默認開啟,則無需再配置。
遠程連接Linux實例。
具體操作,請參見通過密碼或密鑰認證登錄Linux實例。
(可選)關閉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.tgz
最新版
ecs_mq
相對于舊版ecs_mq
修復的問題如下:根據網卡設備PCIe的NUMA(非統一內存訪問)位置,來優先綁定對應的NUMA上的CPU。
優化了多網絡設備調優的邏輯。
根據網卡隊列數目和CPU數目的比例來進行不同規格的網卡中斷綁定邏輯。
優化了根據CPU中sibling的位置進行中斷綁定。
解決了舊版綁定中可能跨越NUMA導致的內存訪問延遲問題。
默認打開新版開關,同時支持切換新版和舊版的
ecs_mq
選項開關,切換命令如下:切換為舊版
ecs_mq
:ecs_mq_rps_rfs old
切換為新版
ecs_mq
:ecs_mq_rps_rfs new
說明新版
ecs_mq
相對于舊版ecs_mq
,在網絡性能測試中,針對大部分PPS、BPS,網絡性能提升可達到5%~30%。執行以下命令,解壓
ecs_mq
腳本。tar -xzf ecs_mq_2.0.tgz
執行以下命令,更換工作路徑。
cd ecs_mq/
執行以下命令,運行
ecs_mq
腳本。bash install.sh redhat 9
說明請您根據實際環境替換命令中的 redhat 和 9為您自己的
<操作系統名稱>
和<操作系統主版本號>
。執行以下命令,啟動
ecs_mq
腳本。systemctl start ecs_mq
啟動腳本后,系統自動啟動網絡中斷親和性。
修改網卡多隊列數
下述操作以支持多隊列的Alibaba Cloud Linux 3操作系統為例,介紹如何修改網卡多隊列數。
根據測試結果,在相同的網絡PPS和網絡帶寬條件下,相較于單個隊列,使用兩個隊列的網絡性能提升可達到50%~100%,而使用四個隊列的性能提升則更加顯著。如何測試網絡性能,請參見網絡性能測試方法。您可以根據實際需要,修改網卡多隊列數。
遠程連接Linux實例。
具體操作,請參見通過密碼或密鑰認證登錄Linux實例。
執行
ip address show
命令,查看網絡配置相關信息。執行以下命令,查看主網卡eth0支持多隊列的情況。
ethtool -l eth0
根據返回結果查看是否支持網卡多隊列:
如果 "Pre-set maximums" 下的 "Combined" 值大于1,表示網卡支持多隊列。
您可以根據這個最大值來設置當前的隊列數:
執行命令
sudo ethtool -L eth0 combined N
,其中N
是您希望設置的隊列數,且N
應該小于或等于 "Pre-set maximums" 下的 "Combined" 值。“Current hardware settings”下的“Combined”值表示當前生效的隊列數。
本例中返回表示最多支持2個隊列,且當前生效的是1個隊列:
Channel parameters for eth0: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 2 # 表示最多支持設置2個隊列 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 1 # 表示當前生效的是1個隊列
執行以下命令,設置主網卡使用2個隊列功能。
sudo ethtool -L eth0 combined 2
執行以下命令,查看輔助彈性網卡eth1支持多隊列的情況。
ethtool -l eth1
通過返回信息可以看到,輔助彈性網卡已開啟支持多隊列。您可以按需繼續執行下述操作自定義配置輔助彈性網卡的多隊列數。
Channel parameters for eth1: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 # 表示網卡硬件最多可以支持4個隊列 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 1 # 表示當前網卡只使用了1個隊列
執行以下命令,設置輔助彈性網卡使用4個隊列功能。
sudo ethtool -L eth1 combined 4
相關文檔
如果您需要了解網絡中斷親和性的更多信息,請參見IRQ Affinity。
如果您需要了解如何創建彈性網卡的,請參見創建輔助彈性網卡。
如果您需要了解如何綁定彈性網卡,請參見綁定輔助彈性網卡。