Linux
計算特定工作負載的上下文切換次數的 3 種不同方法提供了 2 個不同的答案
我在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 的永恆等待。