日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

09 | 基础篇:怎么理解Linux软中断?

發布時間:2024/9/3 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 09 | 基础篇:怎么理解Linux软中断? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一期,我用一個不可中斷進程的案例,帶你學習了 iowait(也就是等待 I/O 的 CPU 使用率)升高時的分析方法。這里你要記住,進程的不可中斷狀態是系統的一種保護機制,可以保證硬件的交互過程不被意外打斷。所以,短時間的不可中斷狀態是很正常的。但是,當進程長時間都處于不可中斷狀態時,你就得當心了。這時,你可以使用 dstat、pidstat 等工具,確認是不是磁盤 I/O 的問題,進而排查相關的進程和磁盤設備。關于磁盤 I/O 的性能問題,你暫且不用專門去背,我會在后續的 I/O 部分詳細介紹,到時候理解了也就記住了。其實除了 iowait,軟中斷(softirq)CPU 使用率升高也是最常見的一種性能問題。接下來的兩節課,我們就來學習軟中斷的內容,我還會以最常見的反向代理服務器 Nginx 的案例,帶你分析這種情況。

從“取外賣”看中斷

說到中斷,我在前面關于“上下文切換”的文章,簡單說過中斷的含義,先來回顧一下。中斷是系統用來響應硬件設備請求的一種機制,它會打斷進程的正常調度和執行,然后調用內核中的中斷處理程序來響應設備的請求。你可能要問了,為什么要有中斷呢?我可以舉個生活中的例子,讓你感受一下中斷的魅力。比如說你訂了一份外賣,但是不確定外賣什么時候送到,也沒有別的方法了解外賣的進度,但是,配送員送外賣是不等人的,到了你這兒沒人取的話,就直接走人了。所以你只能苦苦等著,時不時去門口看看外賣送到沒,而不能干其他事情。不過呢,如果在訂外賣的時候,你就跟配送員約定好,讓他送到后給你打個電話,那你就不用苦苦等待了,就可以去忙別的事情,直到電話一響,接電話、取外賣就可以了。這里的“打電話”,其實就是一個中斷。沒接到電話的時候,你可以做其他的事情;只有接到了電話(也就是發生中斷),你才要進行另一個動作:取外賣。這個例子你就可以發現,中斷其實是一種異步的事件處理機制,可以提高系統的并發處理能力。由于中斷處理程序會打斷其他進程的運行,所以,為了減少對正常進程運行調度的影響,中斷處理程序就需要盡可能快地運行。如果中斷本身要做的事情不多,那么處理起來也不會有太大問題;但如果中斷要處理的事情很多,中斷服務程序就有可能要運行很長時間。特別是,中斷處理程序在響應中斷時,還會臨時關閉中斷。這就會導致上一次中斷處理完成之前,其他中斷都不能響應,也就是說中斷有可能會丟失。那么還是以取外賣為例。假如你訂了 2 份外賣,一份主食和一份飲料,并且是由 2 個不同的配送員來配送。這次你不用時時等待著,兩份外賣都約定了電話取外賣的方式。但是,問題又來了。當第一份外賣送到時,配送員給你打了個長長的電話,商量發票的處理方式。與此同時,第二個配送員也到了,也想給你打電話。但是很明顯,因為電話占線(也就是關閉了中斷響應),第二個配送員的電話是打不通的。所以,第二個配送員很可能試幾次后就走掉了(也就是丟失了一次中斷)。

軟中斷

如果你弄清楚了“取外賣”的模式,那對系統的中斷機制就很容易理解了。事實上,為了解決中斷處理程序執行過長和中斷丟失的問題,Linux 將中斷處理過程分成了兩個階段,也就是上半部和下半部:
  • 上半部用來快速處理中斷,它在中斷禁止模式下運行,主要處理跟硬件緊密相關的或時間敏感的工作。
  • 下半部用來延遲處理上半部未完成的工作,通常以內核線程的方式運行。
比如說前面取外賣的例子,上半部就是你接聽電話,告訴配送員你已經知道了,其他事兒見面再說,然后電話就可以掛斷了;下半部才是取外賣的動作,以及見面后商量發票處理的動作。這樣,第一個配送員不會占用你太多時間,當第二個配送員過來時,照樣能正常打通你的電話。除了取外賣,我再舉個最常見的網卡接收數據包的例子,讓你更好地理解。網卡接收到數據包后,會通過硬件中斷的方式,通知內核有新的數據到了。這時,內核就應該調用中斷處理程序來響應它。你可以自己先想一下,這種情況下的上半部和下半部分別負責什么工作呢?對上半部來說,既然是快速處理,其實就是要把網卡的數據讀到內存中,然后更新一下硬件寄存器的狀態(表示數據已經讀好了),最后再發送一個軟中斷信號,通知下半部做進一步的處理。而下半部被軟中斷信號喚醒后,需要從內存中找到網絡數據,再按照網絡協議棧,對數據進行逐層解析和處理,直到把它送給應用程序。所以,這兩個階段你也可以這樣理解:
  • 上半部直接處理硬件請求,也就是我們常說的硬中斷,特點是快速執行;
  • 而下半部則是由內核觸發,也就是我們常說的軟中斷,特點是延遲執行。
實際上,上半部會打斷 CPU 正在執行的任務,然后立即執行中斷處理程序。而下半部以內核線程的方式執行,并且每個 CPU 都對應一個軟中斷內核線程,名字為 “ksoftirqd/CPU 編號”,比如說, 0 號 CPU 對應的軟中斷內核線程的名字就是 ksoftirqd/0。不過要注意的是,軟中斷不只包括了剛剛所講的硬件設備中斷處理程序的下半部,一些內核自定義的事件也屬于軟中斷,比如內核調度和 RCU 鎖(Read-Copy Update 的縮寫,RCU 是 Linux 內核中最常用的鎖之一)等。那要怎么知道你的系統里有哪些軟中斷呢?

查看軟中斷和內核線程

不知道你還記不記得,前面提到過的 proc 文件系統。它是一種內核空間和用戶空間進行通信的機制,可以用來查看內核的數據結構,或者用來動態修改內核的配置。其中:
  • /proc/softirqs 提供了軟中斷的運行情況;
  • /proc/interrupts 提供了硬中斷的運行情況。
運行下面的命令,查看 /proc/softirqs 文件的內容,你就可以看到各種類型軟中斷在不同 CPU 上的累積運行次數:$ cat /proc/softirqsCPU0 CPU1HI: 0 0TIMER: 811613 1972736NET_TX: 49 7NET_RX: 1136736 1506885BLOCK: 0 0IRQ_POLL: 0 0TASKLET: 304787 3691SCHED: 689718 1897539HRTIMER: 0 0RCU: 1330771 1354737在查看 /proc/softirqs 文件內容時,你要特別注意以下這兩點。
  • 第一,要注意軟中斷的類型,也就是這個界面中第一列的內容。從第一列你可以看到,軟中斷包括了 10 個類別,分別對應不同的工作類型。比如 NET_RX 表示網絡接收中斷,而 NET_TX 表示網絡發送中斷。
  • 第二,要注意同一種軟中斷在不同 CPU 上的分布情況,也就是同一行的內容。正常情況下,同一種中斷在不同 CPU 上的累積次數應該差不多。比如這個界面中,NET_RX 在 CPU0 和 CPU1 上的中斷次數基本是同一個數量級,相差不大。
不過你可能發現,TASKLET 在不同 CPU 上的分布并不均勻。TASKLET 是最常用的軟中斷實現機制,每個 TASKLET 只運行一次就會結束 ,并且只在調用它的函數所在的 CPU 上運行。因此,使用 TASKLET 特別簡便,當然也會存在一些問題,比如說由于只在一個 CPU 上運行導致的調度不均衡,再比如因為不能在多個 CPU 上并行運行帶來了性能限制。另外,剛剛提到過,軟中斷實際上是以內核線程的方式運行的,每個 CPU 都對應一個軟中斷內核線程,這個軟中斷內核線程就叫做 ksoftirqd/CPU 編號。那要怎么查看這些線程的運行狀況呢?其實用 ps 命令就可以做到,比如執行下面的指令:$ ps aux | grep softirq root 7 0.0 0.0 0 0 ? S Oct10 0:01 [ksoftirqd/0] root 16 0.0 0.0 0 0 ? S Oct10 0:01 [ksoftirqd/1]注意,這些線程的名字外面都有中括號,這說明 ps 無法獲取它們的命令行參數(cmline)。一般來說,ps 的輸出中,名字括在中括號里的,一般都是內核線程。

小結

Linux 中的中斷處理程序分為上半部和下半部:
  • 上半部對應硬件中斷,用來快速處理中斷。
  • 下半部對應軟中斷,用來異步處理上半部未完成的工作。
Linux 中的軟中斷包括網絡收發、定時、調度、RCU 鎖等各種類型,可以通過查看 /proc/softirqs 來觀察軟中斷的運行情況。

思考

最后,我想請你一起聊聊,你是怎么理解軟中斷的?你有沒有碰到過因為軟中斷出現的性能問題?你又是怎么分析它們的瓶頸的呢?你可以結合今天的內容,總結自己的思路,寫下自己的問題。歡迎在留言區和我討論,也歡迎把這篇文章分享給你的同事、朋友。我們一起在實戰中演練,在交流中進步。
主題:軟中斷中斷:系統用來響應硬件設備請求的一種機制,會打斷進程的正常調度和執行,通過調用內核中的中斷處理程序來響應設備的請求。1.中斷是一種異步的事件處理機制,能提高系統的并發處理能力2.為了減少對正常進程運行進行影響,中斷處理程序需要盡快運行。3.中斷分為上下兩個部分(1)上部分用來快速處理中斷,在中斷禁止模式下,主要處理跟硬件緊密相關的或時間敏感的工作(2)下部分用來延遲處理上半部分未完成的工作,通常以內核線程的方式運行。小結:上半部分直接處理硬件請求,即硬中斷,特點是快速執行下部分由內核觸發,即軟中斷,特點是延遲執行軟中斷除了上面的下部分,還包括一些內核自定義的事件,如:內核調度 RCU鎖 網絡收發 定時等軟中斷內核線程的名字:ksoftirq/cpu編號4.proc文件系統是一種內核空間和用戶空間進行通信的機制,可以同時用來查看內核的數據結構又能用了動態修改內核的配置,如:/proc/softirqs 提供軟中斷的運行情況/proc/interrupts 提供硬中斷的運行情況

總結

以上是生活随笔為你收集整理的09 | 基础篇:怎么理解Linux软中断?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。