今日文章:
小林coding:什么是軟中斷?
目錄
- 軟中斷
- 軟中斷概述
- 軟中斷類型
- 如何定位軟中斷 CPU 使用率過高的問題?
其他:
往期打卡
軟中斷
中斷是系統用來響應硬件設備請求的一種機制,操作系統收到硬件的中斷請求,會打斷正在執行的進程,然后調用內核中的中斷處理程序來響應請求
中斷請求的響應程序,也就是中斷處理程序,要盡可能快的執行完,這樣可以減少對正常進程運行調度地影響。
軟中斷概述
Linux 系統為了解決中斷處理程序執行過長和中斷丟失的問題,將中斷過程分成了兩個階段,分別是「上半部和下半部分」。
- 上半部用來快速處理中斷,一般會暫時關閉中斷請求,主要負責處理跟硬件緊密相關或者時間敏感的事情。
- 下半部用來延遲處理上半部未完成的工作,一般以「內核線程」的方式運行。
網卡收到網絡包后,通過 DMA 方式將接收到的數據寫入內存,接著會通過硬件中斷通知內核有新的數據到了,于是內核就會調用對應的中斷處理程序來處理該事件,這個事件的處理也是會分成上半部和下半部。
上部分要做的事情很少,會先禁止網卡中斷,避免頻繁硬中斷,而降低內核的工作效率。接著,內核會觸發一個軟中斷,把一些處理比較耗時且復雜的事情,交給「軟中斷處理程序」去做,也就是中斷的下半部,其主要是需要從內存中找到網絡數據,再按照網絡協議棧,對網絡數據進行逐層解析和處理,最后把數據送給應用程序。
所以,中斷處理程序的上部分和下半部可以理解為:
- 上半部直接處理硬件請求,也就是硬中斷,主要是負責耗時短的工作,特點是快速執行;
- 下半部是由內核觸發,也就說軟中斷,主要是負責上半部未完成的工作,通常都是耗時比較長的事情,特點是延遲執行;
硬中斷(上半部)是會打斷 CPU 正在執行的任務,然后立即執行中斷處理程序,而軟中斷(下半部)是以內核線程的方式執行,并且每一個 CPU 都對應一個軟中斷內核線程,名字通常為「ksoftirqd/CPU 編號」,比如 0 號 CPU 對應的軟中斷內核線程的名字是 ksoftirqd/0
不過,軟中斷不只是包括硬件設備中斷處理程序的下半部,一些內核自定義事件也屬于軟中斷,比如內核調度等、RCU 鎖(內核里常用的一種鎖)等。
軟中斷類型
看 /proc/interrupts
的 內容來知曉「硬中斷」的運行情況
看 /proc/softirqs
的 內容來知曉「軟中斷」的運行情況
每一個 CPU 都有自己對應的不同類型軟中斷的累計運行次數,如圖,該操作系統包含了10種軟中斷類型
比如 NET_RX
表示網絡接收中斷,NET_TX
表示網絡發送中斷、TIMER
表示定時中斷、RCU
表示 RCU 鎖中斷、SCHED
表示內核調度中斷。
值得注意的還有同一種類型的軟中斷在不同 CPU 的分布情況,正常情況下,同一種中斷在不同 CPU 上的累計次數相差不多
這些數值是系統運行以來的累計中斷次數,數值的大小沒什么參考意義,但是系統的中斷次數的變化速率才是我們要關注的,我們可以使用 watch -d cat /proc/softirqs
命令查看中斷次數的變化速率。
軟中斷是以內核線程的方式執行的,我們可以用 ps
命令可以查看到對應的線程
圖中可以看到有 4 個 ksoftirqd
內核線程,因為這臺服務器是4核心的,每個CPU核心都對應著一個內核線程
內核線程的名字外面都有有中括號,這說明 ps 無法獲取它們的命令行參數。一般來說,名字在中括號里的都可以認為是內核線程。
如何定位軟中斷 CPU 使用率過高的問題?
使用 top 命令查看系統的軟中斷的系統監控數據
上圖中的黃色部分 si
,就是 CPU 在軟中斷上的使用率,而且可以發現,每個 CPU 使用率都不高,兩個 CPU 的使用率雖然只有 3% 和 4% 左右,但是都是用在軟中斷上了。
另外,也在圖片下方的表格中可以看到 CPU 使用率最高的進程也是軟中斷 ksoftirqd
,因此可以認為此時系統的開銷主要來源于軟中斷。
如果要知道是哪種軟中斷類型導致的,我們可以使用 watch -d cat /proc/softirqs
命令查看每個軟中斷類型的中斷次數的變化速率。
一般對于網絡 I/O 比較高的 Web 服務器,NET_RX
網絡接收中斷的變化速率相比其他中斷類型快很多。如果發現 NET_RX
網絡接收中斷次數的變化速率過快,接下來就可以使用 sar -n DEV
查看網卡的網絡包接收速率情況,然后分析是哪個網卡有大量的網絡包進來。
接著,在通過 tcpdump
抓包,分析這些包的來源,如果是非法的地址,可以考慮加防火墻,如果是正常流量,則要考慮硬件升級等。
往期打卡
暑假讀書筆記第三天
暑假讀書筆記第二天
暑假讀書筆記第一天