軟中斷


原創轉載請注明出處:https://www.cnblogs.com/agilestyle/p/11520377.html

 

中斷

中斷是系統用來響應硬件設備請求的一種機制,它會打斷進程的正常調度和執行,然后調用內核中的中斷處理程序來響應設備的請求。

中斷其實是一種異步的事件處理機制,可以提高系統的並發處理能力。

由於中斷處理程序會打斷其他進程的運行,所以,為了減少對正常進程運行調度的影響,中斷處理程序就需要盡可能快地運行。如果中斷本身要做的事情不多,那么處理起來也不會有太大問題;但如果中斷要處理的事情很多,中斷服務程序就有可能要運行很長時間。

特別是,中斷處理程序在響應中斷時,還會臨時關閉中斷。這就會導致上一次中斷處理完成之前,其他中斷都不能響應,也就是說中斷有可能會丟失。

舉個例子:你訂了 2 份外賣,一份主食和一份飲料,並且是由2個不同的配送員來配送。這次你不用時時等待着,兩份外賣都約定了電話取外賣的方式。但是,問題又來了。當第一份外賣送到時,配送員給你打了個長長的電話,商量發票的處理方式。與此同時,第二個配送員也到了,也想給你打電話。但是很明顯,因為電話占線(也就是關閉了中斷響應),第二個配送員的電話是打不通的。所以,第二個配送員很可能試幾次后就走掉了(也就是丟失了一次中斷)。

 

軟中斷

事實上,為了解決中斷處理程序執行過長和中斷丟失的問題,Linux將中斷處理過程分成了兩個階段,也就是上半部和下半部:

  • 上半部用來快速處理中斷,它在中斷禁止模式下運行,主要處理跟硬件緊密相關的或時間敏感的工作。
  • 下半部用來延遲處理上半部未完成的工作,通常以內核線程的方式運行。

舉個例子:比如說前面取外賣的例子,上半部就是你接聽電話,告訴配送員你已經知道了,其他事兒見面再說,然后電話就可以掛斷了;下半部才是取外賣的動作,以及見面后商量發票處理的動作。這樣,第一個配送員不會占用你太多時間,當第二個配送員過來時,照樣能正常打通你的電話。

這兩個階段可以這樣理解:

  • 上半部直接處理硬件請求,也就是常說的硬中斷,特點是快速執行;
  • 下半部則是由內核觸發,也就是常說的軟中斷,特點是延遲執行。

實際上,上半部會打斷CPU正在執行的任務,然后立即執行中斷處理程序。而下半部以內核線程的方式執行,並且每個 CPU 都對應一個軟中斷內核線程,名字為 “ksoftirqd/CPU編號”,比如說, 0 號CPU對應的軟中斷內核線程的名字就是 ksoftirqd/0。不過要注意的是,軟中斷不只包括了剛剛所講的硬件設備中斷處理程序的下半部,一些內核自定義的事件也屬於軟中斷,比如內核調度和RCU鎖(Read-Copy Update 的縮寫,RCU 是 Linux 內核中最常用的鎖之一)等。

 

查看軟中斷和內核線程

/proc/softirqs 提供了軟中斷的運行情況;
/proc/interrupts 提供了硬中斷的運行情況。

運行下面的命令,查看 /proc/softirqs 文件的內容,可以看到各種類型軟中斷在不同 CPU 上的累積運行次數:

1 cat /proc/softirqs

在查看 /proc/softirqs 文件內容時,要特別注意以下這兩點。
第一,要注意軟中斷的類型,軟中斷包括了10個類別,分別對應不同的工作類型。

  • HI:
  • TIMER:
  • NET_TX:
  • NET_RX:
  • BLOCK:
  • IRQ_POLL:
  • TASKLET:
  • SCHED:
  • HRTIMER:
  • RCU:

比如 NET_RX 表示網絡接收中斷,而 NET_TX 表示網絡發送中斷。

第二,要注意同一種軟中斷在不同 CPU 上的分布情況,也就是同一行的內容。正常情況下,同一種中斷在不同 CPU 上的累積次數應該差不多。

不過TASKLET 在不同CPU上的分布並不均勻。TASKLET 是最常用的軟中斷實現機制,每個 TASKLET 只運行一次就會結束 ,並且只在調用它的函數所在的 CPU 上運行。

因此,使用 TASKLET 特別簡便,當然也會存在一些問題,比如說由於只在一個CPU上運行導致的調度不均衡,再比如因為不能在多個 CPU 上並行運行帶來了性能限制。

另外,軟中斷實際上是以內核線程的方式運行的,每個 CPU 都對應一個軟中斷內核線程,這個軟中斷內核線程就叫做ksoftirqd/CPU編號。
使用 ps 命令就可以做到查看這些線程的運行狀況,比如執行下面的指令:

1 ps aux | grep softirq

Note:

這些線程的名字外面都有中括號,這說明 ps 無法獲取它們的命令行參數(cmline)。一般來說,ps 的輸出中,名字括在中括號里的,一般都是內核線程。

 

小結

Linux 中的中斷處理程序分為上半部和下半部:

  • 上半部對應硬件中斷,用來快速處理中斷。
  • 下半部對應軟中斷,用來異步處理上半部未完成的工作。

Linux 中的軟中斷包括網絡收發、定時、調度、RCU鎖等各種類型,可以通過查看 /proc/softirqs 來觀察軟中斷的運行情況。

在 Linux 中,每個 CPU 都對應一個軟中斷內核線程,名字是 ksoftirqd/CPU編號。當軟中斷事件的頻率過高時,內核線程也會因為CPU 使用率過高而導致軟中斷處理不及時,進而引發網絡收發延遲、調度緩慢等性能問題。

軟中斷 CPU 使用率過高也是一種最常見的性能問題。雖然軟中斷的類型很多,但實際生產中,遇到的性能瓶頸大多是網絡收發類型的軟中斷,特別是網絡接收的軟中斷。在碰到這類問題時,可以借用 sar、tcpdump 等工具,做進一步分析。

 

Reference

https://time.geekbang.org/column/article/71868

 


免責聲明!

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



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