在高性能服務(wù)器或嵌入式設(shè)備(如瑞芯微RK3588)上,中斷處理的CPU核心綁定是優(yōu)化性能的關(guān)鍵手段之一。比如網(wǎng)卡中斷默認(rèn)綁在小核上時(shí),高網(wǎng)絡(luò)負(fù)載會(huì)導(dǎo)致小核過(guò)載,而大核卻“閑置”;通過(guò)中斷轉(zhuǎn)移,把網(wǎng)卡中斷綁到性能更強(qiáng)的大核,能顯著提升網(wǎng)絡(luò)吞吐量、降低延遲。

一、為什么要做中斷轉(zhuǎn)移?
中斷是CPU處理硬件事件的“信號(hào)”,但默認(rèn)情況下,中斷可能被隨機(jī)分發(fā)到不同CPU核心。在以下場(chǎng)景,中斷轉(zhuǎn)移尤為重要:
?異構(gòu)CPU(大小核):如RK3588的A76大核(性能強(qiáng))和A55小核(能效高),把網(wǎng)卡、存儲(chǔ)等核心中斷綁到大核,充分利用大核算力。
?多核負(fù)載均衡:避免單個(gè)核心因中斷“扎堆”導(dǎo)致過(guò)載,讓核心資源更均衡。
?低延遲場(chǎng)景:對(duì)延遲敏感的業(yè)務(wù)(如實(shí)時(shí)網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)),將中斷綁到專屬核心,減少調(diào)度干擾。
二、應(yīng)用層:三步完成中斷轉(zhuǎn)移
以網(wǎng)卡eth0的中斷轉(zhuǎn)移到CPU7為例,操作只需3步:
步驟1:找到目標(biāo)中斷的“身份證”——中斷號(hào)
通過(guò)/proc/interrupts查看中斷與設(shè)備的對(duì)應(yīng)關(guān)系:

?這里156就是**eth0-0中斷的中斷號(hào)**。
步驟2:計(jì)算目標(biāo)CPU的“綁定掩碼”
Linux用十六進(jìn)制掩碼表示中斷允許分發(fā)的CPU核心,每一位對(duì)應(yīng)一個(gè)CPU(從右到左,最低位為CPU0):
?CPU0→01(二進(jìn)制00000001)
?CPU1→02(二進(jìn)制00000010)
?CPU2→04(二進(jìn)制00000100)
?...
?CPU7→80(二進(jìn)制10000000)
如果要綁到CPU7,掩碼就是80。
步驟3:寫(xiě)入掩碼,完成“搬家”
將掩碼寫(xiě)入/proc/irq/[中斷號(hào)]/smp_affinity:
echo80 > /proc/irq/156/smp_affinity
驗(yàn)證轉(zhuǎn)移結(jié)果
再次查看中斷計(jì)數(shù),確認(rèn)CPU7的計(jì)數(shù)是否開(kāi)始增長(zhǎng):
watch-n1"cat /proc/interrupts | grep eth0"
若eth0-0對(duì)應(yīng)的CPU7列(最右列)數(shù)值持續(xù)增加,說(shuō)明轉(zhuǎn)移成功。
三、底層:中斷是如何“認(rèn)新核心”的?
從內(nèi)核到硬件,中斷轉(zhuǎn)移的核心邏輯分為3層:
1.用戶空間與內(nèi)核的交互:/proc接口
/proc/irq/[中斷號(hào)]/smp_affinity是用戶空間與內(nèi)核中斷子系統(tǒng)的“橋梁”。當(dāng)你寫(xiě)入掩碼時(shí),內(nèi)核會(huì)解析這個(gè)十六進(jìn)制值,轉(zhuǎn)換為CPU親和性位圖。
2.內(nèi)核中斷子系統(tǒng):配置親和性
內(nèi)核通過(guò)irq_desc結(jié)構(gòu)體管理每個(gè)中斷的屬性,其中包含irq_data.affinity(親和性位圖)。當(dāng)寫(xiě)入smp_affinity時(shí),內(nèi)核會(huì):
?解析十六進(jìn)制掩碼為二進(jìn)制位圖;
?更新irq_desc中該中斷的親和性配置;
?通知中斷控制器(如ARM GIC):“這個(gè)中斷以后只發(fā)給指定CPU”。
3.硬件中斷控制器:最終的“分發(fā)者”
以ARM GIC(通用中斷控制器)為例,它會(huì)根據(jù)內(nèi)核設(shè)置的親和性寄存器(Affinity Register),決定將中斷信號(hào)發(fā)送到哪個(gè)CPU核心。
比如,當(dāng)GIC收到eth0的中斷請(qǐng)求時(shí),會(huì)檢查該中斷的親和性配置,然后直接把中斷“投遞”到CPU7的中斷管線,確保只有CPU7會(huì)響應(yīng)這個(gè)中斷。
四、實(shí)戰(zhàn):RK3588上的中斷轉(zhuǎn)移(大小核優(yōu)化)
RK3588采用“4大核(A76)+4小核(A55)”架構(gòu),假設(shè)要把eth0的關(guān)鍵中斷移到大核(如CPU6、CPU7),步驟如下:
1.確定大核編號(hào):通過(guò)lscpu查看CPU架構(gòu),確認(rèn)大核對(duì)應(yīng)的邏輯CPU編號(hào)(比如CPU4~CPU7是大核)。
2.找到eth0中斷號(hào):
cat/proc/interrupts | grep eth0
假設(shè)關(guān)鍵中斷號(hào)是156(eth0-0)。
1.綁定到大核(如CPU7):
echo80 > /proc/irq/156/smp_affinity
1.驗(yàn)證與壓測(cè):
?用watch監(jiān)控中斷計(jì)數(shù),確認(rèn)CPU7列增長(zhǎng);
?用iperf進(jìn)行網(wǎng)絡(luò)壓測(cè),對(duì)比轉(zhuǎn)移前后的吞吐量和延遲。
以下視頻為指令切換到不同核,右邊中斷觀察變化五、注意事項(xiàng):這些坑要避開(kāi)
1.irqbalance服務(wù)的干擾:
irqbalance是一個(gè)“自動(dòng)均衡中斷”的服務(wù),會(huì)動(dòng)態(tài)調(diào)整中斷綁定。如果要固定中斷核心,需先關(guān)閉它:
systemctl stop irqbalancesystemctldisableirqbalance
1.多隊(duì)列網(wǎng)卡的配合:
現(xiàn)代網(wǎng)卡支持“多隊(duì)列RSS(接收端縮放)”,可將不同數(shù)據(jù)流的中斷分散到多個(gè)隊(duì)列。此時(shí),除了中斷綁定,還需配置隊(duì)列的CPU親和性(通過(guò)/sys/class/net/eth0/queues/目錄)。
2.配置的持久性:
/proc下的配置是臨時(shí)的,重啟后會(huì)丟失。若需永久生效,可將命令寫(xiě)入啟動(dòng)腳本(如/etc/rc.local)或系統(tǒng)服務(wù)。
3.大小核的“能力”匹配:
確保目標(biāo)CPU核心支持處理該中斷(比如某些特殊中斷可能只能由特定核心處理,需查閱SoC手冊(cè))。
總結(jié)
中斷轉(zhuǎn)移是Linux系統(tǒng)“精細(xì)化性能調(diào)優(yōu)”的重要手段,從應(yīng)用層的簡(jiǎn)單配置,到底層內(nèi)核與硬件的協(xié)同,本質(zhì)是讓“中斷信號(hào)”精準(zhǔn)匹配“算力核心”。無(wú)論是異構(gòu)CPU的性能釋放,還是多核負(fù)載的均衡,掌握中斷轉(zhuǎn)移,能讓你的系統(tǒng)跑得更“聰明”。
如果是嵌入式或服務(wù)器開(kāi)發(fā),趕緊試試把核心中斷綁到高性能核心,看看業(yè)務(wù)延遲和吞吐量的變化吧~
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20445瀏覽量
333994 -
cpu
+關(guān)注
關(guān)注
68文章
11277瀏覽量
224956 -
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219009
發(fā)布評(píng)論請(qǐng)先 登錄
力天手把手教你學(xué)單片機(jī)視頻全集下載
美女手把手教你如何裝機(jī)(中)
手把手教你安裝Quartus II
手把手教你學(xué)LabVIEW視覺(jué)設(shè)計(jì)
手把手教你開(kāi)關(guān)電源PCB排板
《嵌入式 - STM32開(kāi)發(fā)指南》手把手教你搭建STM32開(kāi)發(fā)環(huán)境 [Linux版 - 3]
手把手教你如何調(diào)優(yōu)Linux網(wǎng)絡(luò)參數(shù)
RK3588核心板/開(kāi)發(fā)板RT-Linux系統(tǒng)實(shí)時(shí)性及硬件中斷延遲測(cè)試
RK3588 CPU?隔離:AB/非?AB?系統(tǒng)雙方案適配實(shí)戰(zhàn)
Linux中斷“搬家”指南:從應(yīng)用到操作,手把手教你轉(zhuǎn)移中斷核心(RK3588)
評(píng)論