Slide 1

Slide 1 text

利きプロセススケジューラ Nov. 9th, 2024 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

利き酒 2 利き酒(ききざけ、唎き酒、聞き酒とも)とは、酒の品質を判定すること[1]。 引用元: 「利き酒」(2024年7月22日 (月) 07:14 UTCの版)『ウィキペディア日本語版』。 酒

Slide 3

Slide 3 text

利き酒 3 利き酒(ききざけ、唎き酒、聞き酒とも)とは、酒の品質を判定すること[1]。 引用元: 「利き酒」(2024年7月22日 (月) 07:14 UTCの版)『ウィキペディア日本語版』。 酒 ペロリ… これは菊姫

Slide 4

Slide 4 text

利きプロセススケジューラ 4 カーネルソースのバージョン見ず、ソースも読まず、プロセスの挙動のみからプロセスス ケジューラが何かを判定すること[要出典][独自研究][誰によって?]。

Slide 5

Slide 5 text

利きプロセススケジューラ 5 カーネルソースのバージョン見ず、ソースも読まず、プロセスの挙動のみからプロセスス ケジューラが何かを判定すること[要出典][独自研究][誰によって?]。 ペロリ… これはCFS!

Slide 6

Slide 6 text

今日のお題 ● 3つの環境A,B,Cのプロセススケジューラが何かを判定する ● プロセススケジューラは以下のうちのいずれか ○ O(1)スケジューラ: Linux v2.6.0~v2.6.22 ○ CFS(Completely Fair Scheduler): Linux v2.6.23~v6.5 ○ EEVDF(Earliest Eligible Virtual Deadline First ): Linux v6.6~ ● 実験プログラムを動かした結果得られるグラフから判定 6 がんばります

Slide 7

Slide 7 text

実験プログラム ● 使い方 ○ ./sched.py <並列度> ● やること ○ 1. CPU時間を所定量使った後に終了する負荷処理を <並列度>の数だけ起動する ■ 全て1つのコア上で動作させる ○ 2. すべての負荷処理の終了を待つ ○ 3. 負荷処理の開始時からの経過時間と進捗をあらわすグラフを描く ■ x軸は経過時間[ms]、y軸は進捗[%] ● ソース ○ https://github.com/satoru-takeuchi/sched-tasting/blob/main/sched.py 7

Slide 8

Slide 8 text

グラフの見かた 8 負荷処理0,1が同じ量のCPU時間(タイムスライス)を交 互に使いながら進捗する。 進捗が100%になったら終了

Slide 9

Slide 9 text

利きプロセススケジューラ、開始! ● 環境A,B,C上で./sched.pyを動かし、得られたグラフを見る ● パラメタ ○ 並列度: 2,3 ○ nice値: 0(デフォルト値), 19(最高値。優先度でいうと最低 ) ■ niceコマンドを使って指定 ● グラフの特徴からプロセススケジューラが何かを判定する 9 みんなもやってみよう !

Slide 10

Slide 10 text

環境Aで得たグラフ 10 nice値=0 nice値=0 nice値=19 nice値=19

Slide 11

Slide 11 text

環境Bで得たグラフ 11 nice値=0 nice値=0 nice値=19 nice値=19

Slide 12

Slide 12 text

環境Cで得たグラフ 12 nice値=19 nice値=19 nice値=0 nice値=0

Slide 13

Slide 13 text

答え合わせ 13 わかったかな?

Slide 14

Slide 14 text

環境Aは… 14 nice値=0 nice値=0 nice値=19 nice値=19

Slide 15

Slide 15 text

環境Aは… 15 nice値=0 nice値=0 nice値=19 nice値=19 ペロリ… これはO(1)スケジューラ!

Slide 16

Slide 16 text

根拠 ● O(1)スケジューラの特徴 ○ nice値が変わるとタイムスライスが変わる ○ 実行可能プロセス数を変えてもタイムスライスは不変 ● 2つの特徴を兼ね備えるのはO(1)スケジューラのみ 16

Slide 17

Slide 17 text

nice値が大きくなるとタイムスライスが短くなっている 17 nice値=0 nice値=19

Slide 18

Slide 18 text

nice値が大きくなるとタイムスライスが短くなっている 18 nice値=0 nice値=19 📝 nice値0: タイムスライスは100ms nice値19: タイムスライスは5ms

Slide 19

Slide 19 text

並列数が増えてもタイムスライスが変わらない 19 nice値=19 nice値=19

Slide 20

Slide 20 text

並列数が増えてもタイムスライスが変わらない 20 nice値=19 nice値=19 📝 実行可能プロセス数が増えるとCPU時間が全然もら えなくなりがちという問題がある

Slide 21

Slide 21 text

環境Bは… 21 nice値=0 nice値=0 nice値=19 nice値=19

Slide 22

Slide 22 text

環境Bは… 22 nice値=0 nice値=0 nice値=19 nice値=19 ペロリ… これはCFS!

Slide 23

Slide 23 text

根拠 ● CFSは実行可能プロセス数が多くなるとタイムスライスが短くなる ○ 全プロセスの実行が一周する期間を指す「レイテンシターゲット」という概念がある ○ レイテンシターゲットは一定値に保たれる ■ タイムスライスは”<レイテンシターゲット >/<実行可能なプロセス数 >”になる ● この特徴を持つのはCFSだけ 23

Slide 24

Slide 24 text

レイテンシターゲットが一定 24 並列度2, nice値0 並列度3, nice値0

Slide 25

Slide 25 text

レイテンシターゲットが一定 25 並列度2, nice値0 並列度3, nice値0 📝 ● レイテンシターゲットは”<定数>*(1 + log 2 (<コア数>))” ○ 環境Bは定数が6[ms]でコア数8なので6*4=24[ms] ● 実行可能プロセス数が増えすぎるとタイムスライスは無限に小さくならず、最低保 証値がある。この場合はレイテンシターゲットが長くなる

Slide 26

Slide 26 text

環境Cは… 26 nice値=19 nice値=19 nice値=0 nice値=0

Slide 27

Slide 27 text

環境Cは… 27 nice値=19 nice値=19 nice値=0 nice値=0 ペロリ… これはEEVDF!

Slide 28

Slide 28 text

根拠 ● EEVDFの特徴 ○ 実行可能プロセス数が増えてもタイムスライスは不変 ○ nice値を大きくしてもタイムスライスは不変 ● 2つの特徴を兼ね備えるのはEEVDFのみ 28

Slide 29

Slide 29 text

実行可能プロセス数が増えてもタイムスライスは不変 29 並列度2, nice値0 並列度3, nice値0

Slide 30

Slide 30 text

nice値を大きくしてもタイムスライスは不変 30 並列度2, nice値0 並列度2, nice値19

Slide 31

Slide 31 text

nice値を大きくしてもタイムスライスは変わらない 31 並列度2, nice値0 並列度2, nice値19 📝 ● タイムスライスは”<定数>*(1+log 2 (<コア数>)” ○ 環境Cは定数が0.75[ms]で8コアなので0.75*4=3ms

Slide 32

Slide 32 text

まとめ ● 実行可能プロセスが数個程度なら以下のことが言える 32 実行可能プロセスが増えるとタ イムスライスが… nice値が大きくなるとタ イムスライスが… O(1)スケジュー ラ 変わらない 短くなる CFS 短くなる 短くなる EEVDF 変わらない 変わらない

Slide 33

Slide 33 text

● 各環境 ○ 環境A: Ubuntu 7.04, linux v2.6.20 -> 💮 O(1)スケジューラ ○ 環境B: Ubuntu 24.04, linux v5.15 -> 💮 CFS ○ 環境C: Ubuntu 24.04, linux v6.8 -> 💮 EEVDF ● ./sched.pyのソース、全グラフと元データのありか ○ https://github.com/satoru-takeuchi/sched-tasting 参考情報 33

Slide 34

Slide 34 text

終わり 34 プロセススケジューラおいしい