[ Linux ] sysstat でサーバの稼働状況を把握する

数年前に書いたエントリーをちょっとアップデートしておこう、ということで。

サーバの稼働状況を把握するためのツールとしては、mrtg とか、 munin とか使えば、グラフィカルに状態がわかるんだけど、状況によっては「その時、どういう状態だったのかの数値が欲しい」ということや、検証だけのために munin のセットアップする手間までかけられない、という場合もあったりするので、そういうときは sysstat いうパッケージをインストールして使うという手があったりします。

Linuxであれば"sar"というコマンドを使えば、比較的簡単にCPU利用率やLoadAverageのデータを取得できるので、それを使うのがいいと思うし、自分でもそれを使ってデータ取りしていることがほとんど。

[From Webサーバのパフォーマンスを測る : sar - Soukaku's HENA-CHOKO Blog]

sysstat 自体はパッケージ名で、インストールするによって、いくつかのコマンドとシステムの稼働情報を一定間隔で取得するための設定類などがインストールされます。

インストール自体は、非常に簡単。
Debian だったら

aptitude install sysstat

CentOSでも

yum install sysstat

でインストールは完了します。

以下の細かい説明は、Debian GNU/Linux の unstable 上でのお話。他のディストリビューションとの違いがある場合は、適宜読み替えを…。


/usr/bin/sar

リアルタイムで特定のリソースの状態を見たり、過去に取得した稼働状況データを参照したりするコマンドで、sysstat パッケージでは最も使うと思われるコマンドです。
-h オプションを付けて実行してみると、主要オプションの意味が表示されます。もっと細かいのは、 "man sar" で確認してください。

nexus01:~# sar -h
使い方: sar [ オプション ] [ <間隔> [ <回数> ] ]
主要なオプションとその結果:
	-B	ページングの状態
	-b	I/O と転送率の状況
	-d	Block devices statistics
	-F	Filesystems statistics
	-H	Hugepage の利用状況
	-I { <int> | SUM | ALL | XALL }
		割り込み状況
	-m { <キーワード> [,...] | ALL }
		電源管理状態の
		キーワード:
		CPU	CPU 周波数
		FAN	ファン回転数
		FREQ	CPU の平均周波数
		IN	入力電圧
		TEMP	デバイス温度
		USB	システムに挿入されている USB デバイス
	-n { <キーワード> [,...] | ALL }
		ネットワークの状態
		キーワード一覧:
		DEV	ネットワークインターフェイス
		EDEV	ネットワークインターフェイス (エラー)
		NFS	NFS クライアント
		NFSD	NFS サーバ
		SOCK	ソケット	(v4)
		IP	IP トラフィック	(v4)
		EIP	IP トラフィック	(v4) (エラー)
		ICMP	ICMP トラフィック	(v4)
		EICMP	ICMP トラフィック	(v4) (エラー)
		TCP	TCP トラフィック	(v4)
		ETCP	TCP トラフィック	(v4) (エラー)
		UDP	UDP トラフィック	(v4)
		SOCK6	Sockets	(v6)
		IP6	IP トラフィック	(v6)
		EIP6	IP トラフィック	(v6) (エラー)
		ICMP6	ICMP トラフィック	(v6)
		EICMP6	ICMP トラフィック	(v6) (エラー)
		UDP6	UDP トラフィック	(v6)
	-q	Qキューの長さとロードアベレージの状態
	-R	メモリの状況
	-r	メモリ利用率の状態
	-S	スワップ領域の利用状況
	-u [ ALL ]
		CPU 利用の利用状況
	-v	Kernel tables statistics
	-W	スワップの状態
	-w	タスクの作成とシステムスイッチの状態
	-y	TTY devices statistics

引数なしで実行すると、当日の取得済みの稼働情報データの中から、全てのCPU利用率を表示します。(-u オプション付けて実行したのと同じ。)

nexus01:~# sar
Linux 3.12-1-amd64 (nexus01) 	2014年04月06日 	_x86_64_	(4 CPU)
00時00分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
00時05分01秒     all      2.11     51.87      1.66      7.60      0.00     36.76
00時15分01秒     all      1.92     50.78      1.13      2.05      0.00     44.13
00時25分01秒     all      2.16     50.83      1.09      1.61      0.00     44.31
00時35分01秒     all      2.10     51.06      1.17      1.95      0.00     43.72
平均値:      all      2.07     51.03      1.20      2.69      0.00     43.01

過去の特定日( 4/2 )の特定時間帯( 7 〜 8 時 )の loadave の推移を見たい場合は、

nexus01:~# sar -q -f /var/log/sysstat/sa02 -s 07:00:00 -e 08:00:00
Linux 3.12-1-amd64 (nexus01) 	2014年04月02日 	_x86_64_	(4 CPU)
07時05分01秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
07時15分01秒         9       462      4.47      4.94      6.31         0
07時25分01秒         8       465      4.42      4.73      5.57         1
07時35分01秒        10       468      4.61      4.80      5.25         0
07時45分01秒         4       470      4.62      5.71      5.70         4
07時55分01秒         8       476      4.30      4.83      5.28         0
平均値:          8       468      4.48      5.00      5.62         1

というように、オプションを付けて実行します。
オプションは以下のとおり。

  • -q :Qキューの長さとロードアベレージの状態
  • -f :データの格納されているファイルを指定("/var/log/sysstat/sa[0-9]{2}" に、1日分毎の情報が保存されている。省略すると当日のものを表示)
  • -s :開始時刻
  • -e :終了時刻

よく見ると、結果の方が毎時 5 分台で 10 分おきの表示になっていますが、これは "/var/log/sysstat/sa[0-9]{2}" に格納するデータの取得間隔が、”/etc/cron.d/sysstat” で指定されているため。
ここの "5-55/10" の部分を "*/5" と書き換えれば、5 分おきの取得に変更する、といったことも出来ます。個人的な経験からいけば、特にトラブルが発生していないけど定常的にデータだけは取得しておきたい、という用途なら、最短で 5 分おきで取得したデータが有れば十分かなぁ、というところでしょうか。

nexus01:~# more /etc/cron.d/sysstat
# The first element of the path is a directory where the debian-sa1
# script is located
# Activity reports every 10 minutes everyday
5-55/10 * * * * root command -v debian-sa1 > /dev/null && debian-sa1 1 1
# Additional run at 23:59 to rotate the statistics file
59 23 * * * root command -v debian-sa1 > /dev/null && debian-sa1 60 2

/usr/lib/sysstat/sadc

こちらは、データだけを取得するためのコマンドで、一時的にデータを取りたい、といった場合はこちらのほうが使いやすいでしょう。sadc で取得したデータを sar で見る、という流れ。
こちらも -h オプション付きで実行すると、使えるオプションが表示されます。(詳細は勿論、 "man sadc" )

nexus01:~# /usr/lib/sysstat/sadc -h
使い方: /usr/lib/sysstat/sadc [ オプション ] [ <間隔> [ <回数> ] ] [ <出力ファイル> ]
利用可能なオプション:[ -C <コメント> ] [ -F ] [ -L ] [ -V ]
[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]

実際に使ってみると、こんな感じ。
実行例は "-S IPV6" を付けて、5 秒間隔で 5 回取得し、結果を "test-IPV6.dat" に格納。見るときは、 "sar" 実行時に -n オプションで "IP6" と -f オプションでデータを格納している "test-IPV6.dat" を指定する、という流れ。

nexus01:~# /usr/lib/sysstat/sadc -S IPV6 5 5 test-IPV6.dat
nexus01:~# sar -n IP6 -f test-IPV6.dat
Linux 3.12-1-amd64 (nexus01) 	2014年04月06日 	_x86_64_	(4 CPU)
17時31分51秒   irec6/s fwddgm6/s   idel6/s    orq6/s  asmrq6/s  asmok6/s imcpck6/s omcpck6/s fragok6/s fragcr6/s
17時31分56秒      4.40      0.00      4.40      4.20      0.00      0.00      0.00      0.00      0.00      0.00
17時32分01秒      4.40      0.00      4.40      4.00      0.00      0.00      0.00      0.00      0.00      0.00
17時32分06秒     13.00      0.40     12.60     14.80      0.00      0.00      0.00      0.00      0.00      0.00
17時32分11秒      4.60      0.00      4.60      4.80      0.00      0.00      0.00      0.00      0.00      0.00
平均値:       6.60      0.10      6.50      6.95      0.00      0.00      0.00      0.00      0.00      0.00

実際に取れるデータは、指定した回数マイナス1になるので、回数指定でデータ取りしたいときは、注意しましょう。まぁ、パフォーマンス試験などでデータ取りたいときは、間隔だけを指定して回数無しでファイルにデータを格納するようにしたほうがよいでしょう。
あと -S オプションで取れるデータの一部は、デフォルトの設定のままだと取得されておらず、 "/var/log/sysstat/sa[0-9]{2}" を参照しても出てこないという状態になります。

nexus01:~# sar -n IP6
要求された動作情報はファイル /var/log/sysstat/sa06 内にはありません

なので、普段から全てのシステム稼働データを取得したければ、 ”/etc/sysstat/sysstat” にある "SADC_OPTIONS=" の内容を ”-S XALL” に書き換えておくとよいでしょう。(これで、取得可能なデータは全部取れる。)
勿論、取得するデータの項目が増えるので、 /var/log/sysstat/ 以下に保存されるファイルのサイズも大きくなります。


nexus01:~# more /etc/sysstat/sysstat
# sysstat configuration file. See sysstat(5) manual page.
# How long to keep log files (in days).
# Used by sa2(8) script
# If value is greater than 28, then log files are kept in
# multiple directories, one for each month.
# Compress (using gzip or bzip2) sa and sar files older than (in days):
# Parameters for the system activity data collector (see sadc(8) manual page)
# which are used for the generation of log files.
# By default contains the `-S DISK' option responsible for generating disk
# statisitcs. Use `-S XALL' to collect all available statistics.

iostat とか pidstat とか

sysstat パッケージをインストールすることで追加されるコマンドには、IO 周りの状態だけを出力する iostat や CPU 関連の状態だけを出力する mpstat 、実行しているデーモン類の状態を出力する pidsatat など、特定用途向けのものも含まれていますので、必要に応じてうまく使うと良いかと思います。
参考までに iostatpidsatat の出力結果もあげておきますね。

nexus01:~# iostat -x
Linux 3.12-1-amd64 (nexus01) 	2014年04月06日 	_x86_64_	(4 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.47   87.67    1.43    1.54    0.00    5.90
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               4.13    12.15   21.55   28.09   694.77   988.45    67.82     0.68   13.66   10.54   16.06   4.79  23.80
sdb               0.09     1.20   11.34    5.23   114.21   257.83    44.88     0.08    4.82    2.74    9.31   3.13   5.18
sdc               0.02     0.00    0.02    0.00     0.15     0.00    14.15     0.00   11.00   10.22   55.69   6.23   0.01
sdd               0.13     0.00    0.06    0.01     1.22     0.08    37.24     0.00    7.45    3.48   56.64   3.19   0.02
nexus01:~# pidstat -lrt -C zabbix_agent
Linux 3.12-1-amd64 (nexus01) 	2014年04月06日 	_x86_64_	(4 CPU)
22時33分01秒   UID      TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
22時33分01秒     0     20300         -      0.00      0.00   56676    492   0.01  /usr/sbin/zabbix_agentd
22時33分01秒     0         -     20300      0.00      0.00   56676    492   0.01  |__/usr/sbin/zabbix_agentd
22時33分01秒     0     20301         -      0.01      0.00   56676    680   0.01  /usr/sbin/zabbix_agentd: collector [idle 1 sec]
22時33分01秒     0         -     20301      0.01      0.00   56676    680   0.01  |__/usr/sbin/zabbix_agentd: collector [idle 1 sec]
22時33分01秒     0     20302         -      0.06      0.00   56676    784   0.01  /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
22時33分01秒     0         -     20302      0.06      0.00   56676    784   0.01  |__/usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
22時33分01秒     0     20303         -      0.07      0.00   56676    780   0.01  /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
22時33分01秒     0         -     20303      0.07      0.00   56676    780   0.01  |__/usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
22時33分01秒     0     20304         -      0.07      0.00   56676    784   0.01  /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
22時33分01秒     0         -     20304      0.07      0.00   56676    784   0.01  |__/usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
22時33分01秒     0     20305         -      0.00      0.00   61284   2928   0.05  /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
22時33分01秒     0         -     20305      0.00      0.00   61284   2928   0.05  |__/usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
22時33分01秒     0     20306         -      0.00      0.00   61284   3656   0.06  /usr/sbin/zabbix_agentd: active checks #2 [idle 1 sec]
22時33分01秒     0         -     20306      0.00      0.00   61284   3656   0.06  |__/usr/sbin/zabbix_agentd: active checks #2 [idle 1 sec]
22時33分01秒     0     20307         -      0.00      0.00   61284   3584   0.06  /usr/sbin/zabbix_agentd: active checks #3 [idle 1 sec]
22時33分01秒     0         -     20307      0.00      0.00   61284   3584   0.06  |__/usr/sbin/zabbix_agentd: active checks #3 [idle 1 sec]

pidstat は、うまく使うと便利、かも…。

トラックバック(0)

コメントする