*statコマンドの基本的な使い方
[History] [Last Modified] (2017/06/30 16:18:30)
ここは
趣味のプログラミングを楽しむための情報共有サービス。記事の一部は有料設定にして公開できます。 詳しくはこちらをクリック📝
Recent posts
Popular pages

概要

「何とかstat」というコマンドがたくさんあります。よく使うものの基本的な使用方法をまとめます。

iostat (I/Oデバイスの統計情報)

システムが認識する各デバイスの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

r/s

"read request per second" の意味で、一秒間あたりの読み込みリクエスト数です。

w/s

"write request per second" の意味で、一秒間あたりの書き込みリクエスト数です。

avgrq-sz

"average request size" の意味で、読み書きリクエストあたりの平均セクタ数です。セクタは記憶装置がデータを記録する際の最小単位で、512バイトだったり2048バイトだったりします。

avgqu-sz

"average queue size" の意味で、処理待ち状態にある読み書きリクエストの平均個数です。

await

"average wait" の意味で、「待ちおよび処理」にかかった時間の平均値です。単位はミリセカンド。

%util

"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 が高くなっているのかを調査するようにしましょう。

vmstat (仮想メモリの統計情報)

"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
...

procs

  • r: "The number of processes waiting for run time" の意味で、実行待ちプロセスの個数です。PCのCPUコア数と比較して大きくなると問題です

swap

物理的なメモリの容量が不足してくると、OSはスワップという機能を用いてハードディスク上に仮想メモリ領域 (スワップ領域) を確保します。参照される頻度が高くなれば物理メモリに読み出し (スワップイン) たり、あまり参照されない物理メモリ上のデータをスワップ領域に書き出し (スワップアウト) たりします。

  • si: "swap in" の意味で、一秒間あたりにスワップインされたメモリの容量です。単位は環境に依存します
  • so: "swap out" の意味で、一秒間あたりにスワップアウトされたメモリの容量です。単位は環境に依存します

memory

  • swpd: スワップ領域のサイズ。物理的なメモリが不足してくると大きくなります
  • free: 全く使用されておらずIDLE状態にあるメモリのサイズ
  • buff: バッファとして確保されたメモリのサイズ。OSが様々な処理をする際の緩衝領域として多目的に有効活用されます
  • cache: キャッシュとして確保されたメモリのサイズ。OSが様々な処理をする際の一時記憶領域として多目的に有効活用されます。例えば、キャッシュしておくことでディスクアクセスの回数を減らしたりします

io

  • bi: "blocks + in" の意味で、一秒間あたりにI/Oデバイスから読み出したブロック数です。ブロックについてはこちらを参照してみてください
  • bo: "blocks + out" の意味で、一秒間あたりにI/Oデバイスに書き込んだブロック数です

system

  • cs: "context switch" の意味で、一秒間あたりに発生したコンテキストスイッチの回数です。コンテキストスイッチについてはこちらを参照してみてください

cpu

  • us: "user" の意味。ユーザプロセスのCPU使用率
  • sy: "system" の意味。システムプロセスのCPU使用率
  • id: "idle" の意味。CPUが使用されていない時間の割合
  • wa: "wait" の意味。I/O待ちに使用した時間の割合

pidstat (プロセスの統計情報)

以下のコマンドが基本です。詳しくは "man pidstat" を参照してください。

CPU使用状況を表示

$ pidstat

I/Oデバイス使用状況を表示

$ pidstat -d

1秒間隔で10回、PIDを指定して表示

$ pidstat -d -p 1091 1 10

dstat (多機能な統計情報レポートツール)

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

CPU

$ dstat -c
----total-cpu-usage----
usr sys idl wai hiq siq
  0   0 100   0   0   0

ディスクI/O

$ 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

I/Oリクエスト数

$ dstat -r
--io/total-
 read  writ
0.08  0.14

コンテキストスイッチ

$ dstat -y
---system--
 int   csw
  10    12

topコマンド関連

他のユーザのプロセス情報を参照するため、権限が不足している場合は "sudo" を付与して実行するとよいです。

  • --top-cpu: CPUを最も使用しているプロセス情報を表示
  • --top-bio: I/Oとのブロックのやり取り個数が最も多いプロセス情報を表示
  • --top-io: I/Oへのリクエスト回数が最も多いプロセス情報を表示

netstat (ネットワークの状態を表示)

ルーティングテーブル

以下のようにすることでルーティングテーブルを表示できます。これは、こちらのページで記述したように /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

オプションの意味

  • -a: すべてのソケットを表示。例えば状態が "ESTABLISHED" だけでなく "LISTEN" のものも表示される
  • -tu: TCPまたはUDPのソケットのみを表示
  • -p: ソケットを使用しているプログラムの情報を表示 (システムプロセスの情報を表示するためにはroot権限が必要)
  • -n: 文字列ではなく数値で表示 (例えば *:mysql ではなく 0.0.0.0:3306 となります)
  • -l: LISTEN しているソケットのみ表示 (便利な組み合わせ: -ltn)

サーバ接続がうまくいかない場合、ポートが本当に開いているかをサーバ側で調査する際に

$ sudo netstat -lptn

は有用です。ちなみに、クライアント側で調査するためには

$ telnet 192.168.33.101 3306

などとします。通常 3306 は mysqld のポートです。

表示結果の意味

  • Proto: プロトコル
  • Recv-Q: ユーザプログラムによって読み出されていないデータ容量 (byte)
  • Send-Q: リモートホストによってAckが返されていないデータ容量 (byte)
  • Local Address: ソケットのIPアドレスとポート番号
  • Foreign Address: リモート側のソケットのIPアドレスとポート番号
  • State: TCPにおける状態 (UDPには状態という概念がないため空欄)
  • PID/Program name: ソケットを使用しているプログラムのPIDと名前

"man netstat" によると将来的には ss というコマンドに置き換えられていく予定とのことです。

netstat: This program is obsolete. Replacement for netstat is ss.

Related pages
    概要 Git を用いたプロジェクト開発を複数人で行う場合、サーバーでレポジトリ管理を行えると便利です。何らかの事情で GitHub や Bitbucket を利用できない場合は、サーバーを構築して GitLab をインストールします。ここでは特に CentOS 6 の場合についてインストール手順をまとめます。 コマンドを実行するサーバーの用意
    概要 MySQL DB サーバは自身へのクエリをバイナリログとして書き出すことができます。レプリケーションとは、追加の MySQL DB サーバが、別の MySQL DB サーバが出力したバイナリログを自分のリレーログとよばれるログにコピーして、更にリレーログに記載されたクエリを自分自身のテーブルに実行する機能です。バイナリログを出力する DB をマスターとよび、自分のリレーログにコピーする D
    プロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は ps ax | grep 'my_script' | grep -v grep | aw