「何とかstat」というコマンドがたくさんあります。よく使うものの基本的な使用方法をまとめます。
システムが認識する各デバイスのI/Oの使用状況を調査するコマンドです。補足情報としてCPUの使用状況「%user, %system, %iowait, %idle」も合わせて出力されます。それらの意味についてはこちらのページを参考にしてみてください。
5秒毎に表示
$ iostat 5
5秒毎に10回表示
$ iostat 5 10
通常は "-x" (extended) オプションを付与して、出力内容を詳細なものにしたほうがよいです。"-x" を付与しない場合に出力される項目「tps, Blk_read/s, Blk_wrtn/s, Blk_read, Blk_wrtn」についてはこちらのページを参考にしてみてください。
$ iostat -x 5 10
"read request per second" の意味で、一秒間あたりの読み込みリクエスト数です。
"write request per second" の意味で、一秒間あたりの書き込みリクエスト数です。
"average request size" の意味で、読み書きリクエストあたりの平均セクタ数です。セクタは記憶装置がデータを記録する際の最小単位で、512バイトだったり2048バイトだったりします。
"average queue size" の意味で、処理待ち状態にある読み書きリクエストの平均個数です。
"average wait" の意味で、「待ちおよび処理」にかかった時間の平均値です。単位はミリセカンド。
"utilization" の意味で、I/OデバイスがCPUによって使用されていた時間の割合です。
EBS などをマウントしていると Device が複数表示されます。
$ iostat -x
Linux 3.14.35-28.38.amzn1.x86_64 (yourhostname) 2015年05月26日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.24 0.00 0.03 0.01 0.02 99.69
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.33 0.03 0.42 0.97 7.04 18.00 0.00 0.63 0.30 0.01
xvdf 0.00 0.05 0.00 0.00 0.00 0.78 216.17 0.00 93.69 1.81 0.00
%util はデバイス毎に考える概念です。例えば /data にマウントした xvdf の disk utilization が限界の 100% に仮になったとしても OS が使用する root ボリューム xvda とは関係がないため OS に迷惑がかかることはありません。CPU の iowait が高いことが判明したら、具体的にどのデバイスの %util が高くなっているのかを調査するようにしましょう。
"virtual memory statics" の意味で、仮想メモリの使用状況を調査するコマンドです。補足情報として「プロセス、I/O、CPUなど」の情報も出力されます。
1秒間隔で10回表示
$ vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 324200 39216 69748 0 0 1 1 9 12 0 0 100 0 0
...
物理的なメモリの容量が不足してくると、OSはスワップという機能を用いてハードディスク上に仮想メモリ領域 (スワップ領域) を確保します。参照される頻度が高くなれば物理メモリに読み出し (スワップイン) たり、あまり参照されない物理メモリ上のデータをスワップ領域に書き出し (スワップアウト) たりします。
以下のコマンドが基本です。詳しくは "man pidstat" を参照してください。
CPU使用状況を表示
$ pidstat
I/Oデバイス使用状況を表示
$ pidstat -d
1秒間隔で10回、PIDを指定して表示
$ pidstat -d -p 1091 1 10
iostat, vmstatなどを統合したようなPython製のコマンドです。他のstatファミリーと異なり、dstatはsysstatパッケージに含まれていません。例えば以下のようにしてインストールする必要があります。
$ yum install dstat
一時間分を1秒毎にCSVファイルに出力
$ dstat --output file.csv 1 3600
基本は以下のオプションの組み合わせです。プラグインを導入すると例えばmysqlの統計情報も取得できます。詳細は "man dstat" を参照してみてください。
"-t" で現在時刻、"-T" でUNIX時間を出力します。
$ dstat -tT
----system---- --epoch---
date/time | epoch
26-10 22:06:54|1414328815
$ dstat -c
----total-cpu-usage----
usr sys idl wai hiq siq
0 0 100 0 0 0
$ dstat -d
-dsk/total-
read writ
1628B 909B
dstat -g
---paging--
in out
0 0
$ dstat -l
---load-avg---
1m 5m 15m
0 0 0
$ dstat -m
------memory-usage-----
used buff cach free
79.9M 41.6M 188M 190M
$ dstat -n
-net/total-
recv send
60B 202B
$ dstat -r
--io/total-
read writ
0.08 0.14
$ dstat -y
---system--
int csw
10 12
他のユーザのプロセス情報を参照するため、権限が不足している場合は "sudo" を付与して実行するとよいです。
以下のようにすることでルーティングテーブルを表示できます。これは、こちらのページで記述したように /sbin/ip route で代用することが推奨されています。
$ netstat -r
以下のようにすることでソケットの使用状況を表示できます。オプション "-p" でプロセス情報を閲覧する権限が必要になるため sudo を付与しておくとよいです。macOS の場合などは lsof が便利です。
$ sudo netstat -atup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:mysql *:* LISTEN 1092/mysqld
tcp 0 0 *:ssh *:* LISTEN 954/sshd
tcp 0 0 localhost:smtp *:* LISTEN 1184/master
tcp 0 52 192.168.56.10:ssh 192.168.56.1:52138 ESTABLISHED 1238/sshd
tcp 0 0 *:http *:* LISTEN 1194/httpd
tcp 0 0 *:ssh *:* LISTEN 954/sshd
tcp 0 0 localhost:smtp *:* LISTEN 1184/master
udp 0 0 *:bootpc *:* 785/dhclient
サーバ接続がうまくいかない場合、ポートが本当に開いているかをサーバ側で調査する際に
$ sudo netstat -lptn
は有用です。ちなみに、クライアント側で調査するためには
$ telnet 192.168.33.101 3306
などとします。通常 3306 は mysqld のポートです。
"man netstat" によると将来的には ss というコマンドに置き換えられていく予定とのことです。
netstat: This program is obsolete. Replacement for netstat is ss.