Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

ロードアベレージの基本:システム負荷の仕組みと適切な値の判断方法

topuptimew などのコマンドや AppSignal のホストメトリクスには、「ロードアベレージ(負荷平均)」という指標が表示されます。この指標を見ることで、複数の時間枠にわたって平均化されたシステムの負荷状況を把握できます。

$ uptime
10:14:14 up 60 days, 17:42,  1 user,  load average: 0.44, 0.28, 0.25

ロードアベレージは、上記の uptime の出力例のように、通常 3 つの数値として表示されます。末尾の 3 つの数字は、それぞれ直近 1 分間の平均(0.44)、直近 5 分間の平均(0.28)、直近 15 分間の平均(0.25)を表しています。

AppSignal では、過去 8 時間以内のロードアベレージを分単位で、それより長い期間については時間単位で確認できます。

システム負荷とは何か

ロードアベレージが何を示しているのか(そしていつ警戒すべきなのか)を理解するには、まず「システム負荷」の意味と、その算出方法を押さえておく必要があります。

システムの負荷とは、端的に言えば「ある時点でアクティブになっているプロセスの数」です。アイドル状態であれば負荷は 0 です。プロセスが起動すると負荷は 1 増え、プロセスが終了すると 1 減ります。実行中のプロセスだけでなく、実行待ちでキューに入っているプロセスもカウント対象です。つまり、1 つのプロセスが CPU を実際に使用しており、さらに 2 つのプロセスが順番待ちをしている場合、負荷は 3 になります。

短命なプロセスの影響で負荷は頻繁に変動し、ミリ秒単位で 0 から 5 に跳ね上がり、次の瞬間には元に戻ることもあります。こうした変動の激しさがあるため、ある程度の期間で平均した負荷を確認する方が、システムが受けてきた負荷の全体像をより正確に把握できるのです。

ロードアベレージの読み方の基礎

システム負荷の仕組みがわかったところで、次はロードアベレージを見ていきましょう。前述のとおり、システムの負荷は通常、時間平均の形で表示されます。

一般的に、シングルコアの CPU が同時に処理できるプロセスは 1 つです。ロードアベレージが 1.0 であれば、1 つのコアが常に 100% 使用されていることを意味します。逆に 0.5 まで下がれば、CPU は時間の半分がアイドル状態だったことになります。

一方、ロードアベレージが 1.5 に上昇した場合は、CPU は常時稼働していたうえで、平均的に 50% の時間にもう 1 つのプロセスが処理待ちをしていたことになり、CPU の処理能力を超える仕事が与えられている状態です。

論理プロセッサ数との関係

経験則として、「ロードアベレージはマシンが持つプロセッサの数を超えないようにする」というのが目安になります。プロセッサが 4 つ搭載されたマシンであれば、負荷はおおむね 4.0 未満に収まるのが理想です。

ここで注意したいのは、これが CPU 上の物理的なコアではなく「論理プロセッサ」の数に基づく話だという点です。ハイパースレッディングのようなソフトウェア抽象化によって、論理プロセッサ(処理スレッド)の数は物理コアの数よりも多くなることがあります。

Linux で論理プロセッサ数を確認するには、/proc/cpuinfo に列挙されるプロセッサの行数を数えます。grep processor /proc/cpuinfo | wc -l を実行すれば、プロセッサの行数を自動的にカウントして表示してくれます。

macOS の場合は、sysctl -n hw.ncpu を使えば sysctl から直接論理プロセッサ数を取得できます。

論理プロセッサを複数持つシステムでは、同時に実行できるプロセスが増えるため、ロードアベレージがより高くなっても問題ありません。たとえば CPU コアを 2 つ搭載したマシンでロードアベレージが 2.0 であれば、両方の CPU が 100% 使用され、平均して 2 つのプロセスが動作していたことになります。

👋 Ruby(on Rails)のパフォーマンスに関するその他の記事は、Ruby パフォーマンス監視チェックリストでもご覧いただけます。

ロードアベレージから問題を読み取る

ロードアベレージはプロセス数の絶対値の平均であるため、「どのくらいなら正常で、どのくらいから危険なのか」を判断するのは難しく感じられるかもしれません。基本的には、各 CPU コアが同時に 1 プロセスずつ処理できることを踏まえると、論理プロセッサあたり 1.0 を超えない限り、システムは過負荷状態ではありません。ハイパースレッディングなしのデュアルコアシステムであれば、その基準は 2.0 です。

通常、直近 1 分間の平均がコアあたり 1.0 をわずかに超えていても大きな問題はありません。しかし、5 分平均や 15 分平均が高水準で推移している場合は、何らかの問題が発生している兆候と捉えるべきです。

TIP: AppSignal の異常検知機能を使えば、ロードアベレージが一定の値を一定時間超え続けた場合にアラートを受け取れます。ウォームアップ設定を活用すれば、たとえば「負荷が 15 分間 1.5 を超え続けたら通知する」といった運用も可能です。

この記事でロードアベレージに関する疑問は解消されましたか?まだ不明な点がある場合は、@AppSignal まで遠慮なくお知らせください。記事の感想や、今後取り上げてほしいテーマについてのご要望もぜひお聞かせください。

  1. Rubyで学ぶ挿入ソート:仕組みから計算量まで徹底解説

    ※本記事は、Rubyでさまざまなソートアルゴリズムを実装するシリーズの第4回です。第1回ではバブルソート、第2回では選択ソート、第3回ではマージソートを取り上げました。データのソート手法をさまざまな角度から探っていくシリーズもいよいよ折り返し地点。今回は挿入ソート(Insertion Sort)に焦点を当てます。挿入ソートには魅力的な特徴がたくさんあります。まず、挿入ソートは安定(stable)なアルゴリズムです。つまり、同じキーを持つ要素同士の相対的な順序が入れ替わることがありません。また、インプレース(in-place)アルゴリズムでもあるため、ソート結果を保存するための新しい配列を作成す

  2. Linuxのシェル初期化ファイルとユーザープロファイルを徹底解説

    Linuxはマルチユーザー・タイムシェアリング方式のOSであり、複数のユーザーが同時に1台のシステムへログインして利用できます。そのため、システム管理者は、ソフトウェアのインストール・更新・削除、ユーザーが実行できるプログラム、閲覧・編集できるファイルなど、ユーザーごとの操作範囲を管理する役割を担っています。 Linuxでは、ユーザー環境の構築や維持を「システム全体(グローバル)」と「ユーザー固有(個人)」という2つの方法で行えます。通常、Linuxシステムを操作する基本手段はシェルであり、シェルはユーザーのログイン成功後に初期化処理として特定のファイルを読み込み、それに基づいて環境を構築しま