第14章 タスクスケジューラのチューニング

目次

14.1. 前置き
14.2. プロセスの分類
14.3. O(1) スケジューラ
14.4. Completely Fair Scheduler (完全公平型スケジューラ)
14.5. さらなる情報

openSUSE® のように新しいオペレーティングシステムの場合、通常は同時に 複数のタスクが動作します。たとえばメールを受信しながら同時にテキストファイルの 検索を行なったり、さらに大きなファイルを外付けのハードディスクにコピーしたり、 などのことを行なうことができます。これらのようなシンプルな作業であれば、追加の プロセスをシステム内で起動すれば、それらを同時に行なうことができます。それぞれの タスクに対して必要なシステム資源を提供するには、それぞれのテスクに対して資源を 割り当てるための Linux カーネル向けツールが必要になります。より正確に書くと、 Linux カーネルには タスクスケジューラ と呼ばれるものが 用意されています。

本章では、まずプロセス (タスク) のスケジュール処理に関連する最も重要な用語に ついての説明を行なっています。また、 openSUSE で使用されるタスクスケジューラの ポリシーに関する情報やスケジュールの処理方法、タスクスケジューラに関する説明なども あわせて記述されています。そのほかにも、関連する情報へのリンクなども示しています。

14.1. 前置き

Linux カーネルには、動作中のシステムでタスク (プロセス) を管理するための制御 方法が用意されています。タスクスケジューラ (プロセススケジューラ と呼ばれる場合もあります) はカーネルに含まれるもので、次に動作させるべきタスクを 判断する機能を備えています。これは (Linux のような) マルチタスク型のオペレーティング システムでは中枢となるコンポーネントの 1 つで、複数のタスクを同時に動作させる にあたって、システム資源を最も効率的に働かせるための作業を行ないます。

14.1.1. プリエンプション

タスクスケジュールの原理は非常にシンプルなものです。システム内に実行可能な プロセスが存在する場合、常に少なくとも 1 つ以上のプロセスが動作状態になります。 システム内にプロセッサ数よりも多い数のプロセスが存在する場合は、全てのプロセスを 同時に動作させることはできません。

そのため、プロセスによっては一時的に停止する (サスペンド 状態にする) 必要があることになります。これにより他のプロセスが動作できる状態に なるわけです。スケジューラは、キュー内に存在するプロセスのうち、どれを次に実行 すべきかを決定します。

上述のとおり、 Linux やその他の Unix 系 OS は マルチタスク 型のオペレーティングシステムです。これは複数の処理を同時に動作させることができる という意味です。 Linux では プリエンプティブ マルチタスクと 呼ばれる仕組みで、どのプロセスを一時停止させるのかをスケジューラが決定します。 このような強制的な停止機能を プリエンプション と呼びます。 全ての Unix 系 OS では、当初の段階からプリエンプティブマルチタスクを提供しています。

14.1.2. タイムスライス

特定のプロセスが 占有する にあたって、どれだけの時間 占有させるのかは、事前に設定されます。これをプロセスの タイムスライス と呼び、それぞれのプロセスに対して割り当てられるプロセッサ時間の形式で表わします。 タイムスライスを割り当てることによって、スケジューラは実行中のシステムに対して 全体制御を行なうことができるほか、特定のプロセスがプロセッサの資源を占有したり しないようにすることができます。

14.1.3. プロセスの優先順位

スケジューラでは、プロセスの実行に対して優先順位を判断する仕組みを備えています。 プロセスに対する現在の優先順位を計算するため、タスクスケジューラは複雑な アルゴリズムを用いています。結果として、それぞれのプロセスはプロセッサ上で 実行を 許可される 優先順位の値を持つことになります。

14.2. プロセスの分類

プロセスは通常、それらの用途や振る舞いに応じて分類が行なわれます。各分類の境界は 明確に説明できるものではありませんが、一般的に 2 つの条件が分類の際の並び替えに 利用されます。これらの条件はそれぞれ独立しているもので、相互に排他的なものでは ありません。

プロセスの 1 つめの分類は、 I/O-バウンド か、もしくは プロセッサ・バウンド のどちらであるのかを判断します。

I/O-バウンド

I/O とはキーボードやマウス、光学ドライブやハードディスクなどのデバイスに 対して、入出力することを意味しています。 I/O-バウンドのプロセス は、多くの時間をデバイスに対する要求の送信や応答の待機に費やしています。 これらは頻繁に動作するものではありますが短い時間で動作が一時停止し、 I/O 要求を待機している他のプロセスに対して、その動作を阻害することはありません。

プロセッサ・バウンド

もう一方の プロセッサ・バウンド のタスクではコードの 実行に時間が費やされるもので、通常はスケジューラから優先権が与えられている間 動作し続けるタイプのものです。これらのプロセスは、 I/O 要求を待機している プロセスの動作を阻害することはないので、頻度は低いながら長い時間の処理が かかるものです。

もう一つの分類は、それぞれプロセスを インタラクティブ (対話型), バッチ (一括処理型), リアルタイム (即時応答型) に分けるやり方です。

  • インタラクティブ なプロセスは、キーボードやマウス操作 などの入出力要求に多くの時間を費やします。スケジューラはユーザからの要求が あった場合に即時に応答しなければならず、応答が遅れるとハングアップしたものと みなされてしまいます。この分類での一般的な遅延限界は 100 [ミリ秒] 程度です。 オフィス系アプリケーションやテキストエディタ、画像操作プログラムなどが一般的な インタラクティブなプロセスです。

  • バッチ プロセスはその処理を裏で実施するものであって、 応答に対して敏感になる必要はありません。これらはスケジューラでは低い優先順位に 位置づけられます。マルチメディアコンテンツの変換やデータベースの検索エンジン、 ログファイルの分析などが一般的なバッチプロセスです。

  • リアルタイム なプロセスは、低い優先順位を持つプロセス によって実行が阻害されてはならないものです。そのため、スケジューラはそれらに 対する応答性を保障するようになっています。マルチメディアコンテンツの編集 アプリケーションなどが一般的なリアルタイムプロセスです。

14.3. O(1) スケジューラ

Linux カーネルバージョン 2.6 では、 O(1) と呼ばれる新しいタスクスケジューラが 提供されています (詳しくは ランダウの記号 をお読みください) 。カーネルバージョン 2.6.22 以降では既定のスケジューラとして 使用されています。このタスクスケジューラの主な処理は、システム内でどれだけ多くの プロセスが実行されていたとしても、一定の時間内にタスクをスケジュールすることに あります。

スケジューラではタイムスライスを動的に計算します。ですが、適切なタイムスライスを 計算するのは、あまりにも複雑な処理になってしまいます。長すぎるタイムスライスを 割り当ててしまうとシステムの応答や反応が悪くなってしまいますし、逆に短すぎる タイムスライスを設定するとプロセス間の切り替えが頻発してしまい、それに伴う オーバーヘッドが大きくなってしまいます。そのため、既定のタイムスライスは比較的 小さめ、たとえば 20 [ミリ秒] 程度で、スケジューラはプロセスの優先順位をベースに タイムスライスを決定します。これにより、高い優先順位を持つプロセスに対して、 より頻繁かつ長い時間が割り当てられるようになっています。

また、プロセスは自身に割り当てられたタイムスライスを一括で使用することはありません。 たとえば、 150 [ミリ秒] が割り当てられたプロセスであれば、 150 [ミリ秒] の間 ずっと実行し続けるわけではなく、 30 [ミリ秒] のスケジュールスロットを 5 [回分] に分けて実行することがあります。それほど長いタイムスライスを必要としない対話的な 処理の場合、このようなアプローチにすることで、できるだけ反応性を良くすることが できるようになっています。

なお、スケジューラはプロセスの優先順位も動的に設定します。スケジューラはプロセスの 振る舞いを監視し、必要であれば優先順位を調整します。たとえば、長い時間にわたって 動作が止まっているプロセスの場合、優先順位を上げることで優先的に実行できるように なります。

14.4. Completely Fair Scheduler (完全公平型スケジューラ)

Linux カーネルバージョン 2.6.23 以降では、実行プロセスに対する新しいスケジューリング アプローチが提供されるようになりました。 Completely Fair Scheduler (CFS) (完全公平型スケジューラ) と呼ばれるもので、既定の Linux カーネルスケジューラに なっています。このスケジューラでは重要な変更と改善が施されているため、本章では このスケジューラについて説明を行なっています。なお、 openSUSE の場合、 カーネルバージョン 2.6.32 以降 (3.x カーネルも含まれます) に適用されています。 スケジューラ環境は複数のパーツから構成されていて、 3 種類の主な機能が提供されています:

モジュール型のスケジューラ設計

スケジューラの中枢部分は スケジューリングクラス と 呼ばれるもので拡張されています。これらのクラスはモジュールとして利用できる もので、スケジュール処理のポリシーを表わすものです。

完全公平型スケジューラ (CFS)

カーネル 2.6.23 で提供され、 2.6.24 で拡張されています。 CFS はそれぞれの プロセスに対して、プロセッサ時間を 公平に 共有できるように 処理を行ないます。

グループスケジューリング

たとえば実行ユーザごとにプロセスをグループ化し、 CFS はそれらのグループに 対して同じプロセッサ時間が割り当てられるように処理を行ないます。

上記のような構成から、 CFS はサーバ用途とデスクトップ用途の両方に対して 最適なスケジューリングを行なうことができるようになっています。

14.4.1. CFS の動作原理

CFS はそれぞれの処理に対して公平なアプローチを保証しようとします。タスク スケジューリングに対して最もバランスの取れたやり方を検出するため、 赤黒木 と呼ばれるコンセプトを利用しています。 赤黒木は項目を挿入したり削除したりすることのできるデータ検索用の木構造で、 挿入や削除が行なわれてもバランスを崩さない仕組みです。赤黒木について、 詳しくは 赤黒木 にある wiki ページをお読みください。

処理が 実行キュー (次に実行すべきプロセスの予定表) 内に投入されると、スケジューラはまず現在時刻を記録します。プロセスがプロセッサ 時間を得られるまで待機している間、そのプロセスの 待機 値が 加算されます。加算される値は、その時点で実行キュー内に存在する処理の合計数と、 プロセスの優先順位から計算される値になります。プロセッサがあるプロセスを 実行すると、その 待機 値は減算されます。待機値が一定の レベルを下回ると、そのプロセスはスケジューラによって待機状態になり、その他の プロセスがプロセッサを優先的に利用できるようになります。このようなアルゴリズム により、 CFS は 待機 値が常にゼロという理想的な状態になる ようにします。

14.4.2. プロセスのグループ化

Linux カーネルバージョン 2.6.24 以降では、 CFS をタスク (プロセス) 単体だけ でなくユーザやグループに対しても公平性を設定できるようになりました。 タスクはユーザやグループによってグループ化され、 CFS はそれぞれのタスクに 対して公平になるように調整するのではなく、ユーザやグループに対して公平になる ように調整させることができます。なお、スケジューラはユーザやグループ内の 各タスクに対しても公平になるように調整します。

タスクはそれぞれ下記に示す方法のいずれかでグループ化することができます:

  • ユーザ ID ごと

  • カーネルのコントロールグループごと

カーネルのスケジューラがタスクをグループ化する方法は、カーネルのコンパイル時 に設定するオプション CONFIG_FAIR_USER_SCHED および CONFIG_FAIR_CGROUP_SCHED によって設定されます。 openSUSE® 13.1 での既定の設定はコントロールグループ (後者) で、これにより必要なグループを作成できるようになっています。 詳しくは 第10章 カーネルのコントロールグループ をお読みください。

14.4.3. カーネル設定オプション

タスクスケジューラの振る舞いにおける基本的な設定項目は、カーネルの設定 オプションで指定できます。これらのオプションの設定は、カーネルのコンパイル 作業の一部として実施するものです。カーネルのコンパイル作業は複雑な作業で あるため本マニュアルでは説明を行なっていません。関連するドキュメント (たとえば http://ja.opensuse.org/Configure,_Build_and_Install_a_Custom_Linux_Kernel など) をお読みのうえ、作業を行なってください。

[Warning]カーネルのコンパイル

openSUSE を同梱のカーネルで動作させない場合、たとえばご自身でコンパイル したカーネルを利用した場合などは、サポートを受けることができなくなることに ご注意ください。

14.4.4. 用語

タスクスケジューリングポリシーに関するドキュメントでは、しばしばいくつかの 技術用語を利用して説明しています。下記にその用語のうちのいくつかを説明します:

遅延

プロセスが実行されるはずだった時間から、実際にプロセスが実行された時間 までの時間間隔。

粒度

粒度と遅延の関係は下記の数式で表わされます:

gran = ( lat / rtasks ) - ( lat / rtasks / rtasks )

ここで gran は粒度を、 lat は遅延を、 rtasks は実行中のタスク数を表わします。

14.4.4.1. スケジュールポリシー

Linux カーネルでは、下記のようなスケジュールポリシーに対応しています:

SCHED_FIFO

特別なアプリケーションに対して適用されるもので、特に時間面に制約の あるアプリケーションに使用します。これは FIFO (First In-First Out) と呼ばれるスケジュール用アルゴリズムを使用します。

SCHED_BATCH

CPU を主に使用する処理向けのスケジュールポリシーです。

SCHED_IDLE

とても 優先度の低い処理向けに用意された スケジュールポリシーです。

SCHED_OTHER

ほとんどのプロセスに適用される、既定の Linux 時間共有型スケジュール ポリシーです。

SCHED_RR

SCHED_FIFO に似た仕組みですが、ラウンドロビン型のスケジュール アルゴリズムを使用するスケジュールポリシーです。

14.4.5. chrt を利用したリアルタイム属性の変更

chrt は、実行中のプロセスに対してリアルタイム スケジューリングの設定や設定値の取得を行なうためのコマンドであるほか、 指定した属性でコマンドを実行することもできるコマンドです。スケジューリング ポリシーの取得のほか、プロセスの優先度を取得することもできます。

下記では、 PID が 16244 である場合の例を示しています。

既存の処理に対して、リアルタイム属性を 取得 するには、下記のように実行します:

saturn.example.com:~ # chrt -p 16244
pid 16244's current scheduling policy: SCHED_OTHER
pid 16244's current scheduling priority: 0

プロセスに対して新しいスケジュールポリシーを設定する前に、それぞれの スケジュールアルゴリズムに対して設定できる優先度について、その最大値と 最小値を取得しておきます:

saturn.example.com:~ # chrt -m
SCHED_OTHER min/max priority : 0/0
SCHED_FIFO min/max priority : 1/99
SCHED_RR min/max priority : 1/99
SCHED_BATCH min/max priority : 0/0
SCHED_IDLE min/max priority : 0/0

上記の例では、 SCHED_OTHER, SCHED_BATCH, SCHED_IDLE の各ポリシーは それぞれ優先度 0 のみが許可されています。 SCHED_FIFO と SCHED_RR は 優先度が 1 から 99 までの範囲で設定できることを示しています。

SCHED_BATCH スケジュールポリシーを設定するには、下記のように実行します:

saturn.example.com:~ # chrt -b -p 0 16244
saturn.example.com:~ # chrt -p 16244
pid 16244's current scheduling policy: SCHED_BATCH
pid 16244's current scheduling priority: 0

chrt について、詳しくはマニュアルページ (man 1 chrt) をお読みください。

14.4.6. sysctl を利用した実行時のチューニング

実行時にカーネルのパラメータを調査したり変更したりすることのできる sysctl インターフェイスを利用することで、タスクスケジューラの 動作を既定値から変更することができます。 sysctl の書式は 単純なものですが、下記に示すコマンドはいずれも root で実行しなければ なりません。

カーネル変数の値を読み出すには、下記のように入力します:

sysctl variable

値を設定するには、下記のように入力します:

sysctl variable=value

スケジューラ関連の sysctl 変数の一覧を読み出す には、下記のように入力します:

sysctl -A | grep "sched" | grep -v"domain"
saturn.example.com:~ # sysctl -A | grep "sched" | grep -v "domain"
kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 1000000
kernel.sched_latency_ns = 5000000
kernel.sched_wakeup_granularity_ns = 1000000
kernel.sched_shares_ratelimit = 250000
kernel.sched_tunable_scaling = 1
kernel.sched_shares_thresh = 4
kernel.sched_features = 15834238
kernel.sched_migration_cost = 500000
kernel.sched_nr_migrate = 32
kernel.sched_time_avg = 1000
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
kernel.sched_compat_yield = 0

なお、 _ns_us で終わる変数は、 それぞれナノ秒やマイクロ秒を単位とした値を示しています。

また下記の一覧では、タスクスケジューラの sysctl 変数の うち、チューニングに重要なものと、その説明を示しています (いずれも /proc/sys/kernel/ 内に存在しています):

sched_child_runs_first

新しく fork() された子プロセスが、親プロセスが実行状態に戻る前に実行が開始 されるようになります。このパラメータを 1 に設定すると、 fork された後すぐに子プロセスが動作をはじめるようなアプリケーションには 有益な設定になります。たとえば、 make -j<CPU 数> のようなコマンドラインの場合、 sched_child_runs_first を無効に設定したほうが よりよい性能を発揮します。既定値は 0 です。

sched_compat_yield

古い 0(1) スケジューラの動作を有効にし、より積極的な yield 動作を行なうように なります。動機 (synchronization) を多用する Java アプリケーションの場合、 この値を 1 に設定するとよりよい性能を発揮することが できます。ただし、この値は性能面に何らかの問題を抱えた場合にのみ設定して ください。既定値は 0 です。

なお、 sched_yield() システムコールの動作に依存するアプリケーションに対して、 その性能を改善したい場合も 1 に設定するとよいでしょう。

sched_migration_cost

タスクの移行判断の際、 キャッシュホット であると判断される までの時間間隔を、最後の実行からの経過時間で設定します。 ホットな タスクは移行されにくいため、この値を増加させることでタスク移行を少なくする ことができます。既定値は 500000 [ナノ秒] です。

実行すべきプロセスが存在するのに CPU の空き時間が期待よりも多い場合は、 この値を小さくしてみるとよいでしょう。逆にタスクが CPU 間やノード間を行き来 してしまうような場合は、大きくしてみるのがよいでしょう。

sched_latency_ns

CPU を主に使用するタスクに対して、占有権を得るまでの遅延時間について、 その目標値を設定します。この値を増加させると、 CPU がタスクに割り当てる タイムスライスが大きくなります。タスクのタイムスライスは、スケジュールされた 時間単位を公平に共有するように配分を行ないます:

タイムスライス = スケジュール間隔 * (タスクの重さ / 実行キュー内にあるタスクの重さの合計値)

タスクの重さは、タスクの nice 値とスケジューリングポリシーに依存して決まり ます。 SCHED_OTHER におけるタスクの重さの最小値は nice 値が 19 のときで、 15 です。タスクの重さの最大値は nice 値が -20 のときで、 88761 になります。

タイムスライスは負荷が増加すると小さくなります。動作しているタスクの数が sched_latency_ns/sched_min_granularity_ns を超えると、タイムスライスは (動作しているタスク数) * sched_min_granularity_ns に設定されます。 上記より少ない場合、タイムスライスは sched_latency_ns に設定されます。

また、この値は休止中のタスクが動作中として扱われ、計算に含むようにする際の 最大時間間隔をも意味しています。この値を増加させると、動作中のタスクが占有権を 得るまでにかかる時間が増えます。そのため、 CPU を主に使用するタスクの場合は、 スケジューラによる遅延が増大することになります。既定値は 20000000 [ナノ秒] です。

sched_min_granularity_ns

CPU を主に使用するタスクに対して、占有権を得る際の粒度の最小値を設定します。 詳しくは sched_latency_ns をお読みください。 既定値は 4000000 [ナノ秒] です。

sched_wakeup_granularity_ns

タスク起動時の占有権の粒度を設定します。この値を増加させると起動時の占有性 が低くなり、主に計算処理を行なうタスクに対してそれらへの妨害が少なくなります。 また、この値を低く設定すると起動時の遅延が少なくなり、遅延させたくないタスク に対するスループットを向上させることができます。特に短い効率サイクルの負荷を 持つようなタスクと、CPU を多く使用するタスクを同時に動かさなければならない 場合に利用します。既定値は 5000000 [ナノ秒] です。

[Warning]

この値を sched_latency_ns の半分よりも大きく 設定すると、起動時の占有性がゼロになり、短い効率サイクルのタスクが CPU を占有するタスクに打ち勝てなくなってしまいます。

sched_rt_period_us

リアルタイムなタスクの帯域強制の割り当て時間を設定します。 既定値は 1000000 [マイクロ秒] です。

sched_rt_runtime_us

リアルタイムなタスクに対して、 sched_rt_period_us の期間に割り当てる 分量を設定します。 -1 を設定すると、リアルタイムなタスクに対する帯域強制を 行なわなくなります。既定では、リアルタイムなタスクは 95 [%CPU毎秒] を消費 するものとしているため、残りの 5 [%CPU毎秒] または 0.05 [秒] が SCHED_OTHER に設定されたタスクに割り当てられます。

sched_features

特定のデバッグ機能の目的で情報提供を行なうためのものです。

sched_stat_granularity_ns

タスクスケジューラの統計に対する粒度を設定します。

sched_nr_migrate

移行のソフトウエア割り込み (softirq) の期間に、プロセッサ間を移動できる タスク数を制御します。 SCHED_OTHER のポリシーで多数のタスクが作成される 環境では、それらはすべて同じプロセッサで動作し続けます。既定値は 32 です。この値を増やすと、リアルタイムなタスクに対する 遅延が増大する一方、 SCHED_OTHER のスレッドに対して性能向上を行なうことが できます。

14.4.7. デバッグ用インターフェイスとスケジューラ統計情報

CFS では新しいデバッグインターフェイスが提供されているほか、システム動作中の 統計情報を提供する機能も備わっています。関連するファイルは /proc ファイルシステム内に配置され、これらは単純に catless のコマンドで調べることができるようになっています。 /proc ディレクトリ内に存在する関連ファイルについて、 下記に説明を列挙します:

/proc/sched_debug

すべてのチューニング可能な変数に対して、現在の値を表示します (詳しくは 14.4.6項 「sysctl を利用した実行時のチューニング」 を参照) 。 これらはタスクスケジューラの動作に影響があるもののほか、 CFS の統計情報や 利用可能なすべてのプロセッサに対する実行キュー情報が含まれています。

saturn.example.com:~ # less /proc/sched_debug
Sched Debug Version: v0.09, 2.6.32.8-0.3-default #1
now at 2413026096.408222 msecs
  .jiffies                                 : 4898148820
  .sysctl_sched_latency                    : 5.000000
  .sysctl_sched_min_granularity            : 1.000000
  .sysctl_sched_wakeup_granularity         : 1.000000
  .sysctl_sched_child_runs_first           : 0.000000
  .sysctl_sched_features                   : 15834238
  .sysctl_sched_tunable_scaling            : 1 (logaritmic)

cpu#0, 1864.411 MHz
  .nr_running                    : 1
  .load                          : 1024
  .nr_switches                   : 37539000
  .nr_load_updates               : 22950725
[...]
cfs_rq[0]:/
  .exec_clock                    : 52940326.803842
  .MIN_vruntime                  : 0.000001
  .min_vruntime                  : 54410632.307072
  .max_vruntime                  : 0.000001
[...]
rt_rq[0]:/
  .rt_nr_running                 : 0
  .rt_throttled                  : 0
  .rt_time                       : 0.000000
  .rt_runtime                    : 950.000000

runnable tasks:
  task  PID   tree-key    switches prio exec-runtime    sum-exec sum-sleep
--------------------------------------------------------------------------
R cat 16884 54410632.307072    0   120  54410632.307072 13.836804 0.000000
/proc/schedstat

現在の実行キュー関連する統計情報を表示します。 SMP システムにおけるドメイン 固有の統計情報についても、接続されているプロセッサごとに表示が行なわれます。 出力形式は読みやすいものとはいえないものであるため、詳しくは /usr/src/linux/Documentation/scheduler/sched-stats.txt をお読みください。

/proc/PID/sched

プロセス ID が PID であるプロセスに対して、 そのプロセスに関するスケジュール情報を表示します。

saturn.example.com:~ # cat /proc/`pidof nautilus`/sched
 nautilus (4009, #threads: 1)
 ---------------------------------------------------------
 se.exec_start                      :    2419575150.560531
 se.vruntime                        :      54549795.870151
 se.sum_exec_runtime                :       4867855.829415
 se.avg_overlap                     :             0.401317
 se.avg_wakeup                      :             3.247651
 se.avg_running                     :             0.323432
 se.wait_start                      :             0.000000
 se.sleep_start                     :    2419575150.560531
 [...]
 nr_voluntary_switches              :               938552
 nr_involuntary_switches            :                71872
 se.load.weight                     :                 1024
 policy                             :                    0
 prio                               :                  120
 clock-delta                        :                  109

14.5. さらなる情報

Linux のタスクスケジューリングについて、凝縮された知識をご希望の場合は、 いくつかの情報源をあたってみることをお勧めします。それらのうちのいくつかを 下記に紹介します:

  • タスクスケジューラシステムのシステムコールに関する説明。関連するマニュアル ページ (たとえば man 2 sched_setaffinity) をお読み ください。

  • スケジューリングに関する一般的な情報は、 スケジューリング の Web ページをお読みください。

  • Linux におけるタスクスケジューリングに関する一般的な情報は、 Linux スケジューラーの内側 をお読みください。

  • 完全公平型スケジューラに関する固有の情報は、 Completely Fair Scheduler によるマルチプロセッシング をお読みください。

  • 完全公平型スケジューラをチューニングする場合の固有の情報は、 Tuning the Linux Kernel’s Completely Fair Scheduler (英語) をお読みください。

  • Linux のスケジューラポリシーやアルゴリズムに関する有益な講義は、 http://www.inf.fu-berlin.de/lehre/SS01/OS/Lectures/Lecture08.pdf (英語) から参照できます。

  • Linux のプロセススケジューリングにおける、わかりやすい概要は、 Robert Love 氏が書かれた Linux Kernel Development (ISBN-10: 0-672-32512-8) (英語) がよいでしょう。 http://www.informit.com/articles/article.aspx?p=101760 を参照してください。

  • Linux カーネルの内部に関する広範囲の概要を知りたい場合は、 Daniel P. Bovet 氏と Marco Cesati 氏が書かれた 詳解 Linuxカーネル (原文: ISBN 978-0-596-00565-8) (日本語訳: ISBN 978-4873113135) を お読みください。

  • タスクスケジューラに関する技術情報は、 /usr/src/linux/Documentation/scheduler ファイル内に 記述されています。


openSUSE システム分析とチューニングガイド 13.1