排程器統計

schedstats 第 17 版移除了“lb_imbalance”欄位,因為它不再有意義,而是添加了更相關的欄位,即“lb_imbalance_load”、“lb_imbalance_util”、“lb_imbalance_task”和“lb_imbalance_misfit”。從該版本開始,domain 欄位會列印相應排程域的名稱。

schedstats 第 16 版更改了“enum cpu_idle_type”中定義的順序,這改變了 show_schedstat() 中 [CPU_MAX_IDLE_TYPES] 列的順序。特別是 CPU_IDLE 和 __CPU_NOT_IDLE 的位置發生了變化。陣列的大小不變。

schedstats 第 15 版去掉了 sched_yield 的一些計數器:yld_exp_empty、yld_act_empty 和 yld_both_empty。除此之外,它與第 14 版相同。詳細資訊可在以下網址獲取:

schedstats 第 14 版包含了對 sched_domains 的支援,該支援在 2.6.20 版進入主線核心,儘管它與 2.6.13-2.6.19 核心中的第 12 版統計資料相同(第 13 版從未釋出核心版本)。一些計數器更適合按執行佇列(per-runqueue)統計;另一些則適合按域(per-domain)統計。請注意,域(及其相關資訊)僅在使用了 CONFIG_SMP 的機器上才相關並可用。

在 schedstat 第 14 版中,每個列出的 CPU 至少有一個域統計級別,並且很可能不止一個域。在當前實現中,域沒有特定的名稱,但編號最高的域通常協調機器上所有 CPU 的平衡,而 domain0 是最集中關注的域,有時僅在 CPU 對之間進行平衡。目前,沒有架構需要超過三個域級別。域統計中的第一個欄位是一個位掩碼,指示哪些 CPU 受該域影響。詳細資訊可在以下網址獲取:

schedstat 文件從第 10 版開始維護,未針對第 11 和 12 版進行更新。第 10 版的詳細資訊可在以下網址獲取:

這些欄位是計數器,只會遞增。使用這些欄位的程式需要從一個基準觀察開始,然後計算每次後續觀察中計數器的變化。一個針對其中許多欄位執行此操作的 Perl 指令碼可在以下網址獲取:

請注意,任何此類指令碼都必然是特定於版本的,因為更改版本的主要原因是輸出格式的變化。對於希望編寫自己指令碼的人,此處描述了這些欄位。

CPU 統計資訊

cpu<N> 1 2 3 4 5 6 7 8 9

第一個欄位是 sched_yield() 統計資訊

  1. sched_yield() 被呼叫的次數

接下來的三個是 schedule() 統計資訊

  1. 此欄位是 O(1) 排程器中使用的傳統陣列過期計數字段。我們保留它是為了 ABI 相容性,但它總是設定為零。

  2. schedule() 被呼叫的次數

  3. schedule() 使處理器空閒的次數

接下來的兩個是 try_to_wake_up() 統計資訊

  1. try_to_wake_up() 被呼叫的次數

  2. try_to_wake_up() 被呼叫以喚醒本地 CPU 的次數

接下來的三個是描述排程延遲的統計資訊

  1. 此處理器上任務執行的總時間(納秒)

  2. 此處理器上任務等待執行的總時間(納秒)

  3. 此 CPU 上執行的時間片數量

域統計資訊

為每個描述的 CPU 的每個域生成一個。 (請注意,如果未定義 CONFIG_SMP,則不使用任何域,並且這些行不會出現在輸出中。<name> 是 domain 欄位的一個擴充套件,它列印相應排程域的名稱。它可以在 schedstat 17 及更高版本中出現。

domain<N> <name> <cpumask> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

第一個欄位是一個位掩碼,指示此域操作的 CPU。

接下來的 33 個是 sched_balance_rq() 的各種統計資訊,按空閒型別(忙碌、空閒和剛空閒)分組

  1. 在此域中,當 CPU 忙碌時 sched_balance_rq() 被呼叫的次數

  2. 在此域中,當 CPU 忙碌時 sched_balance_rq() 檢查但發現負載不需要平衡的次數

  3. 在此域中,當 CPU 忙碌時 sched_balance_rq() 嘗試移動一個或多個任務但失敗的次數

  4. 當 CPU 忙碌時負載的總不平衡量

  5. 當 CPU 忙碌時利用率的總不平衡量

  6. 當 CPU 忙碌時任務數量的總不平衡量

  7. 當 CPU 忙碌時由於不適合的任務造成的總不平衡量

  8. 在此域中,當 CPU 忙碌時 pull_task() 被呼叫的次數

  9. 在此域中,當 CPU 忙碌時,即使目標任務是快取熱點,pull_task() 仍被呼叫的次數

  10. 在此域中,當 CPU 忙碌時 sched_balance_rq() 被呼叫但未找到更忙佇列的次數

  11. 在此域中,當 CPU 忙碌時找到了更忙佇列但未找到更忙組的次數

  12. 在此域中,當 CPU 空閒時 sched_balance_rq() 被呼叫的次數

  13. 在此域中,當 CPU 空閒時 sched_balance_rq() 檢查但發現負載不需要平衡的次數

  14. 在此域中,當 CPU 空閒時 sched_balance_rq() 嘗試移動一個或多個任務但失敗的次數

  15. 當 CPU 空閒時負載的總不平衡量

  16. 當 CPU 空閒時利用率的總不平衡量

  17. 當 CPU 空閒時任務數量的總不平衡量

  18. 當 CPU 空閒時由於不適合的任務造成的總不平衡量

  19. 在此域中,當 CPU 空閒時 pull_task() 被呼叫的次數

  20. 在此域中,當 CPU 空閒時,即使目標任務是快取熱點,pull_task() 仍被呼叫的次數

  21. 在此域中,當 CPU 空閒時 sched_balance_rq() 被呼叫但未找到更忙佇列的次數

  22. 在此域中,當 CPU 空閒時找到了更忙佇列但未找到更忙組的次數

  23. 在此域中,當 CPU 剛變為空閒時 sched_balance_rq() 被呼叫的次數

  24. 在此域中,當 CPU 剛變為空閒時 sched_balance_rq() 檢查但發現負載不需要平衡的次數

  25. 在此域中,當 CPU 剛變為空閒時 sched_balance_rq() 嘗試移動一個或多個任務但失敗的次數

  26. 當 CPU 剛變為空閒時負載的總不平衡量

  27. 當 CPU 剛變為空閒時利用率的總不平衡量

  28. 當 CPU 剛變為空閒時任務數量的總不平衡量

  29. 當 CPU 剛變為空閒時由於不適合的任務造成的總不平衡量

  30. 在此域中,當剛變為空閒時 pull_task() 被呼叫的次數

  31. 在此域中,當剛變為空閒時,即使目標任務是快取熱點,pull_task() 仍被呼叫的次數

  32. 在此域中,當 CPU 剛變為空閒時 sched_balance_rq() 被呼叫但未找到更忙佇列的次數

  33. 在此域中,當 CPU 剛變為空閒時找到了更忙佇列但未找到更忙組的次數

接下來的三個是 active_load_balance() 統計資訊

  1. active_load_balance() 被呼叫的次數

  2. active_load_balance() 嘗試移動任務但失敗的次數

  3. active_load_balance() 成功移動任務的次數

接下來的三個是 sched_balance_exec() 統計資訊

  1. sbe_cnt 未使用

  2. sbe_balanced 未使用

  3. sbe_pushed 未使用

接下來的三個是 sched_balance_fork() 統計資訊

  1. sbf_cnt 未使用

  2. sbf_balanced 未使用

  3. sbf_pushed 未使用

接下來的三個是 try_to_wake_up() 統計資訊

  1. 在此域中,try_to_wake_up() 喚醒了上次在此域中不同 CPU 上執行的任務的次數

  2. 在此域中,try_to_wake_up() 將任務移動到喚醒 CPU 的次數,因為該任務在其自己的 CPU 上無論如何都是快取冷點

  3. 在此域中,try_to_wake_up() 啟動被動平衡的次數

/proc/<pid>/schedstat

schedstats 還添加了一個新的 /proc/<pid>/schedstat 檔案,以包含一些相同的程序級別資訊。此檔案中包含三個欄位,對應於該程序的:

  1. 在 CPU 上花費的時間(納秒)

  2. 在執行佇列中等待的時間(納秒)

  3. 此 CPU 上執行的時間片數量

可以很容易地編寫一個程式來利用這些額外欄位,以報告特定程序或程序集在排程器策略下的表現。此類程式的一個簡單版本可在以下網址獲取: