日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity)

發(fā)布時(shí)間:2023/12/19 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載 - Linux 多核下綁定硬件中斷到不同 CPU(IRQ Affinity)

作者

digoal

日期

2016-11-20

標(biāo)簽

Linux , IRQ , 中斷 , CPU親和 , 綁定中斷處理CPU


背景

原文

http://www.vpsee.com/2010/07/load-balancing-with-irq-smp-affinity/

原文

硬件中斷發(fā)生頻繁,是件很消耗 CPU 資源的事情,在多核 CPU 條件下如果有辦法把大量硬件中斷分配給不同的 CPU (core) 處理顯然能很好的平衡性能。現(xiàn)在的服務(wù)器上動(dòng)不動(dòng)就是多 CPU 多核、多網(wǎng)卡、多硬盤,如果能讓網(wǎng)卡中斷獨(dú)占1個(gè) CPU (core)、磁盤 IO 中斷獨(dú)占1個(gè) CPU 的話將會(huì)大大減輕單一 CPU 的負(fù)擔(dān)、提高整體處理效率。VPSee 前天收到一位網(wǎng)友的郵件提到了 SMP IRQ Affinity,引發(fā)了今天的話題:D,以下操作在 SUN FIre X2100 M2 服務(wù)器+ 64位版本 CentOS 5.5 + Linux 2.6.18-194.3.1.el5 上執(zhí)行。

什么是中斷

中文教材上對(duì) “中斷” 的定義太生硬了,簡(jiǎn)單的說(shuō)就是,每個(gè)硬件設(shè)備(如:硬盤、網(wǎng)卡等)都需要和 CPU 有某種形式的通信以便 CPU 及時(shí)知道發(fā)生了什么事情,這樣 CPU 可能就會(huì)放下手中的事情去處理應(yīng)急事件,硬件設(shè)備主動(dòng)打擾 CPU 的現(xiàn)象就可稱為硬件中斷,就像你正在工作的時(shí)候受到 QQ 干擾一樣,一次 QQ 搖頭就可以被稱為中斷。

中斷是一種比較好的 CPU 和硬件溝通的方式,還有一種方式叫做輪詢(polling),就是讓 CPU 定時(shí)對(duì)硬件狀態(tài)進(jìn)行查詢?nèi)缓笞鱿鄳?yīng)處理,就好像你每隔5分鐘去檢查一下 QQ 看看有沒(méi)有人找你一樣,這種方式是不是很浪費(fèi)你(CPU)的時(shí)間?所以中斷是硬件主動(dòng)的方式,比輪詢(CPU 主動(dòng))更有效一些。

好了,這里又有了一個(gè)問(wèn)題,每個(gè)硬件設(shè)備都中斷,那么如何區(qū)分不同硬件呢?不同設(shè)備同時(shí)中斷如何知道哪個(gè)中斷是來(lái)自硬盤、哪個(gè)來(lái)自網(wǎng)卡呢?這個(gè)很容易,不是每個(gè) QQ 號(hào)碼都不相同嗎?同樣的,系統(tǒng)上的每個(gè)硬件設(shè)備都會(huì)被分配一個(gè) IRQ 號(hào),通過(guò)這個(gè)唯一的 IRQ 號(hào)就能區(qū)別張三和李四了。

在計(jì)算機(jī)里,中斷是一種電信號(hào),由硬件產(chǎn)生,并直接送到中斷控制器(如 8259A)上,然后再由中斷控制器向 CPU 發(fā)送信號(hào),CPU 檢測(cè)到該信號(hào)后,就中斷當(dāng)前的工作轉(zhuǎn)而去處理中斷。然后,處理器會(huì)通知操作系統(tǒng)已經(jīng)產(chǎn)生中斷,這樣操作系統(tǒng)就會(huì)對(duì)這個(gè)中斷進(jìn)行適當(dāng)?shù)奶幚怼,F(xiàn)在來(lái)看一下中斷控制器,常見的中斷控制器有兩種:可編程中斷控制器 8259A 和高級(jí)可編程中斷控制器(APIC),中斷控制器應(yīng)該在大學(xué)的硬件接口和計(jì)算機(jī)體系結(jié)構(gòu)的相關(guān)課程中都學(xué)過(guò)。傳統(tǒng)的 8259A 只適合單 CPU 的情況,現(xiàn)在都是多 CPU 多核的 SMP 體系,所以為了充分利用 SMP 體系結(jié)構(gòu)、把中斷傳遞給系統(tǒng)上的每個(gè) CPU 以便更好實(shí)現(xiàn)并行和提高性能,Intel 引入了高級(jí)可編程中斷控制器(APIC)。

光有高級(jí)可編程中斷控制器的硬件支持還不夠,Linux 內(nèi)核還必須能利用到這些硬件特質(zhì),所以只有 kernel 2.4 以后的版本才支持把不同的硬件中斷請(qǐng)求(IRQs)分配到特定的 CPU 上,這個(gè)綁定技術(shù)被稱為 SMP IRQ Affinity. 更多介紹請(qǐng)參看 Linux 內(nèi)核源代碼自帶的文檔:linux-2.6.31.8/Documentation/IRQ-affinity.txt

如何綁定中斷處理CPU

先看看系統(tǒng)上的中斷是怎么分配在 CPU 上的,很顯然 CPU0 上處理的中斷多一些:

# cat /proc/interrupts CPU0 CPU1 0: 918926335 0 IO-APIC-edge timer 1: 2 0 IO-APIC-edge i8042 8: 0 0 IO-APIC-edge rtc 9: 0 0 IO-APIC-level acpi 12: 4 0 IO-APIC-edge i8042 14: 8248017 0 IO-APIC-edge ide0 50: 194 0 IO-APIC-level ohci_hcd:usb2 58: 31673 0 IO-APIC-level sata_nv 90: 1070374 0 PCI-MSI eth0 233: 10 0 IO-APIC-level ehci_hcd:usb1 NMI: 5077 2032 LOC: 918809969 918809894 ERR: 0 MIS: 0

即能看到中斷號(hào),也能看到每個(gè)CPU的中斷處理次數(shù)。

為了不讓 CPU0 很累怎么把部分中斷轉(zhuǎn)移到 CPU1 上呢?或者說(shuō)如何把 eth0 網(wǎng)卡的中斷轉(zhuǎn)到 CPU1 上呢?先查看一下 IRQ 90 中斷的 smp affinity,看看當(dāng)前中斷是怎么分配在不同 CPU 上的(ffffffff 意味著分配在所有可用 CPU 上):

# cat /proc/irq/90/smp_affinity 7fffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff

在進(jìn)一步動(dòng)手之前我們需要先停掉 IRQ 自動(dòng)調(diào)節(jié)的服務(wù)進(jìn)程,這樣才能手動(dòng)綁定 IRQ 到不同 CPU,否則自己手動(dòng)綁定做的更改將會(huì)被自動(dòng)調(diào)節(jié)進(jìn)程給覆蓋掉。如果想修改 IRQ 90 的中斷處理,綁定到第2個(gè) CPU(CPU1):

# /etc/init.d/irqbalance stop # echo "2" > /proc/irq/90/smp_affinity

(上面的 echo “2” 是怎么來(lái)的?為什么是 ”2“?請(qǐng)參考本文末尾:計(jì)算 SMP IRQ Affinity)過(guò)段時(shí)間在看 /proc/interrupts,是不是 90:eth0 在 CPU1 上的中斷增加了(145)、在 CPU0 上的中斷沒(méi)變?不斷打印 /proc/interrupts 就會(huì)發(fā)現(xiàn) eth0 在 CPU0 上的中斷數(shù)始終保持不變,而在 CPU1 上的中斷數(shù)是持續(xù)增加的,這正是我們想要的結(jié)果:

# cat /proc/interrupts CPU0 CPU1 0: 922506515 0 IO-APIC-edge timer 1: 2 0 IO-APIC-edge i8042 8: 0 0 IO-APIC-edge rtc 9: 0 0 IO-APIC-level acpi 12: 4 0 IO-APIC-edge i8042 14: 8280147 0 IO-APIC-edge ide0 50: 194 0 IO-APIC-level ohci_hcd:usb2 58: 31907 0 IO-APIC-level sata_nv 90: 1073399 145 PCI-MSI eth0 233: 10 0 IO-APIC-level ehci_hcd:usb1 NMI: 5093 2043 LOC: 922389696 922389621 ERR: 0 MIS: 0

有什么用

在網(wǎng)絡(luò)非常 heavy 的情況下,對(duì)于文件服務(wù)器、高流量 Web 服務(wù)器這樣的應(yīng)用來(lái)說(shuō),把不同的網(wǎng)卡 IRQ 均衡綁定到不同的 CPU 上將會(huì)減輕某個(gè) CPU 的負(fù)擔(dān),提高多個(gè) CPU 整體處理中斷的能力;對(duì)于數(shù)據(jù)庫(kù)服務(wù)器這樣的應(yīng)用來(lái)說(shuō),把磁盤控制器綁到一個(gè) CPU、把網(wǎng)卡綁定到另一個(gè) CPU 將會(huì)提高數(shù)據(jù)庫(kù)的響應(yīng)時(shí)間、優(yōu)化性能。合理的根據(jù)自己的生產(chǎn)環(huán)境和應(yīng)用的特點(diǎn)來(lái)平衡 IRQ 中斷有助于提高系統(tǒng)的整體吞吐能力和性能。

VPSee 經(jīng)常收到網(wǎng)友來(lái)信問(wèn)到如何優(yōu)化 Linux、優(yōu)化 VPS、這個(gè)問(wèn)題不太好回答,要記住的是性能優(yōu)化是一個(gè)過(guò)程而不是結(jié)果,不是看了些文檔改了改參數(shù)就叫優(yōu)化了,后面還需要大量的測(cè)試、監(jiān)測(cè)以及持續(xù)的觀察和改進(jìn)。

其他

把irqbalance 停掉會(huì)不會(huì)有其他問(wèn)題出玩?

不會(huì)有什么嚴(yán)重問(wèn)題,但是沒(méi)有 irqbalance 也沒(méi)有合理的做手動(dòng) irq 綁定的話會(huì)有性能問(wèn)題。手動(dòng) irq 只推薦給很 heavy、很特殊的情況,比如帶多網(wǎng)卡多硬盤的網(wǎng)絡(luò)存儲(chǔ)服務(wù)器,一般機(jī)器一般應(yīng)用還是用 irqbalance 省心。

事實(shí)上以前 Linux 是不推薦使用 irqbalance 的,原因在于當(dāng)時(shí)的 irqbalance 實(shí)現(xiàn)很簡(jiǎn)單,沒(méi)有什么優(yōu)化作用,后來(lái)的 irqbalance (cache topology + power aware) 有了很大改進(jìn),在多核上表現(xiàn)良好。

計(jì)算 SMP IRQ Affinity

“echo 2 > /proc/irq/90/smp_affinity” 中的 ”2“ 是怎么來(lái)的,這其實(shí)是個(gè)二進(jìn)制數(shù)字,代表 00000010,00000001 代表 CPU0 的話,00000010 就代表 CPU1, “echo 2 > /proc/irq/90/smp_affinity” 的意思就是說(shuō)把 90 中斷綁定到 00000010(CPU1)上。所以各個(gè) CPU 用二進(jìn)制和十六進(jìn)制表示就是:

Binary Hex CPU 0 00000001 1 CPU 1 00000010 2 CPU 2 00000100 4 CPU 3 00001000 8

如果我想把 IRQ 綁定到 CPU2 上就是 00000100=4:

# echo "4" > /proc/irq/90/smp_affinity

如果我想把 IRQ 同時(shí)平衡到 CPU0 和 CPU2 上就是 00000001+00000100=00000101=5

# echo "5" > /proc/irq/90/smp_affinity

需要注意的是,在手動(dòng)綁定 IRQ 到 CPU 之前需要先停掉 irqbalance 這個(gè)服務(wù),irqbalance 是個(gè)服務(wù)進(jìn)程、是用來(lái)自動(dòng)綁定和平衡 IRQ 的:

# /etc/init.d/irqbalance stop

還有一個(gè)限制就是,IO-APIC 有兩種工作模式:

logic 和 physical,

在 logic 模式下 IO-APIC 可以同時(shí)分布同一種 IO 中斷到8顆 CPU (core) 上(受到 bitmask 寄存器的限制,因?yàn)?bitmask 只有8位長(zhǎng)。);

在 physical 模式下不能同時(shí)分布同一中斷到不同 CPU 上,比如,不能讓 eth0 中斷同時(shí)由 CPU0 和 CPU1 處理,這個(gè)時(shí)候只能定位 eth0 到 CPU0、eth1 到 CPU1,也就是說(shuō) eth0 中斷不能像 logic 模式那樣可以同時(shí)由多個(gè) CPU 處理。

下面給大家提供一個(gè)計(jì)算小腳本值提供中斷在單CPU上

#!/bin/bash #Author Jiaion MSN:Jiaion@msn.com [ $# -ne 1 ] && echo ‘$1 is Cpu core number’ && exit 1 CCN=$1 echo “Print eth0 affinity” for((i=0; i<${CCN}; i++)) do echo ============================== echo "Cpu Core $i is affinity" ((affinity=(1<<i))) echo "obase=16;${affinity}" | bc echo ============================== done

總結(jié)

以上是生活随笔為你收集整理的Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。