top
コマンドでいうところの %sy
、つまりカーネルプロセスによる
CPU使用率が高まってきた場合、以下の様な方法で原因を調査することができます。
1 # strace -c -p <PID>
CPU使用率が高くなっているプロセスのPIDを指定します。
これにより、指定のプロセスから呼び出される system call の回数や消費CPU時間の集計が始まります。
10〜30秒程度たったら、Ctrl+C
で集計を終了します。
そうすると、以下の様な集計結果が得られます。
1 % time seconds usecs/callcalls errors syscall 2 ------ ---------- - ---------- - --------- --------- ---------- ------ 3 100.00 1.470463 63933 23 munmap 4 0.00 0.000000 0 12 read 5 0.00 0.000000 0 24 write 6 0.00 0.000000 0 23 mmap 7 0.00 0.000000 0 24 rt_sigproc mask 8 0.00 0.000000 0 6 writev 9 0.00 0.000000 0 36 gettimeofd ay 10 0.00 0.000000 0 6 getppid 11 0.00 0.000000 0 18 clock_gett ime 12 0.00 0.000000 0 12 epoll_wait 13 0.00 0.000000 0 12 epoll_ctl 14 0.00 0.000000 0 12 ppoll 15 ------ ---------- - ---------- - --------- --------- ---------- ------ 16 100.00 1.470463 208 total
munmap
遅いですね。
それから、munmap の内部のどこが遅いのか、更に細かい粒度で原因をしらべるには、ftrace
が使えます。
ftrace が利用可能かどうかは以下のようにして調べられます。
1 cat /proc/sys/kernel/ftr ace_enable d 2 1
ftraceはソースコードで配布されているので、以下から git clone してきます。
1 cd /usr/local/src 2 git clone git://git. kernel.org /pub/scm/l inux/kerne l/git/rost edt/trace- cmd.git 3 cd trace-cmd 4 make 5 make install
例えば、以下のようにls
コマンドを実行してkernel関数がどのように呼ばれているかを調べられます。
1 # trace-cmd record -p function_graph ls
実行が終了するとカレントディレクトリに trace.dat
が作成されます。
これを
1 trace-cmd report | less
のようにして確認します。
posted by
genki
on Sun 25 Aug 2013
at 00:38