特定のプロセスが極端にメモリをpidstatはプロセス単位(pid毎)のリソース使用量を測定するツールです。pidstatはsysstatの一部なので、sysstatをインストールする必要があります。
$ sudo yum install sysstat
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: www.ftp.ne.jp
* epel: ftp.iij.ad.jp
* extras: www.ftp.ne.jp
* rpmforge: mirror.fairway.ne.jp
* updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package sysstat.x86_64 0:9.0.4-20.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
========================================================================
Package Arch Version Repository Size
========================================================================
Installing:
sysstat x86_64 9.0.4-20.el6 base 225 k
Transaction Summary
========================================================================
Install 1 Package(s)
Total download size: 225 k
Installed size: 807 k
Is this ok [y/N]: y
Downloading Packages:
sysstat-9.0.4-20.el6.x86_64.rpm | 225 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : sysstat-9.0.4-20.el6.x86_64 1/1
Verifying : sysstat-9.0.4-20.el6.x86_64 1/1
Installed:
sysstat.x86_64 0:9.0.4-20.el6
Complete!
とりあえず試しに手元のruby on rails開発環境に起動しているwebrickが使っているリソースを見てみます。 webrickはrubyで動いているので以下のコマンドでPIDを調べることができます。
$ ps aux | grep ruby | grep -v grep
dev 14262 0.0 16.6 1503532 169276 pts/2 Sl+ 03:29 1:08 /home/dev/.rvm/rubies/ruby-1.9.3-p194/bin/ruby script/rails s
これでpidが14262であることがわかったのでpidstatで確認してみます。 pidは-pオプションで指定します。最後の2と10は2秒間隔で10回表示という意味を表します。
$ pidstat -p 14262 2 10
Linux 2.6.32-279.2.1.el6.x86_64 (c6) 2013年11月17日 _x86_64_ (1 CPU)
23時49分02秒 PID %usr %system %guest %CPU CPU Command
23時49分04秒 14262 17.59 1.51 0.00 19.10 0 ruby
23時49分06秒 14262 8.54 8.54 0.00 17.09 0 ruby
23時49分08秒 14262 45.23 5.53 0.00 50.75 0 ruby
23時49分10秒 14262 33.84 7.58 0.00 41.41 0 ruby
23時49分12秒 14262 17.50 6.00 0.00 23.50 0 ruby
23時49分14秒 14262 20.20 3.54 0.00 23.74 0 ruby
23時49分16秒 14262 16.67 7.07 0.00 23.74 0 ruby
23時49分18秒 14262 6.53 0.00 0.00 6.53 0 ruby
23時49分20秒 14262 13.00 4.00 0.00 17.00 0 ruby
23時49分22秒 14262 15.00 6.00 0.00 21.00 0 ruby
平均値: 14262 19.40 4.97 0.00 24.37 - ruby
指定したプロセスがマルチスレッドで動いてたり、子プロセスを持っていたりする場合は、-tをつけることでそれらも一度で確認できます。
$ pidstat -p 14262 2 5 -t
Linux 2.6.32-279.2.1.el6.x86_64 (c6) 2013年11月17日 _x86_64_ (1 CPU)
23時57分44秒 TGID TID %usr %system %guest %CPU CPU Command
23時57分46秒 14262 - 0.00 0.00 0.00 0.00 0 ruby
23時57分46秒 - 14262 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 - 14264 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 - 14265 0.00 0.00 0.00 0.00 0 |__SignalSender
23時57分46秒 - 14270 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 - 19809 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 - 19810 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 - 19811 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 - 19812 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 - 19813 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 - 19814 0.00 0.00 0.00 0.00 0 |__ruby
23時57分46秒 TGID TID %usr %system %guest %CPU CPU Command
23時57分48秒 14262 - 22.61 4.52 0.00 27.14 0 ruby
23時57分48秒 - 14262 0.00 0.50 0.00 0.50 0 |__ruby
23時57分48秒 - 14264 0.00 0.00 0.00 0.00 0 |__ruby
23時57分48秒 - 14265 0.00 0.00 0.00 0.00 0 |__SignalSender
23時57分48秒 - 14270 0.00 0.00 0.00 0.00 0 |__ruby
23時57分48秒 TGID TID %usr %system %guest %CPU CPU Command
23時57分50秒 14262 - 27.78 7.07 0.00 34.85 0 ruby
23時57分50秒 - 14262 0.51 0.00 0.00 0.51 0 |__ruby
23時57分50秒 - 14264 0.00 0.51 0.00 0.51 0 |__ruby
23時57分50秒 - 14265 0.00 0.00 0.00 0.00 0 |__SignalSender
23時57分50秒 - 14270 0.00 0.00 0.00 0.00 0 |__ruby
23時57分50秒 - 19906 2.02 0.00 0.00 2.02 0 |__ruby
23時57分50秒 TGID TID %usr %system %guest %CPU CPU Command
23時57分52秒 14262 - 35.86 10.61 0.00 46.46 0 ruby
23時57分52秒 - 14262 0.00 0.51 0.00 0.51 0 |__ruby
23時57分52秒 - 14264 0.00 0.00 0.00 0.00 0 |__ruby
23時57分52秒 - 14265 0.00 0.00 0.00 0.00 0 |__SignalSender
23時57分52秒 - 14270 0.00 0.00 0.00 0.00 0 |__ruby
23時57分52秒 - 19975 0.00 0.00 0.00 0.00 0 |__ruby
23時57分52秒 - 19977 0.00 0.00 0.00 0.00 0 |__ruby
23時57分52秒 - 19978 0.00 0.00 0.00 0.00 0 |__ruby
23時57分52秒 - 19979 0.00 0.00 0.00 0.00 0 |__ruby
23時57分52秒 - 19980 0.00 0.00 0.00 0.00 0 |__ruby
23時57分52秒 - 19981 0.00 0.00 0.00 0.00 0 |__ruby
23時57分52秒 TGID TID %usr %system %guest %CPU CPU Command
23時57分54秒 14262 - 25.25 8.59 0.00 33.84 0 ruby
23時57分54秒 - 14262 0.00 0.00 0.00 0.00 0 |__ruby
23時57分54秒 - 14264 0.00 0.00 0.00 0.00 0 |__ruby
23時57分54秒 - 14265 0.00 0.00 0.00 0.00 0 |__SignalSender
23時57分54秒 - 14270 0.00 0.00 0.00 0.00 0 |__ruby
23時57分54秒 - 20049 0.00 0.00 0.00 0.00 0 |__ruby
平均値: TGID TID %usr %system %guest %CPU CPU Command
平均値: 14262 - 22.26 6.14 0.00 28.40 - ruby
平均値: - 14262 0.10 0.20 0.00 0.30 - |__ruby
平均値: - 14264 0.00 0.10 0.00 0.10 - |__ruby
平均値: - 14265 0.00 0.00 0.00 0.00 - |__SignalSender
平均値: - 14270 0.00 0.00 0.00 0.00 - |__ruby
平均値: - 20049 0.00 0.00 0.00 0.00 - |__ruby
pidstatで出力する情報にはいろいろありますが、それぞれオプションをしていすることで表示が可能です。
オプション | 意味 |
---|---|
u | CPU資料状況 |
w | タスクswitchの発生状況 |
d | ディスク使用量 |
そのほかにもいろいろありますので各ディストリビューションのmanを確認してください。以下は、上記のオプションを選択した状態です。
$ pidstat -p 14262 2 2 -dwu
Linux 2.6.32-279.2.1.el6.x86_64 (c6) 2013年11月18日 _x86_64_ (1 CPU)
00時02分41秒 PID %usr %system %guest %CPU CPU Command
00時02分43秒 14262 0.00 0.00 0.00 0.00 0 ruby
00時02分41秒 PID kB_rd/s kB_wr/s kB_ccwr/s Command
00時02分43秒 14262 0.00 0.00 0.00 ruby
00時02分41秒 PID cswch/s nvcswch/s Command
00時02分43秒 14262 0.50 0.00 ruby
00時02分43秒 PID %usr %system %guest %CPU CPU Command
00時02分45秒 14262 0.00 0.00 0.00 0.00 0 ruby
00時02分43秒 PID kB_rd/s kB_wr/s kB_ccwr/s Command
00時02分45秒 14262 0.00 0.00 0.00 ruby
00時02分43秒 PID cswch/s nvcswch/s Command
00時02分45秒 14262 0.50 0.00 ruby
平均値: PID %usr %system %guest %CPU CPU Command
平均値: 14262 0.00 0.00 0.00 0.00 - ruby
平均値: PID kB_rd/s kB_wr/s kB_ccwr/s Command
平均値: 14262 0.00 0.00 0.00 ruby
平均値: PID cswch/s nvcswch/s Command
平均値: 14262 0.50 0.00 ruby
d(ディスクIO)、w(コンテキストスイッチの発生割合)、u(CPU使用率)が表示されますが、とても機械で処理可能なフォーマットではありません。 そこでプログラムなどから利用しやすいようにするために、すべての結果を一行で出力するhオプションがあります。
$ pidstat -p 14262 2 2 -dwuh
Linux 2.6.32-279.2.1.el6.x86_64 (c6) 2013年11月18日 _x86_64_ (1 CPU)
# Time PID %usr %system %guest %CPU CPU kB_rd/s kB_wr/s kB_ccwr/s cswch/s nvcswch/s Command
1384700910 14262 0.00 0.00 0.00 0.00 0 0.00 0.00 0.00 0.50 0.00 ruby
# Time PID %usr %system %guest %CPU CPU kB_rd/s kB_wr/s kB_ccwr/s cswch/s nvcswch/s Command
1384700912 14262 0.00 0.00 0.00 0.00 0 0.00 0.00 0.00 0.50 0.00 ruby