OS: 優先順位と負荷分散を管理

 コンピュータ上では、複数のアプリケーションを同時に動作させることができます。これは、OS(Operating System)が備える「スケジューリング」機能が実現しています。スケジューリングは、CPUリソースの管理と割り当てをつかさどるカーネルの機能です。CPUリソースの割り当ての統計情報であるCPU使用率は、システム性能を示す代表的な指標の1つです。

 スケジューリングは、OS上で動作するプログラムに、CPUコアを割り当てます。スケジューリング機能を担うOSのモジュールを「スケジューラー」と呼びます。CPUコアの割り当てがスケジューラーによってどのように動作するのかを詳しく見てみましょう。

 プログラムが動作するとき、カーネルはプログラムをストレージから読み込んでメモリー上に配置します。こうしてコンピュータが実行可能な状態にしたものを「プロセス」と呼びます。そして、プロセスの中で実行する命令の流れを「スレッド」と呼びます。以下では、CPUのスレッドとの混同を防ぐために、プロセスとスレッドを合わせて「タスク」と表現します。

 OSのスケジューリング機能は、CPUのどのコアでタスクを動かすかを判断します。また、CPUのコア数を上回るタスクが動作しようとするときは、どのタスクを優先的に実行するかを判断してコアに割り当てます。これらの判断は、タスクに指定された優先度、各タスクのCPU割り当て実績、各コアで割り当てを待つタスクの数などに基づきます。

優先順位と負荷分散を管理
 タスクに指定された優先度は、複数のタスクが一つのコアを奪い合うとき、どのタスクを先に実行するか決めるのに用いられます。異常事態の検知など、遅れが問題となる処理は優先度を高く設定します。一方、バックグラウンドで実行するメンテナンス処理などは、優先度を低く設定します。

 CPU割り当て実績により、スケジューラーは、タスクにCPU時間を公平に割り当てます。スケジューラーはまた、複数コア間の負荷を分散し、実行するタスクがないコアを省電力モードに移行させます。

 省電力モードはコスト削減に効果のある機能ですが、レスポンス性能に厳しい要求のあるシステムでは注意が必要です。特にレベルの高い省電力モードになったCPUは、実行状態に復帰するのに時間がかかります。そのため、例えばパケットの受信に対する反応が遅くなります。

安定動作の余力があるか判断

 管理対象のシステムでCPUリソースの過不足を見るには、CPU使用率を見ます。CPU使用率の統計情報を作成するのは、CPUリソースの管理・配分を行うスケジューラーなので、ここで説明したスケジューリングの知識と合わせて、CPU使用率の見方を解説します。

 稼働中のシステムのCPU使用率を確認することで、CPUにシステムが安定して動作するのに十分な余力があるかどうかが分かります。CPU使用率が100%に近ければ、CPUに余力がないのでなんらかの増強が必要であると判断できます。逆に、CPU使用率が常に0%に近い値を示している場合は、能力過剰な状態となっている可能性があります。

 マルチスレッドに対応していない、あるいはスレッド数に上限のあるプログラムを動作させている場合、これだけでは不十分です。カーネルがマルチコアを扱えても、明示的に並列に起動されていないシングルスレッドのプログラムを複数のコアで並列に実行することはできません。

 例えば、8コアのハードウエアでシングルスレッドのシステムが動作中で、ほかのどのプログラムもCPUを大量に使わないことが分かっているケースを考えてみましょう。この場合、CPU使用率が12.5%でも、このシステムが使っている一つのコアでCPU使用率が100%近く、残りはOSなどの処理である可能性があります。このシステムは、シングルスレッドなので他のコアを使うことができません。

 したがって、これでシステムの処理時間が長い、あるいは反応が遅い場合、複数のシステムを同時に動作させるか、より速いCPUに変更する必要があります。

 CPU使用率の内訳として、カーネルを実行していた時間とプログラムおよびライブラリを実行していた時間の割合も、該当するパフォーマンスカウンターを監視することによって、知ることができます。
CPU使用率のパフォーマンスカウンター
f:id:nonbei:20180608173141j:plain

 プログラムやライブラリの比率が高い場合はプログラム、カーネルの比率が高い場合はカーネルも含めた調査が可能な解析ツールを用いて、ボトルネック箇所を特定するといった使い方をします。


ソ-ス:複数のアプリを円滑に動かせるのはOSのおかげ、優先順位と負荷分散を管理 - 新人SEのためのOS基礎:日経 xTECH Active