Perf Sched 研究

最近一直在弄 TiKV 的性能優(yōu)化,想到是否系統(tǒng)的 scheduler 會影響 TiKV 的性能,于是就稍微研究了下 perf sched。

首先抓取一段時間的記錄,使用

sudo perf sched record -- sleep 5

這里需要注意,sched 會記錄非常多的信息,所以時間不能很長,我上面就是記錄了 5 秒,大概生成了快 400 MB 的數(shù)據(jù)。

然后使用 latency 命令來看最大的 delay:

sudo perf sched latency -s max

-----------------------------------------------------------------------------------------------------------------
  Task                  |   Runtime ms  | Switches | Average delay ms | Maximum delay ms | Maximum delay at       |
 -----------------------------------------------------------------------------------------------------------------
  grpc-poll-2:(3)       |  10162.378 ms |    83270 | avg:    0.019 ms | max:    2.346 ms | max at: 2600393.062326 s
  grpc-poll-1:(3)       |  11509.903 ms |    68917 | avg:    0.018 ms | max:    2.208 ms | max at: 2600394.231449 s
  grpc-poll-0:(3)       |  12253.333 ms |    53227 | avg:    0.020 ms | max:    2.024 ms | max at: 2600391.721447 s

可以看到,我們最大的 delay 是 gRPC 線程的 2.346 ms,在 2600393.062326 s 這個時間點,可以通過 script 命令詳細(xì)的找到相應(yīng)的地方。下面只是一個簡單的 script 例子:

sudo perf sched script

     raftstore-5 91697 [017] 2587136.922586:       sched:sched_wakeup: apply_worker_2:91706 [120] success=1 CPU:019
     raftstore-5 91697 [017] 2587136.922586:       sched:sched_wakeup: apply_worker_2:91706 [120] success=1 CPU:019
          :91649 91649 [008] 2587136.922610:       sched:sched_wakeup: grpc-poll-0:91709 [120] success=1 CPU:006
          :91649 91649 [008] 2587136.922670:       sched:sched_wakeup: grpc-poll-0:91709 [120] success=1 CPU:006
     raftstore-5 91697 [017] 2587136.922705:       sched:sched_wakeup: apply_worker_1:91705 [120] success=1 CPU:031

我們也可以通過 map 命令詳細(xì)的知道每個 CPU 任務(wù)的運行狀態(tài)以及切換情況:

sudo perf sched map 

B0  U0  Y0  A0      .   B1      S0      J0      Q0  .   E0      C0      A1  .   Z0  .       .   W0 *C1  M0  G0  L0  R0  N0           2600390.841419 secs C1 => raftstore-5:91697
B0  U0 *.   A0      .   B1      S0      J0      Q0  .   E0      C0      A1  .   Z0  .       .   W0  C1  M0  G0  L0  R0  N0           2600390.841423 secs
B0  U0  .   A0      .   B1      S0      J0      Q0  .   E0     *.       A1  .   Z0  .       .   W0  C1  M0  G0  L0  R0  N0           2600390.841432 secs
B0  U0  .   A0      .   B1      S0      J0      Q0  .   E0      .       A1  .   Z0  .       .   W0  C1  M0 *.   L0  R0  N0           2600390.841436 secs
B0  U0  .   A0      .   B1      S0      J0      Q0  .   E0      .       A1  .   Z0 *K0      .   W0  C1  M0  .   L0  R0  N0           2600390.841437 secs
B0  U0  .  *.       .   B1      S0      J0      Q0  .   E0      .       A1  .   Z0  K0      .   W0  C1  M0  .   L0  R0  N0           2600390.841438 secs

上面每一行表示的是當(dāng)前時間點所有 CPU 執(zhí)行任務(wù)的情況, A0,C1 表示的是執(zhí)行的任務(wù),而 . 則是表明空閑,*C1 這個表明發(fā)生了切換,切到了任務(wù) C1 上面。上面可以發(fā)現(xiàn)幾乎所有 CPU 都在處理任務(wù)。

因為我們并沒有安裝最新的內(nèi)核,所以并沒有 perf sched 的 timehist 命令,也就沒法嘗試了。另外,perf sched 還有一個 replay 命令,會根據(jù)采集到的數(shù)據(jù)回放,便于排查問題。

上面僅僅是對 perf sched 的簡單使用,可以知道,我們最大的 delay 是 2 ms,那么,能不能減少呢?

因為我們通常使用的都是 CFS 調(diào)度,有幾個指標(biāo)可以關(guān)注:

  • sched_min_granularity_ns:任務(wù)最小運行時間,防止頻繁的切換
  • sched_wakeup_granularity_ns:該值只是用來判斷任務(wù)被喚醒后能否搶占當(dāng)前任務(wù)。
  • sched_latency_ns:CFQ 隊列所有任務(wù)的運行一次的周期。如果任務(wù)數(shù)量超過了 sched_latency_ns / sched_min_granularity_ns,周期就是 number_of_running_tasks * sched_min_granularity_ns。

對于我們系統(tǒng)來說,這三個值如下:

kernel.sched_min_granularity_ns = 3000000
kernel.sched_latency_ns = 24000000
kernel.sched_wakeup_granularity_ns = 4000000

看起來有點大,參考網(wǎng)上的一些實現(xiàn)調(diào)整下:

kernel.sched_min_granularity_ns = 100000
kernel.sched_wakeup_granularity_ns = 25000
kernel.sched_latency_ns = 1000000

繼續(xù)測試,發(fā)現(xiàn)性能沒啥太大的變化,而且 perf sched record 發(fā)現(xiàn)最大的 latency 也跟之前差不多。具體原因,我因為還不熟悉內(nèi)核,所以也就考慮放一放,后面在請教大牛。但這里我知道,這個調(diào)整雖然在我測試這邊沒發(fā)現(xiàn)太大的作用,但至少學(xué)會了通過 sched 來排查系統(tǒng)的問題,這個沒準(zhǔn)以后能在其他的地方用到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 性能調(diào)優(yōu)工具如 perf,Oprofile 等的基本原理都是對被監(jiān)測對象進(jìn)行采樣,最簡單的情形是根據(jù) tick 中...
    abeb6ca9bb86閱讀 10,871評論 2 15
  • 前言 因為在做nodejs程序的性能分析的時候,了解到了Perf和FlameGraph這兩個神奇的工具,接著就知道...
    泡沫與周期_白羊Jerry閱讀 4,172評論 0 7
  • 1、CFS的基本思路 在CFS算法引入之前,Linux使用過幾種不同的調(diào)度算法,一開始的調(diào)度器是復(fù)雜度為O(n)的...
    kummerwu閱讀 17,721評論 7 32
  • 以下三個是最經(jīng)常被問到的,基本上屬于介紹性的題目,無所謂正確答案,在我看來,這些不算真正的問題。 Discuss ...
    蜀湘情緣閱讀 6,553評論 0 8
  • 70后的老王、80后的小李和90后的小牛(牛耀三)在一個領(lǐng)導(dǎo)下面干活兒。又到一年收獲季。一天開會,領(lǐng)導(dǎo)說:這幾天工...
    新雅人閱讀 611評論 1 2

友情鏈接更多精彩內(nèi)容