jdkツールを使用してスレッドの状況を総合的に表示

4528 ワード

詳細
最近、試験環境で圧力測定を行ったとき、圧力測定がしばらく運転された後、アプリケーションは対応するものを処理できないことが分かった.最後に,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)