怎么理解Linux軟中斷?


1、什么是中斷
中斷表示我們請求操作硬件操作准備就緒了,例如從磁盤讀取數據,我們知道CPU執行速度比磁盤執行速度快幾個數量級,因此如果CPU每次check磁盤是否准備就緒了,那么系統的並發能力和性能會大大下降,但是采用中斷方式,異步事件驅動方式來提升系統效率,首先會在驅動程序中嵌入中斷程序,一旦磁盤准備就緒就會通過驅動程序發生一個中斷請求操作,CPU立馬停下手里的活來執行中斷程序,該中斷程序會從磁盤中讀取數據到內存中。

2、如何避免丟失其他中斷請求
一定要保證中斷程序快速能處理,因為當CPU在處理中斷時,是不能響應其他中斷請求的,那么就會導致其他中斷請求丟失
舉個取外賣的例子:我們在app上點外賣,但是這個外賣不知道什么時候到,因為送外賣小哥一旦到了目的地就會放下外賣就走,這個時候你就會一次又一次的check外賣是否到了,然而你什么時候也干不了,僅僅在來來回回看外賣是否到了,導致浪費你的時間。

改進方式:如果換一種方式,你和外賣小哥約定一個通知方式,例如當外賣到了家門口小哥就打電話通知我,我就出去取外賣。 打電話就是一次中斷請求,你就安心的干其他事情,靜靜等電話。 如果你點了兩份外賣,當第一份外賣到了,小哥電話通知你,但是你在電話中溝通發票問題,這個時候第二份外賣到了另外一個小哥給你打電話發現占線,幾次嘗試后還是失敗,這個時候外賣小哥就走了,導致丟失了這次外賣。

3. 解決

在電話中只回答好,然后溝通發票問題當面說,這個時候就可以接到另外小哥的電話。 所以中斷請求分為兩個階段:
第一階段(上半部請求):接受硬件中斷請求(從硬件中取完數據后發送一次軟斷請求,復雜邏輯交給下半部分請求,),稱為硬中斷,特點是處理速度快
第二階段(下半部請求): 內核線程接受到上半部分軟中斷請求,就會異步的繼續執行上半部未完成的請求, 稱為軟中斷,特點延遲執行

舉個網絡接受數據例子:
當網卡接收到數據時,首先會發送一個硬中斷請求,這個時候CPU就會執行中斷處理程序,快速將網卡中數據讀取到內存中,完成后會發送一個軟中斷請求,下半部被軟中斷信號喚醒后就會按照網絡協議棧將內存數據進行解析處理,最終遞給應用程序。(處理期間還是可以響應其他硬中斷請求的)


4、查看硬中斷和軟中斷運行情況
可以查看 /proc/interrupts 和 /proc/softirq 文件

 

5. 問題:因為軟中斷出現的性能問題?
之前的c程序用到了別人寫的動態庫[如:lib.a],在物理機上,進程的cpu利用率在0%;而切換到了雲服務器,即使空載,單進程的cpu利用率都有30%+。
以前沒經驗嘛,各種自查,無結果,但是自己的進程cpu利用率又那么高,總是不安心.
后來才通過vmstat 檢測到系統的軟中斷每秒有100W+次.
最后各自百度,找人,才發現是那個動態庫在處理網絡收發消息時,使用了usleep(1)來休息,每次休息1納秒,單次中斷的耗時都不止1納秒.

6. 分析

1) 檢測是哪個線程占用了cpu: top -H -p XX 1 / pidstat -wut -p XX 12.在進程中打印各線程號. 找到是哪個線程.[ 此過程也可以省略 但可以快速定位線程]
3) 第一步應該可以判斷出來中斷數過高. 再使用 cat /proc/softirqs 查看是哪種類型的中斷數過高.
4) 不知道perf report -g -p XX 是否可以定位到具體的系統調用函數.
5) 最終還是要查看源碼,定位具體的位置,並加以驗證.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM