hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

sarコマンドの使い方



1 sarコマンドとは?

CPU使用率、メモリ/ページング、割り込み、デバイス負荷、ネットワークの使用率など、システムの統計情報の収集および表示するコマンドです。ここでは、sarコマンドを使って採取した統計情報の見方を説明します。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

CPUは4つ搭載しています。

[root@server ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

3 インストール方法

sysstatパッケージをインストールします。

[root@server ~]# yum -y install sysstat

sarコマンドの版数を確認します。

[root@server ~]# sar -V
sysstat バージョン 10.1.5
(C) Sebastien Godard (sysstat <at> orange.fr)

OS起動時、sysstatサービスが自動で起動するようにします。本記事では、sysstatサービスの起動は不要ですが、統計情報を毎日自動で採取する場合はsysstatサービスを起動してください。

[root@server ~]# systemctl enable sysstat

sysstatサービスを起動します。

[root@server ~]# systemctl start sysstat

4 事前準備

本記事では、sysstatサービスではなく、手動で統計情報を採取します。統計情報を採取するときのsarコマンドの書式は以下になります。

sar -o <ファイル名> <採取間隔(秒)> <採取回数>

ここでは、sarコマンドを2秒間隔で10回実行してみます。

[root@server ~]# sar -o sar.data 2 10
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時43分54秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
21時43分56秒     all      0.00      0.00      0.13      0.00      0.00     99.87
21時43分58秒     all      0.00      0.00      0.13      0.00      0.00     99.87
21時44分00秒     all      0.00      0.00      0.25      0.00      0.00     99.75
21時44分02秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時44分04秒     all      0.00      0.00      0.13      0.00      0.00     99.87
21時44分06秒     all      0.00      0.00      0.12      0.00      0.00     99.88
21時44分08秒     all      0.12      0.00      0.12      0.00      0.00     99.75
21時44分10秒     all      0.00      0.00      0.13      0.00      0.00     99.87
21時44分12秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時44分14秒     all      0.00      0.00      0.13      0.00      0.00     99.87
平均値:      all      0.01      0.00      0.11      0.00      0.00     99.87

採取した統計情報を確認します。

[root@server ~]# ls -l sar.data
-rw-r--r--. 1 root root 362416  4月 19 21:44 sar.data

5 CPU

4章で採取した統計情報の中身を確認してみます。

5.1 全てのCPUの統計情報を参照する方法(-P ALL)

-P ALLは全てのCPUに関する統計情報を表示するオプションです。

[root@server ~]# sar -P ALL -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時39分34秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
21時39分36秒     all      0.00      0.00      0.13      0.00      0.00     99.87
21時39分36秒       0      0.00      0.00      0.00      0.00      0.00    100.00
21時39分36秒       1      0.00      0.00      0.50      0.00      0.00     99.50
21時39分36秒       2      0.00      0.00      0.50      0.00      0.00     99.50
21時39分36秒       3      0.00      0.00      0.00      0.00      0.00    100.00

21時39分36秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
21時39分38秒     all      0.00      0.00      0.12      0.00      0.00     99.88
21時39分38秒       0      0.00      0.00      0.50      0.00      0.00     99.50
21時39分38秒       1      0.00      0.00      0.00      0.00      0.00    100.00
21時39分38秒       2      0.00      0.00      0.00      0.00      0.00    100.00
21時39分38秒       3      0.00      0.00      0.00      0.00      0.00    100.00
-snip-

5.2特定CPUの統計情報を参照する方法(-P )

-Pは指定したCPUに関する統計情報を表示するオプションです。ここでは、CPU0の統計情報を参照してみます。

[root@server ~]#  sar -P 0 -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時39分34秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
21時39分36秒       0      0.00      0.00      0.00      0.00      0.00    100.00
21時39分38秒       0      0.00      0.00      0.50      0.00      0.00     99.50
21時39分40秒       0      0.00      0.00      0.00      0.00      0.00    100.00
-snip-

6 メモリ

6.1 メモリ使用量(-r)

[root@server ~]# sar -r -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時39分34秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
21時39分36秒   3168184    693108     17.95      2076    344328    290680      7.28    257712    164100        24
21時39分38秒   3168192    693100     17.95      2076    344348    290680      7.28    257728    164124        44
21時39分40秒   3168192    693100     17.95      2076    344368    290680      7.28    257736    164136         0
-snip-

6.2 メモリページ(-R)

[root@server ~]# sar -R -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時39分34秒   frmpg/s   bufpg/s   campg/s
21時39分36秒    -34.00      0.00      3.00
21時39分38秒      1.00      0.00      2.49
21時39分40秒      0.00      0.00      2.50
-snip-

7 ディスク

-dはディスクI/Oの統計情報を表示するオプションです。

[root@server ~]# sar -d -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時39分34秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
21時39分36秒    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分36秒   dev8-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分36秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分38秒    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分38秒   dev8-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分38秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分40秒    dev8-0      0.50      0.00     64.00    128.00      0.00      0.00      0.00      0.00
21時39分40秒   dev8-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分40秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
-snip-

8 ネットワーク

ネットワークの統計情報を参照するときのsarコマンドの書式は以下になります。

sar -n <keyword> -f <ファイル名>

keywordには、以下のものがあります。
DEV, EDEV, NFS, NFSD, SOCK, IP, EIP, ICMP, EICMP, TCP, ETCP, UDP, SOCK6, IP6, EIP6, ICMP6, EICMP6 and UDP6

8.1 NICの負荷を表示する方法(DEV)

DEVはNICのzyouhを表示するキーワードです。

[root@server ~]# sar -n DEV -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時39分34秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
21時39分36秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分36秒     ens33      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分38秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分38秒     ens33      1.00      1.00      0.06      0.16      0.00      0.00      0.00
21時39分40秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分40秒     ens33      0.50      0.50      0.03      0.09      0.00      0.00      0.00
21時39分42秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分42秒     ens33      0.50      0.50      0.03      0.09      0.00      0.00      0.00
21時39分43秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分43秒     ens33      3.95      5.26      0.27      0.59      0.00      0.00      0.00
-snip-

8.2 IPパケットに関する情報を表示する方法(IP)

「IP」はIPパケットに関する情報を表示するキーワードです。

[root@server ~]# sar -n IP -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時39分34秒    irec/s  fwddgm/s    idel/s     orq/s   asmrq/s   asmok/s  fragok/s fragcrt/s
21時39分36秒      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時39分38秒      0.50      0.00      0.50      0.50      0.00      0.00      0.00      0.00
21時39分40秒      0.50      0.00      0.50      0.50      0.00      0.00      0.00      0.00
-snip-

sarが出力する項目の意味は次のとおりです。1秒間あたりの情報になります。

項目 意味
irec 受信したIPパケット数を表す。エラーで廃棄したパケット数も含む
fwddgm 宛先IPアドレスが自分自身ではないため、ルーティングしたIPパケット数を表す
idel IPパケットの到着を待っているアプリに届けられたパケット数を表す
org 送信したIPパケット数を表す
asmrq 受信したIPフラグメントのパケット数を表す
asmok 元のIPパケットに再構成したIPパケット数を表す
fragok フラグメントが必要なIPパケット数を表す
fragcrt フラグメント処理の結果、フラグメント化されたIPパケット数を表す

8.3 TCPパケットに関する情報を表示する方法(TCP)

TCP」はTCPパケットに関する情報を表示するキーワードです。

[root@server ~]# sar -n TCP -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時39分34秒  active/s passive/s    iseg/s    oseg/s
21時39分36秒      0.00      0.00      0.00      0.00
21時39分38秒      0.00      0.00      0.50      0.50
21時39分40秒      0.00      0.00      0.50      0.50
-snip-

sarが出力する項目の意味は次のとおりです。1秒間あたりの情報になります。

項目 意味
active アクティブオープンを試みた回数を表す。SYNパケットを送信してTCPコネクション確立に失敗した場合でもカウントされる
passive パッシブオープンで確立したTCPコネクション数を表す。様子がactiveのときと異なるように思う
iseg 受信したTCPパケット数を表す。プロトコル処理においてエラーと判定したTCPパケット数も含む
oseg 送信したTCPパケット数を表す。ただし、再送パケット数は除外する

9 表示時刻による絞り込み(-s,-e)

21:44:00から21:44:10までの10秒間のソケットの統計情報を参照してみます。

[root@server ~]# sar -n SOCK -s 21:44:00 -e 21:44:10 -f sar.data
Linux 3.10.0-1160.el7.x86_64 (server)   2022年04月19日  _x86_64_        (4 CPU)

21時44分00秒    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
21時44分02秒       572         4         1         0         0         0
21時44分04秒       572         4         1         0         0         0
21時44分06秒       572         4         1         0         0         0
21時44分08秒       572         4         1         0         0         0
21時44分10秒       572         4         1         0         0         0
平均値:        572         4         1         0         0         0
[root@server ~]#

10 各種実験

実際に各種負荷を発生させて、sarコマンドでどのように見えるのか確認してみます。

10.1 CPU使用率(ユーザモード)の確認

sarコマンドの実行間隔が短いとCPU使用率が実際のCPU使用率より大きく表示されてしまうので、ここでは5秒間隔で実行しました。

[root@server ~]# sar -P ALL 5

次に、stress-ngコマンドを使って、CPU0のCPU使用率を10%にしてみます。以下のパラメータを指定すると、stress-ngプロセスがrand()関数を繰り返し実行します。したがって、CPU使用率はユーザモードの使用率(%user )が増えることになります。なお、stress-ngコマンドの使い方は、stress-ngコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# stress-ng -k -c 1 -l 10 --taskset 0 -q &
[1] 1730

psコマンドを実行します。stress-ngの子プロセス(PID1731)がCPU使用率10%程度であることがわかります。また、CPU0で動作していることもわかります。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu
COMMAND            PID   PPID PSR %CPU
stress-ng         1730   1524   0  0.0
stress-ng         1731   1730   0 10.9

sarコマンドの実行結果を確認します。CPU0のCPU使用率が7.98%であることがわかります。sarコマンドの実行結果を継続して確認すると、CPU使用率が10%前後で推移していくことがわかります。

[root@server ~]# sar -P ALL 5
-snip-
10時18分29秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
10時18分34秒     all      2.00      0.00      0.15      0.00      0.00     97.85
10時18分34秒       0      7.98      0.00      0.20      0.00      0.00     91.82
10時18分34秒       1      0.00      0.00      0.00      0.00      0.00    100.00
10時18分34秒       2      0.20      0.00      0.20      0.00      0.00     99.60
10時18分34秒       3      0.00      0.00      0.00      0.00      0.00    100.00

stress-ngコマンドを終了します。

[root@server ~]# pkill stress-ng
[root@server ~]#
[1]+  終了                  stress-ng -k -c 1 -l 10 --taskset 0 -q

10.2 CPU使用率(カーネルモード)の確認

メモリの獲得/開放を繰り返す負荷を与えてみます。ここでは、stress-ngコマンドではなくstressコマンドを使ってみます。メモリの獲得/開放を繰り返すので、ユーザモードのCPU使用率(%user)だけでなく、カーネルモードのCPU使用率(%system)も上昇します。なお、stressコマンドは、stressコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# stress -m 1 -q &

psコマンドを実行します。stressの子プロセス(PID2062)がCPU2でメモリの獲得/開放を繰り返しています。親プロセスは子プロセスの終了をwaitシステムコールで待っています。do_wait関数はwaitシステムコールの延長で呼び出すカーネル関数です。

[root@server ~]# ps -C stress -o command,pid,ppid,rss,psr,wchan
COMMAND                        PID   PPID   RSS PSR WCHAN
stress -m 1 -q                2061   1524   428   0 do_wait
stress -m 1 -q                2062   2061 217216  2 -

sarコマンドの実行結果を確認します。CPU2のユーザモードのCPU使用率が6.60%、カーネルモードのCPU使用率が93.4%であることがわかります。

[root@server ~]# sar -P ALL 5
-snip-
10時51分29秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
10時51分34秒     all      1.65      0.00     23.51      0.00      0.00     74.84
10時51分34秒       0      0.00      0.00      0.20      0.00      0.00     99.80
10時51分34秒       1      0.00      0.00      0.00      0.00      0.00    100.00
10時51分34秒       2      6.60      0.00     93.40      0.00      0.00      0.00
10時51分34秒       3      0.00      0.00      0.00      0.00      0.00    100.00

11 Excelによる統計情報の可視化

メモリの獲得/開放を繰り返したときの統計情報をExcelで可視化してみます。

11.1 統計情報の作成

[root@server ~]# sar -o sar.data 2

メモリの獲得/開放の負荷をかけるプロセスを4個起動します。

[root@server ~]# stress -m 1 -q &
[1] 11947
[root@server ~]# stress -m 1 -q &
[2] 11952
[root@server ~]# stress -m 1 -q &
[3] 11969
[root@server ~]# stress -m 1 -q &
[4] 11973

採取した統計情報をテキストに変換します。

[root@server ~]# sar -r -f sar.data > mem.txt

mem.txtをエディタ(vi等)で編集します。以下は編集前のmem.txt

先頭2行を削除。その後1行目の左端をTIMEに修正(他の単語でもOK)

最後の1行(赤枠で囲まれた部分)も削除する。

11.2 Excelによる可視化

Excelで「ファイル」->「開く」より、mem.txtを開きます。

折れ線グラフを選択します。

メモリ負荷をかけたタイミングが4回あることがわかります。青丸のところ。

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ