Linux

計算特定工作負載的上下文切換次數的 3 種不同方法提供了 2 個不同的答案

  • November 11, 2019

我在Google云機器上有一個 Centos7 系統,執行一個多執行緒數據庫伺服器,它在 70 秒(正負 1 秒)內執行一組特定的查詢。我想知道伺服器在執行此工作負載時進行了多少次上下文切換。

伺服器 pid 為 11850。

我使用了 3 種不同的計數方法:

方法一:

開始

perf -e context-switches -p 11850

在一個視窗中並立即在另一個視窗中執行數據庫客戶端。然後在客戶端完成後立即終止 perf。

結果輸出是

Performance counter stats for process id '11850':

    5,831,206      context-switches          #    0.004 M/sec

   70.607962486 seconds time elapsed

方法二

開始

pidstat -tw -p 11850 70 1 >pidstat.out

在一個視窗中並立即在另一個視窗中執行客戶端。

pidstat 和客戶端都將在一秒鐘內完成。發生這種情況時,將 cswch/s 和 nvcswch/s 的所有值添加到 pidstat.out 中,並將結果乘以 70。

這給出了與方法 1 幾乎相同的結果。

方法三

在一個視窗中執行包含以下命令的腳本

vmstat -s|grep "CPU context switches" 
sleep 70
vmstat -s|grep "CPU context switches" 

然後立即在另一個視窗中執行客戶端。客戶端和第二個 vmstat 都將在一秒鐘內完成。

vmstat 輸出為

   439394923 CPU context switches
   450457926 CPU context switches

從第二個數字中減去第一個數字得到 11,063,003,這幾乎是其他兩種方法結果的兩倍。

由於系統上沒有執行其他任何東西,並且空閒系統上上下文切換的正常速率約為 100/秒,因此 vmstat 方法似乎是重複計算上下文切換。

這是一個錯誤,還是我錯過了什麼?

只有被檢查的 PID 進行上下文切換的假設需要檢查。

查看跨所有 CPU 的上下文切換,例如使用perf top -e context-switches -a. 可能您會看到其他任務,包括其他數據庫執行緒和核心事物,在 CPU 上跳來跳去。

比上下文切換計數器更有用的是統計資訊,例如每週期指令。得到那些帶有perf stat. 好的 IPC 大於 1。當然,對於 CPU 密集型工作負載。緩慢的儲存意味著 CPU 的永恆等待。

引用自:https://serverfault.com/questions/991416