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

システム負荷をマスターしよう:負荷平均(ロードアベレージ)の読み方と解釈の基本

2024年2月25日:例のスクリーンショットと古いリンクを更新しました。

アプリケーションを安定して動作させ続けるためには、システムの負荷を監視することが欠かせません。AppSignalのホストメトリクスでは、複数の時間枠におけるシステムの負荷状況を示す「負荷平均(ロードアベレージ)」を確認できます。また、topuptimewといったコマンドでも同じ指標をチェックできます。

では、「負荷平均」とは具体的に何を意味し、その数値はどう解釈すればよいのでしょうか?この記事では、システム負荷の仕組みから負荷平均の読み方、そして効果的な監視方法までをわかりやすく解説します。

負荷平均とは?

負荷平均は、通常3つの数字として表示されます。たとえばuptimeの出力では、末尾の3つの数字がそれぞれ直近1分間(0.44)、直近5分間(0.28)、直近15分間(0.25)の平均負荷を表しています。

システム負荷をマスターしよう:負荷平均(ロードアベレージ)の読み方と解釈の基本

AppSignalでは、過去12時間分の負荷平均が1分単位で、それより長い期間は1時間単位で表示されます。Time Detective機能で任意の時点を詳しく調査したり、ホストメトリクスダッシュボードで複数のホストをリアルタイムに比較したりすることも可能です。

システム負荷とは

負荷平均が何を教えてくれるのか(そしていつ警戒すべきなのか)を理解するには、まず「システム負荷」の意味と測定方法を知る必要があります。

システム負荷とは、端的に言えば「ある時点でアクティブなプロセスの数」です。

  • アイドル状態(何も動いていない)なら、負荷は0
  • プロセスが1つ開始すると、負荷は1増加
  • プロセスが完了すると、負荷は1減少

さらに、CPU時間を待っているプロセスも負荷に含まれます。つまり、1つのプロセスがCPUを使用中で、他に2つのプロセスが待ち行列に入っている場合、負荷は3になります。

ただし、短命なプロセスの影響で負荷は頻繁に変動します。数ミリ秒のうちに0から5へ跳ね上がり、すぐに元に戻ることもあります。そこで役立つのが一定期間の平均値です。時間平均を見ることで、システムがどれほど忙しかったのかをより正確に把握できます。

負荷平均の基本的な考え方

システム負荷の数え方がわかったところで、次は負荷平均を見てみましょう。前述のとおり、システムにかかっている負荷は通常、一定期間の平均値として表示されます。

一般的に、シングルコアのCPUが同時に処理できるプロセスは1つです。負荷平均が1.0ということは、そのコアが100%の時間稼働していたことを意味します。逆に負荷平均が0.5まで下がれば、CPUは全体の50%の時間アイドル状態だったことになります。

一方、負荷平均が1.5に上昇した場合はどうでしょうか?これは、CPUが常に忙しい状態であり、そのうえ平均して50%の時間、もう1つのプロセスが実行を待っていたことを示します。つまり、CPUに処理能力以上の仕事が与えられている状態です。

論理プロセッサを意識する

経験則として、「負荷平均はマシンのプロセッサ数を超えてはならない」と覚えておくとよいでしょう。たとえばプロセッサが4つ搭載されたマシンであれば、負荷はおおむね4.0未満に収まるはずです。

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

Linuxで論理プロセッサの数を確認するには、/proc/cpuinfoに列挙されているプロセッサの行数を数えるか、次のコマンドを使います。

grep -c "processor" /proc/cpuinfo

このコマンドはプロセッサの行数を自動的に出力します。macOSの場合は、sysctlで直接問い合わせられます。

sysctl -n hw.ncpu

論理プロセッサが複数あるシステムでは、同時に実行できるプロセスが増えるため、負荷平均はより高くなり得ます。たとえばCPUコアが2つのマシンで負荷平均が2.0なら、両方のCPUが100%使用され、平均して2つのプロセスがアクティブだったことを意味します。

👋 Ruby(Rails)アプリケーションのパフォーマンスに関する記事は、Rubyパフォーマンス監視チェックリストにもまとめていますので、ぜひご覧ください。

負荷平均の正しい解釈

負荷平均はプロセス数の絶対値の平均であるため、「どのくらいなら適正で、どこからが危険なのか」を判断するのは一見難しそうに思えます。しかし基本原則はシンプルです。各CPUコアは一度に1つのプロセスを処理できるため、論理プロセッサあたりの負荷が1.0を超えない限り、システムは過負荷ではありません。ハイパースレッディング非対応のデュアルコアシステムなら、基準は2.0となります。

一般的には、直近1分間の負荷平均がコアあたり1.0を一時的に上回る程度であれば問題ありません。ただし、5分平均や15分平均が高い水準で推移している場合は、何らかの問題が起きているサインかもしれません。

AppSignalでホストを監視しよう

負荷平均を正しく理解することは、アプリケーションの健全性を保つ鍵となります。エラー追跡(Error Tracking)、異常検知(Anomaly Detection)、ログ管理(Log Management)などの機能を備えたAppSignalなら、問題が深刻化する前に気づくことができます。

強力なインサイトとスマートなアラートでアプリを監視しませんか?30日間の無料トライアルを実施中です。クレジットカードは不要です。

ご質問やフィードバックがあれば、ぜひお聞かせください。監視に関するご相談には専門チームがお答えします!

  1. RubyでAWS Lambda関数を構築・テスト・デプロイする完全ガイド

    ソフトウェア開発は決して簡単ではありませんが、それ以上に大変なのが保守運用です。保守にはソフトウェアのパッチ適用やサーバーの管理が含まれます。この記事では、その中でも特にサーバー管理と運用に焦点を当てて解説します。 従来、サーバーはオンプレミス環境に設置され、物理ハードウェアの購入と維持管理が必要でした。しかしクラウドコンピューティングの登場により、物理的なサーバーを所有する必要はなくなりました。2006年、AmazonがAWSを開始しEC2サービスを発表したことで、現代のクラウドコンピューティングの時代が幕を開けました。この種のサービスにより、物理サーバーの管理やハードウェアのアップグレード

  2. Rubyで学ぶ実用数学:モジュロ演算子、進数変換、ビットマスクの基礎

    優れたプログラマーになるためには、数学の知識が必要なのでしょうか? 答えは「場合によります」。 もし日々CRUDアプリの作成だけを行うのであれば、数学の知識はほとんど必要ないかもしれません。しかし、もっと面白いことに挑戦したい方——例えばコーディングチャレンジに取り組んだり、プログラミング面接に備えたりしたい方にとっては、いくつかの基本的な概念を身につけておくことが大きな助けになります。 この記事で学べる内容: モジュロ演算子(%) 記数法(数体系) ビットマスキング これらの概念をRubyでどう活用するかを解説する、実践的なガイドです。それでは始めましょう! Rubyのモジュロ演算子(%