Linux Kernel¶
Linuxのカーネル関連技術情報をメモ
トピック¶
tickless¶
Linuxカーネル2.6.21で取り込まれた機能です。dynticks(dynamic ticks)とも呼ばれています。
従来、一定周期(100Hz~1000Hz等)でタイマ割り込みを発生させ、割り込み(tick)処理においてタスクスケジューリング、CPU使用時間等のアカウンティング、システム時刻更新等を実施していました。
この方式だと、tick処理以外にすることがないアイドル状態でも毎秒少なからずCPUが動く必要があり、省電力の観点では不利となっていました。
Ticklessカーネルでは、一定周期のタイマ割り込みを使わず、オンデマンドでタイマ割り込みを発生させ割り込み処理をすることで、アイドル状態のときはCPUを従来に比べ長い時間スリープさせることができます。
ただし、タイマ割り込みの設定が周期ではなくワンショットになるので、毎回タイマ割り込みを設定するオーバーヘッドもあり、負荷の高いシステムでは従来のtickの方がいいということもあるようです(根拠捜索中)。
制御¶
ticklessを無効にするには、カーネル起動時のオプションにnohz=offを指定します。
情報源¶
CFS¶
タスクスケジューラとして2.6.23で導入されたCompletely Fair Scheduler(CFS)です。
従来のO(1)スケジューラ(ランキュー?)に対して、バイナリツリー(赤黒木)でタスクを管理するものです。
消費したCPU時間をキーにバイナリツリーに格納するので、CPU消費時間の少ないタスクが優先的にスケジューリングされます。
バイナリツリーで管理しているので、O(log N)となります。
CPU消費時間はタイムソース(例えばTSC)で計られるようです(tick数ではないのでナノ秒オーダーとなるらしい)。
情報源¶
Linuxカーネル2.6 Completely Fair Schedulerの内側
Completely Fair Schedulerによるマルチプロセッシング
Cステート制御¶
Linuxカーネルに含まれるcpuidleドライバにより、x86 CPUのCステートが制御されます。
Intelプロセッサ搭載計算機上では、intel_idleドライバが使われますが、これはBIOS設定でCステートを無効にしていても、BIOS設定を無視してCステート制御をアグレッシブに行います。
使われているcpuidleドライバを調べる¶
$ cat /sys/devices/system/cpu/cpuidle/current_driver acpi_idle
この例では、intel_idleではなく、acpi_idleが使用されています。
カーネルのCステート制御に関するオプション指定¶
intel_idleドライバを無効にする¶
カーネルの起動パラメータに次を指定します。
intel_idle.max_cstate=0
0を指定するとintel_idleドライバが無効となり、おそらくacpi_idleドライバが使われます。なので、このパラメータで0を指定するときは、同時に次節のパラメータprocessor.max_cstateを指定する必要があります。
1-6を指定すると、intel_idleドライバを使用し、遷移するCステートの最大深度が指定した値になります。
Cステートの制御を実施しない¶
カーネルの起動パラメータに次を指定します。
processor.max_cstate=0
- 0を指定しても1と同じになるという説もあり
cpuidle.max_cstateオプション¶
intel_idle.max_cstateとprocessor.max_cstateを使う方法は、あまりきれいではないので、cpuidle.max_stateというオプションが登場したようです。
Cステートの遷移状況を調べる¶
RHEL6/CentOS6には標準でpowertopパッケージが用意されているので、これをインストールしてpowertopコマンドで動作状況を確認します。
powertopコマンドを実行すると、次のように画面に状況が表示されます。