2012-04-14 65 views
3

thread pile upsというプロダクションのTomcatサーバーを使用していましたので、定期的にスレッドダンプをチェックし、何か問題があると警告メールを送信するように設定しました。これを行うには、シェルスクリプトからファイル内のスレッドダンプを取る必要がありますが、それを行うことはできません。シェルからは、定期的な間隔でKILL -3 <PID>を発行することができますが、問題はダンプがcatalina.outに移動し、GBsのデータが含まれているためスレッドダンプだけを引き出すことが辛いプロセスであるということです。いくつかのディスカッションスレッドは、「jstack」の使用を提案し、出力をファイルにリダイレクトするが、それはまた、作業と、このエラーを与えていません。自動的にスレッドダンプを取得する方法

-bash-3.2# java -version 
java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) 
-bash-3.2# uname -a 
Linux ip-10-130-225-20 2.6.16.33-xenU #2 SMP Wed Aug 15 17:27:36 SAST 2007 x86_64 x86_64 x86_64 GNU/Linux 

-bash-3.2# sudo /usr/java/jdk1.6.0_24/bin/jstack -F 15668 
Attaching to process ID 15668, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 19.1-b02 
Deadlock Detection: 

No deadlocks found. 

Thread 8183: (state = BLOCKED) 
Error occurred during stack walking: 
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp 
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:152) 
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet(LinuxDebuggerLocal.java:466) 
    at sun.jvm.hotspot.debugger.linux.LinuxThread.getContext(LinuxThread.java:65) 
    at sun.jvm.hotspot.runtime.linux_amd64.LinuxAMD64JavaThreadPDAccess.getCurrentFrameGuess(LinuxAMD64JavaThreadPDAccess.java:92) 
    at sun.jvm.hotspot.runtime.JavaThread.getCurrentFrameGuess(JavaThread.java:256) 
    at sun.jvm.hotspot.runtime.JavaThread.getLastJavaVFrameDbg(JavaThread.java:218) 
    at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:76) 
    at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45) 
    at sun.jvm.hotspot.tools.JStack.run(JStack.java:60) 
    at sun.jvm.hotspot.tools.Tool.start(Tool.java:221) 
    at sun.jvm.hotspot.tools.JStack.main(JStack.java:86) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at sun.tools.jstack.JStack.runJStackTool(JStack.java:118) 
    at sun.tools.jstack.JStack.main(JStack.java:84) 
Caused by: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp 
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet0(Native Method) 

このバグは、Javaのチームとのオープンのようです。

スレッドダンプをインテリジェントに取得して分析する他の提案はありますか?または、巨大なcatalina.outを解析してスレッドダンプを取得するスクリプトですか?

答えて

2

この記事をチェックするscheduling thread dumpsについて私はそれがまさにあなたがやろうとしていることだと思います。

0

私が考え出した簡単な方法はjavamelodyを使っていました。私たちはそれを使ってアプリケーションのさまざまな側面を監視し、現在のスレッドを見る普通の方法である&を提供するので、毎分 "http:// IP:PORT/SERVICE/monitoring?part = threadsDump"ファイル内の応答をダンプします。応答にブロックされたスレッドスクリプトが含まれている場合、5秒ごとにスレッドダンプが発生します。これはある程度まで助けますが、問題が悪化してサーバが停止すると、javamelodyも応答を停止します。

関連する問題