monoの開発ブログ

負荷の指標としてのロードアベレージ

外部からの要求に応じて処理を行う計算機では、負荷が高まると応答が滞る可能性があるため、ある程度の余裕を持たせておく必要があります。その際に負荷を判断する指標の一つに、ロードアベレージがあります。

ロードアベレージは、Linuxでは過去1分、5分、15分の間の実行待ち (RUNNINGまたはUNINTERRUPTIBLE) 状態のプロセス数の平均値を示す値です。ロードアベレージをCPUのコア数で割った値が1を超える場合、すべてのCPUコアでプロセスを実行したとしても実行しきれないだけの実行待ちプロセスが積み上がっていると言えるため、一般に1コアあたりのロードアベレージが1を超えるかどうかで計算機の負荷を判断します。

しかし、ロードアベレージの実体はあくまで実行待ち状態で積み上がったプロセスの数に過ぎないため、必ずしもすべての状況でシステムの応答との関係性があるとは限りません。

例えば、このブログを始めとする私のサイト群を動かしているサーバでは、クローラやバックアップなどの処理時間の制約のない処理を実行するプロセスの優先度を下げることで、ユーザからの要求に対する処理を優先的に実行できるようにしています。このように、cgroupsで利用可能なCPU時間を制限したり、nice値を操作してプロセスの優先度を下げたりすると、その他のプロセスが優先的に実行されるようになります。これにより、実質的に応答速度は改善が見込めますが、先程述べたように、ロードアベレージはプロセスの数であるため、cgroupsやnice値などのプロセスに対する設定は反映されません。しかも、CPU時間を制限したプロセスの性能が低下するために、同じ処理であれば実行状態で留まる時間が長くなり、ロードアベレージは減少するどころか通常より高い状態が長時間継続します。

もちろん、優先度を下げていても負荷が掛かるのは確かです。しかし、仮にロードアベレージが同じ値になったとして、それがすべて外部からの要求に応答するプロセスによるものなのか、優先度の低い処理を含むものなのかでは、深刻さが違います。

とまぁ、問題提起のようなことをしたわけですが、私はこの問題に対する答えを持ち合わせていないので、これ以上言えることはありません。あしからず。今回挙げた状況も含めて対応可能な応答性能の指標があれば (あるいは今あるパラメータから導出できれば、しかも簡単に得られれば) よいのですが……。最終的には人間が総合的に判断するにしても、その前段階のアラートを投げる条件設定が難しいところです。