Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CFS入門

xorphitus
December 15, 2015

 CFS入門

CFS に入門しようとしました。

xorphitus

December 15, 2015
Tweet

More Decks by xorphitus

Other Decks in Programming

Transcript

  1. これまでのあらすじ • 最初は ◦ BFS (Brain Fuck Scheduler): プロセススケジューラ ◦

    BFQ (Buget Fair Queueing): I/Oスケジューラ • の、どっちかの話をしようと思った ◦ yaourt -S linux-ck で両者対応パッチの当たったカーネルが入るよ • しかしところが • 「あれ、そもそも自分、スケジューラ全然分かってねえや」 • 「よし基本っぽいところから勉強しよう」 • 「じゃあスタンダードっぽいプロセススケジューラでいいや」←いまここ
  2. いやー、今回やろうと思ってたんだけどなー • Linux プロセススケジューラ基礎 • O(1) スケジューラとの比較 • BFS との比較

    • カーネルコードリーディング • 実際に色んなプロセススケジューラを 動かしてみた 間に合いませんでした・・・
  3. 各タスクにかける時間に重みをつける nice値を考慮すると、一タスク当たりの時間 (slice) は weight = 1.25 ^ (-nice) slice

    = period * weight / total_wight task 1 ・・・ task n task 3 task 2 nice値の小さいものが 幅をきかせる period(ms) slice
  4. ただし period には下限がある タスクが増えすぎると slice が小さくなりすぎコンテキストスイッチのコストがやばいため (nr_running は稼働中プロセス数) sysctl_sched_min_granularity =

    0.75 ms * (1 + log(コア数)) static u64 __sched_period(unsigned long nr_running) { u64 period = sysctl_sched_latency; unsigned long nr_latency = sched_nr_latency; if (unlikely(nr_running > nr_latency)) { period = sysctl_sched_min_granularity; period *= nr_running; /* ここで「最低 slice * タスク数」を period に設定している */ } return period; }
  5. タスクの実行順序はどうなるのか 赤黒木で順序を保持してるらしい • 探索、挿入、削除の最悪計算時間が O(log n) • 探索速度だけで見るとO(1) スケジューラ に劣る

    ◦ ただしこいつはタスク実行が偏る 「基本は」以下の式で算出された vruntime の小さい順に並ぶ vruntime = そのタスクが動作している時間 + 1.25 ^ nice つまり、nice 値を考慮しつつも、長いこと専有しているやつがのさばらないように調整さ れる → FAIR