jdkツールを使用してスレッドの状況を総合的に表示
4528 ワード
詳細
最近、試験環境で圧力測定を行ったとき、圧力測定がしばらく運転された後、アプリケーションは対応するものを処理できないことが分かった.最後に,logbackのRollingFileAppenderが同時発生するとスレッドデッドロック待ち(jstackでwaitting状態のスレッドが大量に表示される)ソリューションがlogbackのappenderを変更することが判明した.
Javaスレッドステータスチェックスキームを添付します.次のコマンドは特殊な場合があります.今回発生した問題には適用されません(今回発生した問題チェックコマンドは簡単です):jpsコマンドを使用してプロセスID番号を表示します.
topコマンドを使用してメモリとCPUの状況を表示します(top全体を直接表示できます.ここでtop-HP${pid}を使用して単一javaプロセス内のすべてのスレッドを表示します).
プロセスで使用されているメモリまたはCPUが予想外であることが判明した場合、jstackではスレッドIDが16進数であり、topコマンドで見られるスレッドIDが10進数であるため、次のコマンドを使用して10進数を16進数に変換できます.
jstackを使用して、スレッドの仮想マシンスタックと実行状況を観察します.ここではgrep-n'0 x 5 b 1'を採用し、指定したスレッド番号、jstack出力の行番号(位置)を表示し、more+n${num}コマンドを使用して指定した行からコンテンツを表示したり、jstack 1374を直接使用してスタック全体を表示したりすることができます.
指定した行からスレッドの仮想マシンスタックと実行ステータスの表示(キーはmore+n)
最近、試験環境で圧力測定を行ったとき、圧力測定がしばらく運転された後、アプリケーションは対応するものを処理できないことが分かった.最後に,logbackのRollingFileAppenderが同時発生するとスレッドデッドロック待ち(jstackでwaitting状態のスレッドが大量に表示される)ソリューションがlogbackのappenderを変更することが判明した.
${LOG_PATH}/rollingfile.log
${LOG_ARCHIVE}/%d{yyyy-MM-dd}.%i.log
90
64 MB
[ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
UTF-8
Javaスレッドステータスチェックスキームを添付します.次のコマンドは特殊な場合があります.今回発生した問題には適用されません(今回発生した問題チェックコマンドは簡単です):jpsコマンドを使用してプロセスID番号を表示します.
root@ubuntu:~/apps$ jps -mlvV | grep -v 'mlvV'
1401 gateway-0.0.1-SNAPSHOT.jar
1374 eureka-server-0.0.1-SNAPSHOT.jar
topコマンドを使用してメモリとCPUの状況を表示します(top全体を直接表示できます.ここでtop-HP${pid}を使用して単一javaプロセス内のすべてのスレッドを表示します).
root@ubuntu:~/apps$ top -Hp 1401
top - 19:17:23 up 2 days, 13:56, 1 user, load average: 0.03, 0.03, 0.00
Threads: 71 total, 0 running, 71 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4028724 total, 1166204 free, 2214336 used, 648184 buff/cache
KiB Swap: 4192252 total, 4192252 free, 0 used. 1555352 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1457 root 20 0 3584736 657100 17876 S 1.0 16.3 19:39.91 java
1435 root 20 0 3584736 657100 17876 S 0.7 16.3 19:32.40 java
1439 root 20 0 3584736 657100 17876 S 0.3 16.3 0:14.52 java
1374 root 20 0 3584736 657100 17876 S 0.0 16.3 0:00.00 java
1376 root 20 0 3584736 657100 17876 S 0.0 16.3 0:09.49 java
プロセスで使用されているメモリまたはCPUが予想外であることが判明した場合、jstackではスレッドIDが16進数であり、topコマンドで見られるスレッドIDが10進数であるため、次のコマンドを使用して10進数を16進数に変換できます.
root@ubuntu:~/apps$ printf '%x
' 1457
5b1
jstackを使用して、スレッドの仮想マシンスタックと実行状況を観察します.ここではgrep-n'0 x 5 b 1'を採用し、指定したスレッド番号、jstack出力の行番号(位置)を表示し、more+n${num}コマンドを使用して指定した行からコンテンツを表示したり、jstack 1374を直接使用してスタック全体を表示したりすることができます.
root@ubuntu:~/apps$ jstack 1374|grep -n '0x5b1'
321:"TaskAcceptor-localhost" #51 daemon prio=5 os_prio=0 tid=0x00007fae7d7f6800 nid=0x5b1 waiting on condition [0x00007fae2da86000]
指定した行からスレッドの仮想マシンスタックと実行ステータスの表示(キーはmore+n)
root@ubuntu:~/apps$ jstack 1374|more +n321
"TaskAcceptor-localhost" #51 daemon prio=5 os_prio=0 tid=0x00007fae7d7f6800 nid=0x5b1 waiting on condition [0x00007fae2da86000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000c537a0a8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
at com.netflix.eureka.util.batcher.AcceptorExecutor$AcceptorRunner.drainInputQueues(AcceptorExecutor.java:225)
at com.netflix.eureka.util.batcher.AcceptorExecutor$AcceptorRunner.run(AcceptorExecutor.java:186)
at java.lang.Thread.run(Thread.java:748)