性能測試必備知識(9)- 深入理解“軟中斷”


做性能測試的必備知識系列,可以看下面鏈接的文章哦

https://www.cnblogs.com/poloyy/category/1806772.html

 

前言

  • 軟中斷(softirq)導致 CPU 使用率升高也是最常見的一種性能問題
  • 所以軟中斷這個硬骨頭必須啃下去!

 

回憶下什么是中斷

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

 

場景類比,加深印象

比如說你訂了一份外賣,但是不確定外賣什么時候送到,也沒有別的方法了解外賣的進度, 但是,配送員送外賣是不等人的,到了你這兒沒人取的話,就直接走人了;所以你只能苦苦等着,時不時去門口看看外賣送到沒,而不能干其他事情;不過呢,如果在訂外賣的時候,你就跟配送員約定好,讓他送到后給你打個電話,那你就不用苦苦等待了,就可以去忙別的事情,直到電話一響,接電話、取外賣就可以了、

  • 打電話:其實就是一個中斷,沒接到電話的時候,你可以做其他的事情
  • 只有接到了電話(也就是發生中斷),你才要進行另一個動作:取外賣

 

中斷的優勢

一種異步的事件處理機制,可以提高系統的並發處理能力

 

中斷運行時間短

  • 由於中斷處理程序會打斷其他進程的運行,為了減少對正常進程運行調度的影響,中斷處理程序就需要盡可能快地運行
  • 如果中斷要處理的事情很多,中斷服務程序就有可能要運行很長時間

 

中斷處理程序在響應中斷

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

 

響應中斷場景類比

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

 

軟中斷

中斷處理過程分割

  • 為了解決中斷處理程序執行過長和中斷丟失的問題,Linux 會將中斷處理過程分成兩個階段,也就是上半部和下半部
  • 上半部:快速處理中斷,它在中斷禁止模式下運行,主要處理跟硬件緊密相關的或時間敏感的工作
  • 下半部:延遲處理上半部未完成的工作,通常以內核線程的方式運行

 

承上啟下

  • 上面說到的響應中斷場景
  • 上半部就是你接聽電話,告訴配送員你已經知道了,其他事兒見面再說,然后電話就可以掛斷了
  • 下半部才是取外賣的動作,以及見面后商量發票處理的動 作。

 

網卡接收數據包的栗子

網卡接收到數據包后,會通過硬件中斷的方式,通知內核有新的數據到了。這時,內核就應該調用中斷處理程序來響應它

 

上半部

  1. 快速處理
  2. 首先,要把網卡的數據讀到內存中
  3. 然后,更新一下硬件寄存器的狀態(表示數據已經讀好了)
  4. 最后,再發送一個軟中斷信號通知下半部做進一步的處理

 

下半部

  1. 被軟中斷信號喚醒
  2. 需要從內存中找到網絡數據,再按照網絡協議棧,對數據進行逐層解析和處理,直到把它送給應用程序

 

總結

上半部

  • 直接處理硬件請求,也就是硬中斷
  • 特點:快速執行
  • 會打斷 CPU 正在執行的任務,然后立即執行中斷處理程序

 

下半部

  • 內核觸發,也就是軟中斷
  • 特點:延遲執行
  • 以內核線程的方式執行,並且每個 CPU 都對應一個軟中斷內核線程,名字為 “ksoftirqd/CPU 編號”,比如說, 0 號 CPU 對應的軟中斷內核線程的名字就是 ksoftirqd/0
  • 不只包括了硬件設備中斷處理程序的下半部,一些內核自定義的事件也屬於軟中斷,網絡收發、定時、調度、RCU 鎖等各種類型
  • 內核調度和 RCU 鎖(Read-Copy Update), RCU 是 Linux 內核中最常用的鎖之一

 

查看軟中斷和內核線程

proc 文件系統

它是一種內核空間和用戶空間進行通信的機制,可以用來查看內核的數據結構,或者用來動態修改內核的配置

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

 

查看軟中斷文件內容

$ cat /proc/softirqs
CPU0 CPU1
HI: 0 0
TIMER: 811613 1972736
NET_TX: 49 7
NET_RX: 1136736 1506885
BLOCK: 0 0
IRQ_POLL: 0 0
TASKLET: 304787 3691
SCHED: 689718 1897539
HRTIMER: 0 0
RCU: 1330771 1354737

 

注意軟中斷的類型

  • 從第一列可以看出,軟中斷包括了 10 個類別
  • 比如:NET_RX 表示網絡接收中斷,而 NET_TX 表示網絡發送中斷

 

注意同一種軟中斷在不同 CPU 上的分布情況

  • 也就是同一行的內容
  • 正常情況 下,同一種中斷在不同 CPU 上的累積次數應該差不多
  • 比如:上面的,NET_RX 在 CPU0 和 CPU1 上的中斷次數基本是同一個數量級,相差不大

 

TASKLET

  • TASKLET 在不同 CPU 上的分布並不均勻
  • TASKLET 是最常用的軟中斷實現機制,每個 TASKLET 只運行一次就會結束 ,並且只在調用它的函數所在的 CPU 上運行
  • 存在的問題: 由於只在一個 CPU 上運行導致的調度不均衡,再比如因為不能在多個 CPU 上並行運行帶來了性能限制

 

查看軟中斷線程

ps aux | grep softirq

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

 


免責聲明!

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



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