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

CFS入門

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for xorphitus xorphitus
December 15, 2015

 CFS入門

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

Avatar for xorphitus

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