cpu上下文切換(下)

cpu上下文切換如何查看

上一篇介紹了cpu上下文切換幾種場景以及數據保存恢復過程,這篇文章介紹如何查看cpu上下文切換

一、vmstat

安裝:yum install -y sysstat

vmstat是一個常用的系統性能分析工具,主要用來分析系統的內存情況,也常用來分析cpu上下文切換和中斷的次數。

# vmstat <br/>procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----<br/>r b swpd free buff cache si so bi bo in cs us sy id wa st<br/>1 0 0 1030608 972 119296 0 0 52 15 0 1 4 0 95 0 0

  • cs(context switch)是每秒上下文切換的次數。

  • in(interrupt)是每秒中斷的次數。

  • r(Running or Runnable)是就緒隊列的長度,也就是等待和運行cpu的進程數。

  • b(Blocked)是處於不可中斷睡眠狀態的進程數。

    vmstat只是給出了系統總體的上下切換情況,想查看每個進程的詳細情況,就需要使用pidstat。加-w選項。

二、pidstat

pidstat -w 5

Linux 3.10.0-514.26.2.el7.x86_64 (nodejs-test) 06/09/2019 _x86_64_ (2 CPU)

10:53:49 AM UID PID cswch/s nvcswch/s Command
10:53:54 AM 0 9 21.56 0.00 rcu_sched
10:53:54 AM 0 10 0.40 0.00 watchdog/0
10:53:54 AM 0 11 0.40 0.00 watchdog/1
10:53:54 AM 0 12 0.40 0.00 migration/1
10:53:54 AM 0 13 0.40 0.00 ksoftirqd/1

  • cswch:每秒自願上下文切換的次數。

  • nvcswch:每秒非自願上下文切換的次數。

  • 自願上下文切換,是指進程無法獲取所需資源,導致上下文切換,如:I/O、內存等資源不足時。

  • 非自願上下文切換,是指進程由於時間片已到等原因,被系統強制調度,進而發生上下文切換。如:大量進程爭搶cpu。

    案例

    操作

    打開三個終端

    1. 創造事故

      以 10 個線程運行 5 分鐘的基準測試,模擬多線程切換的問題

      $ sysbench --threads=10 --max-time=300 threads run

    2. 打開第二個中斷查看

      每隔 1 秒輸出 1 組數據(需要 Ctrl+C 才結束)

      $ vmstat 1
      procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
      r b swpd free buff cache si so bi bo in cs us sy id wa st
      6 0 0 6487428 118240 1292772 0 0 0 0 9019 1398830 16 84 0 0 0
      8 0 0 6487428 118240 1292772 0 0 0 0 10191 1392312 16 84 0 0 0

    • cs列的上下文切換次數升到了139萬。
    • r列:就緒隊列到達了8。超過了cpu的個數。此時肯定有大量cpu競爭。
    • us和sy列加起來100%。sy列高達84%,說明cpu主要是被內核佔用了。
    • in列:中斷次數上升到1萬左右,說明中斷處理也是問題。
    1. pidstat

      利用pidstat查看進程上下文切換詳細情況;

      #每隔 1 秒輸出 1 組數據(需要 Ctrl+C 才結束)

      -w 參數表示輸出進程切換指標,而 -u 參數則表示輸出 CPU 使用指標

      $ pidstat -w -u 1
      08:06:33 UID PID %usr %system %guest %wait %CPU CPU Command
      08:06:34 0 10488 30.00 100.00 0.00 0.00 100.00 0 sysbench
      08:06:34 0 26326 0.00 1.00 0.00 0.00 1.00 0 kworker/u4:2

      08:06:33 UID PID cswch/s nvcswch/s Command
      08:06:34 0 8 11.00 0.00 rcu_sched
      08:06:34 0 16 1.00 0.00 ksoftirqd/1
      08:06:34 0 471 1.00 0.00 hv_balloon
      08:06:34 0 1230 1.00 0.00 iscsid
      08:06:34 0 4089 1.00 0.00 kworker/1:5
      08:06:34 0 4333 1.00 0.00 kworker/0:3
      08:06:34 0 10499 1.00 224.00 pidstat
      08:06:34 0 26326 236.00 0.00 kworker/u4:2
      08:06:34 1000 26784 223.00 0.00 sshd

    ​ 從上面輸出看出,sysbench進程佔用cpu100%,自願上下文切換頻率高的內核線程爲sshd和 kwordker。但是,加起來也就是幾百,沒有達到139萬。

    1. pidstat -t參數

      #每隔 1 秒輸出一組數據(需要 Ctrl+C 才結束)

      #-wt 參數表示輸出線程的上下文切換指標

      $ pidstat -wt 1
      08:14:05 UID TGID TID cswch/s nvcswch/s Command
      ...
      08:14:05 0 10551 - 6.00 0.00 sysbench
      08:14:05 0 - 10551 6.00 0.00 |__sysbench<br/>08:14:05 0 - 10552 18911.00 103740.00 |__sysbench
      08:14:05 0 - 10553 18915.00 100955.00 |__sysbench<br/>08:14:05 0 - 10554 18827.00 103954.00 |__sysbench
      ...

      此時看出,sysbench主進程上下文切換次數不多,但是子線程卻很多。

      前面我們看見,不止上下文切換頻率升高,還有中斷次數。

      一旦CPU接收了中斷請求,CPU就會暫時停止執行正在運行的程序,並且調用一個稱爲中斷處理器或中斷服務程序(interrupt service routine)的特定程序。

      查看文件接口

      #cat /proc/interrupts

      CPU0 CPU1
      25: 10652623 80703151 PCI-MSI-edge virtio3-req.0
      26: 0 0 PCI-MSI-edge virtio2-config
      27: 2 0 PCI-MSI-edge virtio2-virtqueues
      28: 0 0 PCI-MSI-edge virtio0-config
      29: 599781 28812335 PCI-MSI-edge virtio0-input.0
      30: 2 506 PCI-MSI-edge virtio0-output.0
      31: 0 0 PCI-MSI-edge virtio1-config
      32: 6893540 111078549 PCI-MSI-edge virtio1-input.0
      33: 615 1368 PCI-MSI-edge virtio1-output.0
      NMI: 0 0 Non-maskable interrupts
      LOC: 3818014562 3882568092 Local timer interrupts
      SPU: 0 0 Spurious interrupts
      PMI: 0 0 Performance monitoring interrupts
      IWI: 92938221 96288600 IRQ work interrupts
      RTR: 0 0 APIC ICR read retries
      RES: 316386309 327268304 Rescheduling interrupts
      CAL: 71367577 3699711 Function call interrupts
      TLB: 21377263 20572311 TLB shootdowns
      TRM: 0 0 Thermal event interrupts
      THR: 0 0 Threshold APIC interrupts

      中的RES: 316386309 327268304 Rescheduling interrupts

    總結

    • 自願上下文切換變多了,說明進程都在等待資源,有可能發生了IO等其他問題
    • 非自願上下文切換變多了,說明進程在被強制調度,也就是在爭搶cpu,說明cpu的確成了瓶頸
    • 中斷次數變多了,說明cpu被中斷處理程序佔用,需要查看/proc/interrupts 接口文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章