簡單的說,每個設備(網卡、硬盤等)都需要和CPU有某種形式的通信以便CPU及時知道發生了什麼事情,這樣CPU就會放下手中的事情去處理應急事件,硬件設備主動打擾CPU的現象就是硬件中斷。
- 硬中斷是由硬件產生,比如硬盤、網卡、鍵盤燈。每個設備都有它自己的IRQ(中斷請求)。基於IRQ,CPU可以相應的將請求分配到對應的硬件驅動(硬件驅動通常是內核中的一個子程序,而不是一個獨立的進程)。
- 處理中斷的驅動是需要運行在CPU上的,因此當中斷產生的時候,CPU會中斷當前正在運行的任務,來處理中斷。有多核的系統上,一箇中斷通常只能中斷一個CPU(也有特殊的情況,就是在大型主機上有硬件通道的,它可以沒有主CPU的支持下,可以同時處理多箇中斷)。
- 硬中斷可以直接中斷CPU。它會引起內核中相關的代碼被觸發。對於那些需要花費一些時間去處理的進程,中斷代碼本身可以被其他硬中斷中斷。
- 對於時鐘中斷,內核調度代碼會將當前正在運行的進程掛起,從而讓其他的進程運行。它的存在是爲了讓調度器可以調度多任務。
- 軟中斷的處理非常像硬中斷。然而,它們僅僅是由當前運行的進程產生的。
- 通常,軟中斷是一些對IO請求。這些請求會調用內核中可以調度IO發生的程序。對於某些設備,IO請求需要被立即處理,而磁盤IO請求通常可以排隊並且稍後處理。根據IO模型的不同,進程或許會被掛起直到IO完成,此時內核調度器會選擇另一個進程去運行。IO可以在進程之間產生並且調度過程和磁盤IO的方式相同。
- 軟中斷僅與內核有聯繫。而內核主要負責對需要運行的其他的進程進行調度。一些內核允許設備驅動的一部分在用戶空間,並且當需要的時候內核也會調度這個進程去運行。
- 軟中斷不會直接中斷CPU。而只有當前運行的代碼(進程)纔會產生軟中斷。這種中斷是一種需要內核爲正在運行的進程去做一些事情的請求。
新的內核,Linux改進了分配特定中斷到指定的處理器(或處理器組)的功能,這被稱爲SMP IRQ Affinity,它可以控制系統如何響應各種硬件時間。允許你限制或者重新分配服務器的工作負載,從而讓服務器更有效的工作,以網卡中斷爲例,在沒有設置SMP IRQ Affinity時,所有網卡中斷都關聯到CPU0,這導致了CPU0負載過高,而無法有效快速的處理網絡數據包,導致了瓶頸。通過SMP IRQ Affinity,把網卡多箇中斷分配到多個CPU上,可以分散CPU壓力,提高數據處理速度。
irqbalance用於優化中斷分配,它會自動收集系統數據以分析使用模式,並根據系統負載狀況將工作狀態置於Performance mode或 Power-save mode。處於Performance mode時,irqbalance會將中斷儘可能均勻地發給各個CPU以充分利用CPU多核,提高性能。Power-save mode時,irqbalance會將中斷集中分配給第一個CPU,以保證其他空閒CPU的睡眠時間,降低能耗。
多隊列網卡是一種技術,最初用於解決網絡IO Qos問題的,隨着網絡IO帶寬的不斷提升,單核CPU不能完全滿足網卡的需求,通過多隊列網卡驅動的支持,將各個隊列通過中斷綁定到不同的核上。其實用bonding網卡綁定在一定程度上可以做中斷負載均衡,不同的網卡中斷號綁定在不同的cpu核上。