Linuxカーネルは,CPUやメモリー,ディスク,ネットワークなどのさまざまなデバイスを管理・制御しています。カーネルがそれらを扱う際の設定をうまく変更すれば,各部分の性能を容易に向上できます。いくつかチューニングのキーとなるポイントを具体的に紹介します。

 Linuxに精通した人なら「カーネル・チューニング」といえば,カーネル・コンパイル時の各種設定を書き換え,カーネルを再構築するといった方法を考えることでしょう。確かに,カーネルにはCPUやメモリー,I/O,ネットワーク,各種周辺デバイスに関する100以上の設定が,コンパイル時に用意されています。

 ただカーネルの設定を書き換えて再構築しても飛躍的に性能を向上させることは難しいといえます。一般のLinuxディストリビューションに含まれるカーネルは,デスクトップやサーバーなどのさまざまな環境で最適に動作するように構築されているからです。

 実はカーネルを再構築するのではなく,カーネルの起動時や動作中にコマンドを与えたり,設定ファイルを書き換えたりすることで,性能を高められるのです。そこで,本Partでは,CPU(プロセス)とI/O,メモリー,ネットワークという順に,再構築せずにできるカーネル・チューニング・テクニックを紹介していきます。

 なお,今回紹介する方法には,カーネルを最適に動作させるために,アプリケーション・プログラムのソース・コードに関数を追加するというものもあります。カーネル側の設定を直接変えるわけではありませんが,カーネルの動作を最適化させるための手段という意味では,カーネル・チューニングに当たります。アプリケーションのソース・コードに関数を追加することに慣れていない人はまず,コマンドやファイルによりパラメータを書き換える方法からチャレンジしてみてください。

スケジューラを制御,プロセスを自在に実行

 アプリケーションは,Linuxカーネル内では「プロセス」という単位で処理されます。LinuxはマルチタスクOSであり,複数のアプリケーション(プロセス)を同時に実行する仕組みを備えています。複数のプロセスをどのような順序で,どのように実行するのかを決定している仕組みが「スケジューラ」です。

カーネル2.6のスケジューラの仕組み

 カーネル2.6は,優先度を用いてプロセスを時分割で実行する「O(1)スケジューラ(Order One Scheduler)」を採用しています。ここで簡単に動作を説明しておきましょう。

 O(1)スケジューラには,実行待ちのプロセスを管理するラン・キュー(実行キュー)がCPUごとに用意されています(図1)。各ラン・キュー内には,2種類の優先度付き配列(キュー)があります。「activeキュー」と「expiredキュー」です。activeキュー,expiredキューは共に,140(0.139)レベルの優先度に分かれており,優先度別に複数のプロセスを登録できます。

図1●O(1)スケジューラ概念図
図1●O(1)スケジューラ概念図
実行待ちのプロセスを管理するラン・キュー(実行キュー)がCPUごとに用意されている。
[画像のクリックで拡大表示]

 activeキューには実行可能なプロセスが登録されます。activeキューに登録されたプロセスは,優先度が高い順に次々と実行されます。

 CPUが割り当てられてプロセスが実行できる時間を「クォンタム」(またはタイム・スライス)と呼び,プロセスごとに定義します。各プロセスはクォンタムで定義された時間だけ実行されます。クォンタム内に処理が終了しなかったプロセスは再度優先度が計算され,expiredキューに登録されます。

 activeキュー内のプロセスがすべて実行されたら,expiredキューとactiveキューを切り替えます。expiredキューがactiveキューになり,activeキュー内のプロセスがクォンタムで定義された時間だけ実行されます。これを繰り返します。

 O(1)スケジューラはこのように動作します。その動作を決める方法としてO(1)スケジューラでは,優先度によるスケジューリングを実施しています。すなわち,プロセスの優先度をうまく制御できれば,特定のアプリケーションだけを早く処理させたり,逆に他のアプリケーションよりも処理を後回しにすることができるわけです。