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にあたるので、
そのこをみてあげればよい。