Alibaba Cloud Linux 3系統(tǒng)配置XPS的方法及影響說(shuō)明
通過(guò)ECS控制臺(tái)新購(gòu)買的Alibaba Cloud Linux 3實(shí)例已經(jīng)默認(rèn)啟用了XPS機(jī)制。如果發(fā)現(xiàn)您的存量ECS實(shí)例尚未啟用XPS,您可以通過(guò)本文的操作方法來(lái)配置XPS。
XPS概述
XPS(Transmit Packet Steering)是一種在多隊(duì)列網(wǎng)卡上發(fā)送數(shù)據(jù)報(bào)文時(shí),自動(dòng)選擇發(fā)送隊(duì)列的機(jī)制。它通過(guò)建立發(fā)送隊(duì)列和CPU集合之間的映射關(guān)系,使得內(nèi)核能夠根據(jù)這一映射關(guān)系,在某個(gè)CPU發(fā)送數(shù)據(jù)報(bào)文時(shí),自動(dòng)選擇與該CPU相關(guān)聯(lián)的發(fā)送隊(duì)列來(lái)完成報(bào)文傳輸。內(nèi)核會(huì)記錄數(shù)據(jù)流的首個(gè)報(bào)文選擇的發(fā)送隊(duì)列,并將該隊(duì)列用于后續(xù)報(bào)文的傳輸,從而減少為每個(gè)報(bào)文計(jì)算發(fā)送隊(duì)列的開(kāi)銷。
XPS的優(yōu)勢(shì)體現(xiàn)如下:
緩解不同CPU對(duì)同一個(gè)發(fā)送隊(duì)列的競(jìng)爭(zhēng),進(jìn)而降低網(wǎng)卡隊(duì)列發(fā)送數(shù)據(jù)時(shí)的鎖沖突,提升數(shù)據(jù)報(bào)文發(fā)送效率。
XPS配置的發(fā)送隊(duì)列與CPU之間的映射關(guān)系與virtio網(wǎng)卡綁定的發(fā)送隊(duì)列的親和性一致,這降低了報(bào)文發(fā)送過(guò)程中緩存失效(cache miss)的可能性和鎖競(jìng)爭(zhēng)導(dǎo)致的緩存失效的可能性,從而提高了網(wǎng)絡(luò)發(fā)送性能。
配置XPS
遠(yuǎn)程連接目標(biāo)ECS實(shí)例。
具體操作,請(qǐng)參見(jiàn)通過(guò)密碼或密鑰認(rèn)證登錄Linux實(shí)例。
運(yùn)行以下命令,檢查目標(biāo)ECS實(shí)例是否配置了XPS(確保內(nèi)核使能了CONFIG_XPS)。
以網(wǎng)卡eth0為例:
cat /sys/class/net/eth0/queues/tx-*/xps_cpus
如下圖所示,如果命令輸出結(jié)果全部為0,則表示ECS實(shí)例沒(méi)有啟用XPS,請(qǐng)繼續(xù)執(zhí)行后續(xù)步驟配置XPS。
為具有不同CPU和發(fā)送隊(duì)列數(shù)目的所有virtio網(wǎng)卡設(shè)置和內(nèi)核策略相同的XPS配置。
運(yùn)行以下命令,在當(dāng)前目錄下新建文件,例如
xps_config.py
,用于設(shè)置XPS配置。vim xps_config.py
按
i
鍵進(jìn)入編輯模式,并拷貝以下內(nèi)容至xps_config.py
文件。# encoding: utf-8 # This implements the default configuration of kernel XPS. # Note: The configuration of this script only applies to virtio-net nics. import os import multiprocessing def setup_xps(dev): cpu_count = multiprocessing.cpu_count() txq_dir = "/sys/class/net/{0}/queues/".format(dev) queue_count = len([f for f in os.listdir(txq_dir) if f.startswith("tx-")]) if queue_count <= 1: print("The number of txq: {0} <= 1, exit...".format(queue_count)) return group, stragglers = divmod(cpu_count, queue_count) stragglers = 0 if group == 0 else stragglers group = max(group, 1) cpu = 0 queue_final_bitmap = "" # We do not need to care about numa node information # So we must pay attention to the perfermance in multiple numa node scene!! for i in range(queue_count): group_size = (group + 1) if i < stragglers else group queue_per_bitmap = 0 for j in range(group_size): cpu_bitmap = 1 << cpu cpu += 1 queue_per_bitmap |= cpu_bitmap cpu = 0 if cpu >= cpu_count else cpu queue_final_bitmap = hex(queue_per_bitmap)[2:] if "L" in queue_final_bitmap: queue_final_bitmap = queue_final_bitmap.replace("L", "") result_bitmap = output_seg(queue_final_bitmap) eth_txq_path = "/sys/class/net/{0}/queues/tx-{1}/xps_cpus".format(dev, i) with open(eth_txq_path, "w") as fxps: fxps.write(result_bitmap) print("{0}'s XPS configuration done.".format(dev)) def output_seg(bitmap): result = "" count = 0 for char in reversed(bitmap): if count % 8 == 0 and count != 0: result = "," + result result = char + result count += 1 return result def process_devs(): eth_dir = "/sys/class/net/" eth_folders = [f for f in os.listdir(eth_dir) if os.path.isdir(os.path.join(eth_dir, f)) and f.startswith("eth")] for eth_folder in eth_folders: eth = eth_folder.split("/")[-1] setup_xps(eth) if __name__ == '__main__': process_devs()
按
Esc
鍵,輸入:wq
保存并退出文件。
運(yùn)行以下命令,配置XPS。
sudo python3 xps_config.py
(可選)運(yùn)行以下命令,檢查XPS是否配置完成。
以目標(biāo)ECS實(shí)例32個(gè)CPU、8個(gè)發(fā)送隊(duì)列的網(wǎng)卡eth0為例:
cat /sys/class/net/eth0/queues/tx-*/xps_cpus
如下圖所示(CPU數(shù)目不同或者隊(duì)列數(shù)目不同,顯示結(jié)果不同),說(shuō)明XPS已經(jīng)配置成功。
影響說(shuō)明
盡管配置XPS的目的是為了提升網(wǎng)絡(luò)性能,但可能會(huì)出現(xiàn)配置XPS后網(wǎng)絡(luò)性能受到影響。如果您遇到這種情況,可以運(yùn)行以下命令來(lái)清除XPS配置。以網(wǎng)卡eth0為例:
sudo sh -c 'for txq in /sys/class/net/eth0/queues/tx-*; do echo 0 > $txq/xps_cpus; done'