09 基礎篇 怎麼理解Linux軟中斷?

2022-09-14 21:15:22 字數 4089 閱讀 7655

程序的不可中斷狀態是系統的一種保護機制,可以保證硬體的互動過程不被意外打斷

所以,短時間的不可中斷狀態是很正常的

當程序長時間都處於不可中斷狀態時,就得當心了

可以使用dstat、pidstat等工具,確認是不是磁碟i/o的問題,進而排查相關的程序和磁碟裝置

除了iowait,軟中斷(softirq)cpu使用率公升高也是最常見的一種效能問題

中斷是系統用來響應硬體裝置請求的一種機制,它會打斷程序的正常排程和執行

然後呼叫核心中的中斷處理程式來響應裝置的請求

舉例1:

比如說你訂了乙份外賣,但是不確定外賣什麼時候送到,也沒有別的方法了解外賣的進度

但是,配送員送外賣是不等人的,到了你這兒沒人取的話,就直接走人了

所以你只能苦苦等著,時不時去門口看看外賣送到沒,而不能幹其他事情

不過呢,如果在訂外賣的時候,你就跟配送員約定好,讓他送到後給你打個**

那你就不用苦苦等待了,就可以去忙別的事情,直到**一響,接**、取外賣就可以了

這裡的「打**」,其實就是乙個中斷

沒接到**的時候,你可以做其他的事情

只有接到了**(也就是發生中斷),才要進行另乙個動作:取外賣

#這個例子可以發現:中斷其實是一種非同步的事件處理機制,可以提高系統的併發處理能力

由於中斷處理程式會打斷其他程序的執行

所以,為了減少對正常程序執行排程的影響,中斷處理程式就需要盡可能快地執行

如果中斷本身要做的事情不多,那麼處理起來也不會有太大問題

但如果中斷要處理的事情很多,中斷服務程式就有可能要執行很長時間

特別是,中斷處理程式在響應中斷時,還會臨時關閉中斷

這就會導致上一次中斷處理完成之前,其他中斷都不能響應,也就是說中斷有可能會丟失

舉例2:

還是以取外賣為例

假如訂了2份外賣,乙份主食和乙份飲料,並且是由2個不同的配送員來配送

這次不用時時等待著,兩份外賣都約定了**取外賣的方式

但是,問題又來了,

當第乙份外賣送到時,配送員給你打了個長長的**,商量發票的處理方式

與此同時,第二個配送員也到了,也想給你打**

但是很明顯,因為**佔線(也就是關閉了中斷響應),

第二個配送員的**是打不通的

所以,第二個配送員很可能試幾次後就走掉了(也就是丟失了一次中斷)

為了解決中斷處理程式執行過長和中斷丟失的問題,linux將中斷處理過程分成了兩個階段,

也就是上半部和下半部:

1.上半部用來快速處理中斷,它在中斷禁止模式下執行,主要處理跟硬體緊密相關的或時間敏感的工作

2.下半部用來延遲處理上半部未完成的工作,通常以核心執行緒的方式執行

比如說前面取外賣的例子2,

上半部就是你接聽**,告訴配送員你已經知道了,其他事兒見面再說,然後**就可以結束通話了

下半部才是取外賣的動作,以及見面後商量發票處理的動作

這樣,第乙個配送員不會占用你太多時間

當第二個配送員過來時,照樣能正常打通你的**

舉例3網絡卡接收資料報的例子

網絡卡接收到資料報後,會通過硬體中斷的方式,通知核心有新的資料到了

這時,核心就應該呼叫中斷處理程式來響應它

這種情況下的上半部和下半部分別負責什麼工作呢?

對上半部來說,既然是快速處理,其實就是要把網絡卡的資料讀到記憶體中

然後更新一下硬體暫存器的狀態(表示資料已經讀好了)

最後再傳送乙個軟中斷訊號,通知下半部做進一步的處理

而下半部被軟中斷訊號喚醒後,需要從記憶體中找到網路資料

再按照網路協議棧,對資料進行逐層解析和處理,直到把它送給應用程式

所以,這兩個階段也可以這樣理解:

1.上半部直接處理硬體請求,也就是我們常說的硬中斷,特點是快速執行

2.下半部則是由核心觸發,也就是我們常說的軟中斷,特點是延遲執行

實際上,上半部會打斷cpu正在執行的任務,然後立即執行中斷處理程式

而下半部以核心執行緒的方式執行,並且每個cpu都對應乙個軟中斷核心執行緒

名字為「ksoftirqd/cpu編號」

比如說,0號cpu對應的軟中斷核心執行緒的名字就是ksoftirqd/0

不過要注意的是,軟中斷不只包括了剛剛所講的硬體裝置中斷處理程式的下半部,一些核心自定義的事件也屬於軟中斷

比如核心排程和rcu鎖(read-copy update的縮寫,rcu是linux核心中最常用的鎖之一)等

proc檔案系統

它是一種核心空間和使用者空間進行通訊的機制,可以用來檢視核心的資料結構,或者用來動態修改核心的配置

/proc/softirqs 提供了軟中斷的運**況

/proc/interrupts 提供了硬中斷的運**況

檢視/proc/softirqs檔案的內容,可以看到各種型別軟中斷在不同cpu上的累積執行次數

[root@local_sa_192-168-1-6 ~]# cat /proc/softirqs

cpu0 cpu1

hi: 3 0

timer: 1028114 1356422

net_tx: 5 2

net_rx: 1136736 1506885

block: 53674 20745

block_iopoll: 0 0

tasklet: 304787 3691

sched: 798684 1147665

hrtimer: 0 0

rcu: 260305 241500

# 在檢視/proc/softirqs檔案內容時,要特別注意以下這兩點

1.要注意軟中斷的型別,也就是這個介面中第一列的內容

從第一列可以看到,軟中斷包括了10個類別,分別對應不同的工作型別

比如net_rx表示網路接收中斷,而net_tx表示網路傳送中斷

2.要注意同一種軟中斷在不同cpu上的分布情況,也就是同一行的內容

正常情況下,同一種中斷在不同cpu上的累積次數應該差不多

比如這個介面中,net_rx在cpu0和cpu1上的中斷次數基本是同乙個數量級,相差不大

tasklet在不同cpu上的分布並不均勻

tasklet是最常用的軟中斷實現機制,每個tasklet只執行一次就會結束

並且只在呼叫它的函式所在的cpu上執行

因此,使用tasklet特別簡便,當然也會存在一些問題

比如說由於只在乙個cpu上執行導致的排程不均衡

再比如因為不能在多個cpu上並行執行帶來了效能限制

軟中斷實際上是以核心執行緒的方式執行的,每個cpu都對應乙個軟中斷核心執行緒

這個軟中斷核心執行緒就叫做ksoftirqd/cpu編號

那要怎麼檢視這些執行緒的執行狀況呢?

# ps命令就可以做到,比如執行下面的指令

[root@local_sa_192-168-1-6 ~]# ps aux|grep softirq

root 6 0.0 0.0 0 0 ? s 11月16 0:00 [ksoftirqd/0]

root 14 0.0 0.0 0 0 ? s 11月16 0:00 [ksoftirqd/1]

# 這些執行緒的名字外面都有中括號,這說明ps無法獲取它們的命令列引數

一般來說,ps的輸出中,名字括在中括號裡的,一般都是核心執行緒

linux中的中斷處理程式分為上半部和下半部

上半部對應硬體中斷,用來快速處理中斷

下半部對應軟中斷,用來非同步處理上半部未完成的工作

linux中的軟中斷包括網路收發、定時、排程、rcu鎖等各種型別

可以通過檢視/proc/softirqs來觀察軟中斷的運**況

大量的網路小包會導致效能問題嗎?

會,大量的小網路包會導致頻繁的硬中斷和軟中斷,消耗cpu的效能

怎麼理解Linux軟中斷?

如果覺得該文章不錯,可以嘗試購買該課程學習。傳送門 中斷是系統用來響應硬體裝置請求的一種機制,它會打斷程序的正常排程和執行,然後呼叫核心中的中斷處理程式來響應裝置的請求。舉個生活中的例子 比如說你訂了乙份外賣,但是不確定外賣什麼時候送到,也沒有別的方法了解外賣的進度,但是,配送員送外賣是不等人的,到...

Linux 怎麼理解Linux軟中斷?

為了解決中斷處理程式執行過長和中斷丟失的問題,linux 將中斷處理過程分成了兩個階段,也就是上半部和下半部 舉個最常見的網絡卡接收資料報的例子,讓你更好地理解。網絡卡接收到資料報後,會通過硬體中斷的方式,通知核心有新的資料到了。這時,核心就應該呼叫中斷處理程式來響應它。你可以自己先想一下,這種情況...

Linux怎麼取消軟鏈結

linux下取消軟連線,做個案例來說明 1.先建立乙個軟連線 1 2 3 4 5 6 7 8 9 10 11 12 13 root rekfan.comtest ls il 總計 0 1491138 rw r r 1 root root 48 07 14 14 17 file1 1491139 rw...