tomcatのスレッドダンプをとる

スレッドダンプをとるだけなら簡単だけど、
ほかのログたちとごちゃごちゃになってみづらいんで、
シェル作ってみた。

#/bin/bash

DATE=`date +'%y%m%d'`
TIME=`date +'%H%M%S'`

DIR=/tmp/nashuaki
TOMCAT_HOME=/usr/local/tomcat
USER='tomcat_user'
WORD='org.apache.catalina.startup.Bootstrap'

##ログをおいておくディレクトリを作成する
mkdir -p ${DIR}

##tomcat スレッドを取得して、CPU負荷順で並べる
ps aux -L | awk '{print $4" "$3" "$13}' | sort >> ${DIR}/thread.${DATE}.${TIME}

##catalinaのスナップショット取得
cp ${TOMCAT_HOME}/logs/catalina.out ${DIR}/catalina.out_bk

##tomcatのスレッドダンプを出力する
pgrep -f -u "${USER}" "${WORD}" | xargs kill -3

##コピーしたcatalinaと比較して、スレッドダンプ結果のみのファイルを作成
diff ${DIR}/catalina.out_bk ${TOMCAT_HOME}/logs/catalina.out >> ${DIR}/dump.${DATE}.${TIME}

##netstatもとっとく
netstat -anto >> ${DIR}/netstat.${DATE}.${TIME}

で、
CPU負荷が高いスレッドを確認。

psがこんな感じで、

[root@hostname ~]# ps -L aux $PID
USER       PID   LWP %CPU NLWP %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
30012    13912 29693  0.0  165 59.5 2939844 2405136 ?   Sl   17:35   0:00 ........
30012    13912 29694  0.0  165 59.5 2939844 2405136 ?   Sl   17:35   0:00 ........
30012    13912 29695  0.0  165 59.5 2939844 2405136 ?   Sl   17:35   0:00 ........
30012    13912 29696  0.0  165 59.5 2939844 2405136 ?   Sl   17:35   0:00 ........
30012    13912 29697  0.0  165 59.5 2939844 2405136 ?   Sl   17:35   0:00 ........
30012    13912 29698  0.0  165 59.5 2939844 2405136 ?   Sl   17:35   0:00 ........

awxで上のシェルで必要な情報だけとったのがこんな感じなので

%CPU LWP COMMAND
0.0 14959 ........
0.0 14964 ........
0.0 14965 ........
0.0 14966 ........
0.0 14967 ........
0.0 14968 ........
0.0 14969 ........

この、LWPの部分がスレッドのIDにあたるので
それを16進数になおしたものが

"TP-Processor379" daemon prio=10 tid=0x0000002b39f75000 nid=0x5c0d runnable [0x0000000043d63000]

このnidにあたるので、
そのこをみてあげればよい。