sarコマンドでメモリ・CPU・ネットワーク・ディスクの負荷を確認する方法
概要
今回はLinuxでサーバーの負荷状態や過去の稼働履歴を確認するコマンド「sar」の使い方について解説します。
Linuxサーバーの運用やトラブルシューティングにおいて、システムのリソース使用状況を客観的に把握することは非常に重要ですが、いつどんな負荷がかかっていたのかを後から調べるのって結構面倒ですよね…
リアルタイムの負荷だけでなく、過去の状況まで遡ってコマンドラインで簡単に確認できたらいいのにと思い調べてみたらいい感じのコマンドがありました!
本記事では、パフォーマンス監視で大活躍するコマンド「sar」を使って、CPU、メモリ、ディスク、ネットワークの負荷を「確認・特定」する方法について、具体的な手順とともにわかりやすく解説します。
それではやっていきましょう(^^b
目次
sarコマンドとは?
sar(System Activity Reporter)コマンドは、Linuxシステムのさまざまなパフォーマンス指標を一定間隔で収集、レポート、保存するための強力なツールです。
そして現在のリアルタイムな状況だけでなく、過去のデータをさかのぼって確認できる点が最大のメリットであるコマンドです!
sarコマンド(sysstatパッケージ)のインストール
sarコマンドは標準ではインストールされていないことがあるため、sysstatパッケージをインストールする必要があります。
インストール
インストールと起動については、環境によってコマンドが異なるので、お使いの環境に合わせて実行してください。
コマンド(Ubuntu/Debian系)
1 | sudo apt install sysstat |
コマンド(CentOS/RHEL系)
1 | sudo yum install sysstat |
起動
下記のコマンドでパッケージを起動します。
コマンド(サービスの有効化・起動)
1 | sudo systemctl enable sysstat |
コマンドの基本構文
sarコマンドの基本的な使い方は以下の通りです。オプションと間隔、回数を指定するだけで簡単に使えます(^^
コマンド
1 | sar [オプション] [間隔(秒)] [回数] |
たったこれだけでCPUやメモリ、ディスク、ネットワークの負荷を確認できるの?って思うかもしれませんが、
これから紹介するオプションによって様々な情報を確認することができます(^^b
1. CPUの負荷・使用状況を確認する (-u, -P)
まずはCPUの負荷・使用状況を確認するsarコマンドです。
サーバーの動作が重いと感じたとき、CPUの負荷を確認したいと思うことが多いと思います。
そういったときはsarコマンドに-uまたは-P ALLオプションを付けると、システム全体のCPU使用率を表示します。
基本構文
コマンド
1 | sar -u [間隔(秒)] [回数] |
オプション
-u- システム全体のCPU使用率を表示
- (例:単体で
-uを付与 またはオプション無し)
-P- コアごとのCPU使用率を個別に確認
- (例:
-P ALL)
実行例:1秒間隔で5回、CPU全体の負荷を確認する
CPU全体の負荷を確認したい場合は下記のように-uを付与します(^^
コマンド
1 | sar -u 1 5 |
実行例:すべてのCPUコアの負荷を個別に確認する
マルチコアCPU環境で、特定のコアのみに負荷が偏っていないかを確認するには-P ALLを使います(^^
コマンド
1 | sar -P ALL 1 3 |
重要確認ポイント
%user- ユーザーレベル(アプリケーションなど)での使用率
%system- システムレベル(カーネルなど)での使用率
%idle- CPUがアイドル状態(処理待ちで余裕がある状態)の割合。
- これが0%に近いとCPUがボトルネックになっている可能性が高いです。
2. メモリの負荷・使用状況を確認する (-r)
メモリの負荷・使用状況を確認するsarコマンドです。
システム全体の動作が急激に遅くなった時などにメモリ不足を疑うことが多いと思います。
そういったメモリの状況を確認したいときは-rオプションを使うと確認できます!
基本構文
コマンド
1 | sar -r [間隔(秒)] [回数] |
オプション
-r- メモリとスワップの使用状況を表示
- (例:単体で
-rを付与)
実行例:2秒間隔で3回、メモリの使用状況を表示する
コマンド
1 | sar -r 2 3 |
重要確認ポイント
kbmemfree- 空きメモリ量
kbmemused- 使用中のメモリ量
%memused- 物理メモリの使用率。
- ここが常に高止まりしている場合は、メモリリークの調査や物理メモリの増設を検討する必要があります。
kbbuffers/kbcached- バッファやキャッシュとして使われているメモリ量。要は空きメモリのことです。
3. ディスクI/Oの負荷を確認する (-b, -d)
ディスクI/Oの負荷を確認するsarコマンドです。
DBサーバーなどでは、ディスクの読み書き(I/O)速度がパフォーマンスのボトルネックになることが多いです。
そういったときは-bオプションでシステム全体のI/O状況を、-dオプションでデバイスごとの詳細を確認できます!
基本構文
コマンド
1 | sar -d -p [間隔(秒)] [回数] |
よく使うオプション
-b- システム全体のI/O転送レートを表示
-d- ブロックデバイス(sdaなど)ごとのI/O状況を表示
-p-dと組み合わせて使い、デバイス名を見やすく表示する
実行例:システム全体のI/O転送レートを確認する
システム全体のI/O転送レートを確認する場合は-bを付与します。
コマンド
1 | sar -b 1 3 |
実行例:デバイス別のI/Oを表示する
デバイス名別でI/Oを取得したい場合は-d -pを組み合わせます。
コマンド
1 | sar -d -p 1 3 |
重要確認ポイント
kB_rd_s/kB_wr_s- ディスクの読み書き速度
%util- ディスクの使用率
- これが100%に近いとディスクの性能限界に達している可能性が高いです。
4. ネットワークの負荷を確認する (-n)
ネットワークの負荷を確認するsarコマンドです。
ネットワーク帯域の逼迫や、不審な通信(DDoS攻撃など)の理由でネットワークの負荷を確認したとこがあると思います。
そういったときには-nオプションを使用して、インターフェースごとの通信量やTCPの状況を確認することが可能です(^^b
基本構文
コマンド
1 | sar -n [キーワード] [間隔(秒)] [回数] |
オプション
-n DEV- ネットワークインターフェース(eth0など)ごとの通信量を確認
-n TCP- TCPコネクションの統計を表示
実行例:インターフェースごとのトラフィック量を確認する
インターフェースごとにトラフィック量を取得したい場合は下記のようなコマンドを実行します。
コマンド
1 | sar -n DEV 1 3 |
重要確認ポイント
rxkB/s- 1秒あたりの受信データ量(キロバイト)
txkB/s- 1秒あたりの送信データ量(キロバイト)
%ifutil- ネットワークインターフェースの利用率。
- これが100%に近い場合、ネットワーク帯域がボトルネックになっている可能性が高いです。
おまけ(過去の履歴を確認する方法)
おまけで「問題が起きた過去の時間帯にさかのぼってコマンドで負荷状態を確認する方法」を紹介します。
「昨日の夜、サーバーへのアクセスがすごく重かった原因は何か?」を事後調査する際にとても役に立つコマンドです!
ぜひ覚えておいてください(^^b
ちなみにパフォーマンスログは通常 /var/log/sysstat/ 配下に saDD(DDは日付)というファイル名でバイナリ保存されています。
バイナリなのでそのまま読んでも内容はわかりません。
そこで特定の日付のログを読み込むにはsarコマンドに -f オプションを付与して読み込みます。
基本構文
コマンド
1 | sar [確認したい項目のオプション] -f [ログファイルのパス] -s [開始時間] -e [終了時間] |
オプション
-f- 読み込むログファイルを指定
- (例:
-f /var/log/sysstat/sa14)
-s- 開始時間を指定(Start)
- (例:
-s 10:00:00)
-e- 終了時間を指定(End)
- (例:
-e 11:00:00)
実行例:14日の10時〜11時のCPU負荷を確認する
14日の10時〜11時の間にCPU負荷がどうだったかを確認したい場合は下記のようなコマンドを実行します。
コマンド
1 | sar -u -f /var/log/sysstat/sa14 -s 10:00:00 -e 11:00:00 |
おまけ(sarコマンドの結果をファイルに出力する)
もう一つおまけでsarコマンドの結果をファイルに出力する方法について紹介します。