系統性能故障分析-中斷

中斷是一種異步事件處理機制,能夠提升系統的併發處理能力。中斷處理程序會打斷其餘進程的運行,因此爲了減小對正常進程調度的影響,中斷處理程序須要儘快的運行。若是中斷自己要作的事很少,那麼處理起來影響不大,若中斷處理的事情較多,中斷處理程序就可能須要運行較長時間。特別要注意的是,當中斷處理程序在響應中斷時,還會臨時關閉中斷。這就會致使前一箇中斷處理完畢以前,其餘中斷都不會響應,也就是中斷可能會丟失。所以爲了解決中斷處理程序執行多長和中斷丟失的問題,Linux將中斷分爲兩個階段:上半部下半部網絡

上半部用來快速處理中斷,他在中斷禁止模式下運行,主要處理跟硬件緊密相關或時間敏感的工做併發

下半部用來延遲處理上半部爲完成的工做,一般之內核線程的方式運行異步

舉個網卡接受數據包的例子:當網卡接受到數據包後,會經過硬件中斷的方式,告訴內核有新的數據到了,這時內核就應該調用中斷處理程序來響應,那上半部和下半部分別負責哪些工做?ide

對上半部來講,既然是快速處理,其實就是把網卡的數據讀到內存中,而後更新一下硬件寄存器的狀態(表示數據已讀完),最後再發一個軟中斷的信號,通知下半部作進一步的處理;函數

下半部被軟中斷信號喚醒後,須要從內存中找到網絡數據,在按照網絡協議棧,對數據進行逐層解析和處理,直到把它送給應用程序。性能

這兩個階段能夠這樣理解:spa

上半部直接處理硬件請求,也就是咱們常說的硬中斷,特色是快速執行;命令行

下半部則是由內核觸發,也就是咱們常說的軟中斷,特色是延遲執行線程

實際上上半部會打斷CPU正在執行的任務,而後當即處理中斷處理程序。而下半部之內核線程的方式執行,而且每一個CPU對應一個軟中斷內核線程,名字爲ksoftirqd/CPU編號,好比說,1CPU對應的軟中斷內核線程爲ksoftirqd/1進程

查看方法:

andy:~ # ps aux|grep softirq

root          3  0.0  0.0      0     0 ?        S    06:42   0:00 [ksoftirqd/0]

root         13  0.0  0.0      0     0 ?        S    06:42   0:00 [ksoftirqd/1]

root         18  0.0  0.0      0     0 ?        S    06:42   0:00 [ksoftirqd/2]

root         23  0.0  0.0      0     0 ?        S    06:42   0:00 [ksoftirqd/3]

root       2659  0.0  0.0   9288  1620 pts/0    S+   07:06   0:00 grep --color=auto softirq

注意:這些線程的名字外面都有中括號,這說明 ps 沒法獲取它們的命令行參數(cmline)。通常來講,ps 的輸出中,名字括在中括號裏的,通常都是內核線程。

查看軟中斷及內核線程

/proc/softirqs   提供了軟中斷的運行狀況

/proc/interrupts 提供了硬中斷的運行狀況

$ cat /proc/softirqs  #提供了軟中斷的運行狀況:類型 + 中斷次數

       CPU0    CPU1

HI:       2       0

TIMER:  13086  12592

NET_TX:  2      29

NET_RX: 1610   1803

BLOCK:  8584   7866

IRQ_POLL:  0     0

TASKLET:   24    59

SCHED:  10279  10218

HRTIMER:  0     0

RCU:    14262   13818

查看出現128個核數據的處理方法

watch -d "/bin/cat /proc/softirqs | /usr/bin/awk 'NR == 1{printf \"%10s %7s %7s %7s %7s\n\",\" \",\$1,\$2,\$3,\$4}; NR > 1{printf \"%10s %7s %7s %7s %7s\n\",\$1,\$2,\$3,\$4,\$5}'"

Every 2.0s: /bin/cat /proc/softirqs | /usr/bin/awk 'NR == 1{printf "%10s %7s %7s %7s...  andy: Thu May 28 22:08:58 2020

 

              CPU0    CPU1    CPU2    CPU3

       HI:       0       0       1       0

    TIMER:   28917   27206   36138   32919

   NET_TX:     530     554       2       2

   NET_RX:     162    5801      61   11956

    BLOCK:    2692   14024    7291    5065

 IRQ_POLL:       0       0       0       0

  TASKLET:      31       0      20      41

    SCHED:   27556   23561   33093   29967

  HRTIMER:       0       0       0       0

      RCU:   37494   34880   36088   3520

要特別注意如下幾點:
第1、要注意軟中斷的類型,軟中斷包括了10個類別,分別對應不一樣的工做類型,好比 NET_RX 表示網絡接收中斷,而 NET_TX 表示網絡發送中斷

第2、要注意同一種軟中斷在不一樣 CPU 上的分佈狀況,也就是同一行的內容。正常狀況下,同一種中斷在不一樣 CPU 上的累積次數應該差很少.好比NET_RXCPU0CPU1上的中斷次數應該在同一個數量級。

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

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

使用sar命令並添加 -n DEV參數顯示網絡收發的報告

root@andy:~# sar -n DEV 1 2

Linux 4.18.0-12-generic (andy)  05/28/20        _x86_64_        (4 CPU)

 

22:12:58        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil

22:12:59        ens39      1.00      0.00      0.09      0.00      0.00      0.00      0.00      0.00

22:12:59        ens38      1.00      0.00      0.09      0.00      0.00      0.00      0.00      0.00

22:12:59           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

 

22:12:59        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil

22:13:00        ens39      1.00      0.00      0.09      0.00      0.00      0.00      0.00      0.00

22:13:00        ens38      2.00      1.00      0.15      0.85      0.00      0.00      0.00      0.00

22:13:00           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

 

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil

Average:        ens39      1.00      0.00      0.09      0.00      0.00      0.00      0.00      0.00

Average:        ens38      1.50      0.50      0.12      0.42      0.00      0.00      0.00      0.00

Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

從左向右分別爲:

第一列:表示報告的時間

第二列:IFACE表示網卡

第3、四列:rxpck/s txpck/s分別表示每秒接受、發送的網絡數據幀,也就是PPS

第5、六列:rxkB/s txkB/s分別表示每秒接受、發送的千字節數,也就是BPS

相關文章
相關標籤/搜索