ロードアベレージって何よ?

連載一覧 : あらためて負荷を考える

ロードアベレージ(Load Average)って何よ?

ざっくり言うと CPU は処理をどれだけ待たせているか。という割合を示した値で 1 分、5 分、15 分の間隔で計算をしています。これは負荷の指標の一つとなるものです。 以降 Load Average と記載します。

少し深掘りしてみる

OS の頭脳、本体と言えるのは kernel ですが、kernel からプロセスを見たとき プロセスをタスクとして扱います。タスクはいくつかのステータスがあります。 代表的なものを見ていきましょう。

名前 意味 計上
TASK_RUNNING 実行中・実行待ち Yes
TASK_INTERRUPTIBLE 割り込み待ち No
TASK_UNINTERRUPTIBLE 割り込み禁止待ち Yes

この辺りは sched.h で定義されていますね。 ※今回は RHEL7.5 のカーネル (3.10.0-693.35.1.el7) を見ていきます。

#define TASK_RUNNING        0
#define TASK_INTERRUPTIBLE  1
#define TASK_UNINTERRUPTIBLE    2

RUNNING は文字通り実行中(キューに入ってるもの含む) UNINTERRUPTIBLE は処理を割り込むことが出来ない待ち状態です。 1号の先輩達は割禁とよくおっしゃってました😀

大抵は I/O 中のタスクをさしています。大抵ではない場合…あまり考えたくないですが、 よろしくない事態になっていることが往往にしてあったりします。

Load Average はこれらのステータスのうち * アクティブ * とされるタスクを計上しています。 つまり RUNNING と、UNINTERRUPTIBLE ステータスのタスクです。 これは calcloadfold_active でカウントアップされていることが見て取れます。

static long calc_load_fold_active(struct rq *this_rq)
{
     long nr_active, delta = 0;
 
     nr_active = this_rq->nr_running;
     nr_active += (long) this_rq->nr_uninterruptible;
 

どうやって確認する?

たぶんこのコンテンツを見ている人は余裕だと思いますが念のため。 各コマンドは大抵 kernel が生成する /proc/loadavg の値を取ってきて 読みやすいようにパースしているだけですね。このファイルの詳細については man ページ proc(5) を見てみるといいと思います。

結構色々なコマンドで値を取ってきているので
好きなものでとればいいんじゃあないかな。

$ top -n 1 
$ uptime

えぇい面倒だ自分でパースするんだという剛毅な人は
/proc/loadavg を見てしまおう

$ cat /proc/loadavg
0.95 2.06 2.82 1/580 12943

どれぐらいの値だったらいいの?

ごめんなさい。はっきりとした値で提示することは出来ません。

ご担当されているサーバの役割やシステム全体の構成とサーバの構成(特にCPUコア数)に よって返答がだいぶかわってきます。

業務で使用されている人で、このあたりの情報がわからない方は システムを構築したときに設計書が残っていると思うので確認されることを 強くお勧めします。

かつては、低ければ低いだけよし。で済んでいた時代もあったと思いますが 昨今はどれだけ効率的に働かせているかが問われることが多いので そのサーバにふさわしいワークロードを指標にするかたちになるのでしょう。

90年代後半レベルなら、ざっくりとした値まで言えたものなんですがね😀


こぼればなし

詳細は何もお答えしません。お察しください。

1号が見た凄まじい値を叩き出した環境

管理する側の視点では Load Average は低ければいいと相場は 決まっていそうなものですが、開発者が気にしていなかったパターンです。

そのサーバは、Load Average がざっくり 10000 はありました。 spinlock をはじめとしてかなりループを多用していたようでした。 とにかくサービスインがなによりも優先される状況で多少不恰好な 実装でも構うものかと突き進んでいたのを覚えています。

当時のディレクター氏は、10000 あっても普段もそうなら問題ないだろう 読み替えて対応しなさい(意訳)とおっしゃってましたっけw


連載一覧 : あらためて負荷を考える