BSD界隈四方山話

第75回パフォーマンスチェック プロセッサ編

DTraceで解析する流れ

ここ最近のFreeBSD DevSummitで感じることですが、開発者から高い注目を集めている機能のひとつがDTraceになっています。ユーザランドで動作するプログラムおよびカーネルの内部の動きを追うのにDTraceの機能が有効だからです。DTraceをどうやって使うのかといったチュートリアル的な話から、今後DTraceにどういった機能を追加していくのか、多くの開発者が高い関心を持っています。

DTraceでトレースできる対象は随時追加されていますので、カーネルの内部構造とDTraceの仕組みを知れば知るほど、システムのモニタリングを深く実施できるという状況にあります。多くの開発者がDTraceに高い関心を示しているのはこのためです。

DTraceは今後さらにパフォーマンス分析で中心的な役割を果たしていくと思います。便利なショートカット的なDスクリプトの情報も増えていくでしょう。DTraceに詳しいかどうかが開発者のスキルとして重要になっていくと考えられます。

しかしながら、*BSDはもともとシステムパフォーマンスをチェックするためにいくつものフックを用意していて、それらはさまざまなコマンドを経由してチェックできるようになっています。DTraceのようにインターフェースが統一されているわけではないので、コマンドごとに使い方が違うわけですが、覚えておいて損はないものです。

しばらく、FreeBSDでこうしたステムパフォーマンスをチェックするために利用するコマンドと、とくにどこを見ればよいのかを、リソースと知りたい対象という観点から整理して紹介しようと思います。今回はプロセッサです。

プロセッサパフォーマンスチェック

システム全体のプロセッサの使用状況を見るにはvmstat(8)コマンドを使います。cpuの項目にシステム全体のプロセッサの使用状況が表示されています。とくにusとsysの項目の合算でどの程度の負荷状態なのかがわかります。

 vmstat(8)
% vmstat 1
procs  memory       page                    disks     faults         cpu
r b w  avm   fre   flt  re  pi  po    fr   sr mf0   mf1   in    sy    cs us sy id
0 0 0 667M  186M    18   0   0   0    37    1   0 10312   19   408   201  0  0 100
0 0 0 667M  186M     3   0   0   0     0    3   0    13   25   124   228  0  0 100
0 0 0 667M  186M     1   0   0   0     0    3   0     0    6   132    91  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0     0   30   126   228  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0     0    6   132   100  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0    49   92   132   699  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0     0   17   126   187  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0     0    2   132    81  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   8     0    8   127    87  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0     0    2   126    83  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0     0   14   132   195  0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0     0    2   132    82  0  0 100

プロセッサの合算値ではなく、コアまたは論理コア(スレッド)ごとの使用状況を見るにはvmstat(8)に-Pオプションを指定します。これでコア/論理コア(スレッド)ごとの使用状況を表示させることができます。

 vmstat(8)でコアごとの情報
% vmstat -P 1
procs  memory       page                    disks     faults        cpu0     cpu1     cpu2     cpu3
r b w  avm   fre   flt  re  pi  po    fr   sr mf0 mf1   in    sy    cs us sy id us sy id us sy id us sy id
0 0 0 667M  186M    18   0   0   0    37    1   0   0   19   407   201  0  0 100 0  0 100 0  0 100 0  0 100
0 0 0 667M  186M     2   0   0   0     0    3   0   0    7   134    95  0  1 99  0  0 100 0  0 100 0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0   0    2   131    78  0  1 99  0  0 100 0  0 100 0  1 99
0 0 0 667M  186M     0   0   0   0     0    3   0   0   15   134   187  0  1 99  0  0 100 0  0 100 0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0   0    4   129    94  0  1 99  0  0 100 0  0 100 0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0  51   96   128   725  0  1 99  0  0 100 0  0 100 0  1 99
0 0 0 667M  186M     0   0   0   0     0    3   0   0    5   134    89  0  0 100 0  0 100 0  0 100 0  1 99
0 0 0 667M  186M     0   0   0   0     0    3   0   0   19   132   195  0  1 99  0  0 100 0  0 100 0  0 100
0 0 0 667M  186M     0   0   0   0     0    3   0   0    7   131    97  0  0 100 0  1 99  0  0 100 0  0 100

vmstat(8)と似た情報はtop(1)コマンドでも得られます。top(1)ではvmstat(8)で表示させたシステムまるごとのプロセッサの使用状況ではなく、プロセスごとのプロセッサの使用状況が確認できます。WCPUの部分が合算値です。

 top(1)
% top
last pid: 48396;  load averages:  0.29,  0.21,  0.22  up 4+10:46:53  21:32:45
40 processes:  1 running, 39 sleeping
CPU:  0.0% user,  0.0% nice,  0.8% system,  0.0% interrupt, 99.2% idle
Mem: 8640K Active, 1601M Inact, 6076M Wired, 341M Buf, 185M Free
ARC: 4262M Total, 1027M MFU, 743M MRU, 16K Anon, 42M Header, 2450M Other
Swap: 4096M Total, 1748K Used, 4094M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME    WCPU COMMAND
48396 daichi        1  20    0 20120K  3568K CPU2    2   0:00   0.06% top
 2356 root          1  20    0 10436K  2016K select  0   0:43   0.01% powerd
 2379 daichi        1  20    0 25412K  6292K kqread  2   0:20   0.01% nginx
47925 daichi        1  20    0 83092K  8284K select  1   0:00   0.01% sshd
 2353 root          1  20    0 20536K 12448K select  2   0:17   0.00% ntpd
 2596 root          1  20    0 24104K  1812K select  1   0:05   0.00% sendmail
 2311 root          1  52    0 12500K  3088K rpcsvc  1   0:01   0.00% rpc.lockd
 2418 root          1  20    0 20600K  6656K select  0   0:05   0.00% sendmail
 2425 root          1  20    0 12564K  2492K nanslp  3   0:01   0.00% cron

top(1)の方は-Sオプションを指定するとカーネルプロセスまで含めてどのプロセスがどの程度消費しているのかをチェックできます。

 top(1)でカーネルプロセスも表示
% top -S
last pid: 48453;  load averages:  0.27,  0.23,  0.22  up 4+10:48:39  21:34:31
64 processes:  2 running, 61 sleeping, 1 waiting
CPU:  0.0% user,  0.0% nice,  0.3% system,  0.0% interrupt, 99.7% idle
Mem: 8560K Active, 1601M Inact, 6076M Wired, 341M Buf, 185M Free
ARC: 4262M Total, 1027M MFU, 743M MRU, 16K Anon, 42M Header, 2450M Other
Swap: 4096M Total, 1748K Used, 4094M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME    WCPU COMMAND
   11 root          4 155 ki31     0K    64K CPU0    0 426.6H 399.24% idle
    0 root        262 -16    -     0K  4192K swapin  0   0:46   0.35% kernel
   12 root         15 -72    -     0K   240K WAIT    1   1:57   0.07% intr
48453 daichi        1  25    0 20120K  3568K CPU3    3   0:00   0.06% top
   41 root          8  -8    -     0K   144K arc_re  3   0:35   0.05% zfskern
   14 root         15 -68    -     0K   240K -       0   0:56   0.03% usb
   13 root          3  -8    -     0K    48K -       3   0:19   0.03% geom
    6 root          1 -16    -     0K    16K -       1   1:37   0.02% rand_harvestq
 2356 root          1  20    0 10436K  2016K select  0   0:43   0.01% powerd
47925 daichi        1  20    0 83092K  8284K select  2   0:00   0.01% sshd
 2353 root          1  20    0 20536K 12448K select  1   0:17   0.00% ntpd
 2418 root          1  20    0 20600K  6656K select  0   0:05   0.00% sendmail

システム全体のプロセッサ使用状況についてはuptime(1)コマンドでも確認できます。load averageの項目がそれです。この部分がコア/論理コア(スレッド)の個数よりも大きな値を占めているようだと、常に実行待ちプロセスが存在するようなプロセッサ使い切り状況になっています。

 uptime(1)でロートアベレージ
% uptime
 9:35PM  up 4 days, 10:50, 1 users, load averages: 0.32, 0.24, 0.23
% 

ハードウェアよりになってきますが、pmcstat(8)コマンドを使うとプロセッサが提供している測定機能を使ってパフォーマンス計測を実施できます。このコマンドは上記コマンドのような簡単なサンプルは示しにくいのですが、ある程度使い方がpcmstat(8)のオンラインマニュアルに書いてあるので、より子細なパフォーマンス計測やエラー計測が必要な場合にはpmcstat(8)を使ってみてください。

勉強会

第58回 11月29日(火) 19:00- FreeBSD勉強会

2016年11月29日(火)には佐藤広生先生をお招きして第58回FreeBSD勉強会をドワンゴセミナールームで開催します。FreeBSD ZFS性能測定とチューニングのお話をしていただく予定です。第58回FreeBSD勉強会では、FreeBSD勉強会史上初、ニコ生放送を実施します。今後、2ヵ月に1回ほどのペースでFreeBSD勉強会の内容をニコ生放送する予定です。よろしくお願いします。

参加申請はこちらから。

第59回 12月21日(水) 19:00- FreeBSD勉強会

ストレージシステムの基盤として使われることの多いZFS。いったん運用を開始あるとあとはボリュームの管理や、ハードウェアの管理、またはより高速なハードウェアの利用などを行いたくなってきます。第59回のFreeBSD勉強会ではそうした部分にフォーカスしてZFSの扱い方を紹介します。このところ続けているFreeBSD ZFS解説シリーズです。

参加申請はこちらから。

おすすめ記事

記事・ニュース一覧