Tomcatのオフシャルコンテナのソースをcloneします。
git clone https://github.com/docker-library/tomcat.git cd tomcat/8.0/jre8
オフシャルコンテナのベースは、JREなのでJDKに変更します。
$ git diff diff --git a/8.0/jre8/Dockerfile b/8.0/jre8/Dockerfile index 973c8f3..be061ce 100644 --- a/8.0/jre8/Dockerfile +++ b/8.0/jre8/Dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:8-jre +FROM openjdk:8-jdk ENV CATALINA_HOME /usr/local/tomcat ENV PATH $CATALINA_HOME/bin:$PATH $ docker build -t test .
起動します。
docker run --name tomcat -d test $ docker exec -it tomcat bash root@df763096e049:/usr/local/tomcat#
一番CPUを使っているスレッドを特定します。
今回は、特に何も使っていないのですが…
root@df763096e049:/usr/local/tomcat# top -n 1 -H -p `pgrep java` | head top - 12:58:35 up 1 day, 7:45, 0 users, load average: 0.06, 0.09, 0.12 Threads: 42 total, 0 running, 42 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.8 us, 0.8 sy, 0.0 ni, 98.3 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2046940 total, 305596 free, 368720 used, 1372624 buff/cache KiB Swap: 1048572 total, 1038284 free, 10288 used. 1481004 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 3015160 97540 19840 S 0.0 4.8 0:00.03 java 9 root 20 0 3015160 97540 19840 S 0.0 4.8 0:00.70 java 10 root 20 0 3015160 97540 19840 S 0.0 4.8 0:00.01 java root@df763096e049:/usr/local/tomcat#
CPUを一番使っているPIDを16進数に変換します。
今回は、意味ないですが…
root@df763096e049:/usr/local/tomcat# printf %x\\n 1 1 root@df763096e049:/usr/local/tomcat#
スレッドダンプを取ります。
root@df763096e049:/usr/local/tomcat# jstack `pgrep java` > thread.txt root@df763096e049:/usr/local/tomcat# head thread.txt 2018-07-02 13:02:13 Full thread dump OpenJDK 64-Bit Server VM (25.171-b11 mixed mode): "Attach Listener" #43 daemon prio=9 os_prio=0 tid=0x00007f5c40001000 nid=0x51 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "ajp-apr-8009-AsyncTimeout" #41 daemon prio=5 os_prio=0 tid=0x00007f5c6c518000 nid=0x33 waiting on condition [0x00007f5c510d7000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at org.apache.tomcat.util.net.AbstractEndpoint$AsyncTimeout.run(AbstractEndpoint.java:130) root@df763096e049:/usr/local/tomcat#
スレッドのPIDを16進数に変換したものがスレッドダンプのnid=に対応します。
CPUを消費しているスレッドダンプが特定できるとスタックトレースからCPUを消費しているパッケージ、クラスが特定できます。
メモリ
メモリの枯渇が問題となる場合は、プロセスIDを指定してヒストグラムを取ります。
root@df763096e049:/usr/local/tomcat# jmap -histo 1 | head num #instances #bytes class name ---------------------------------------------- 1: 34192 7276720 [C 2: 37 1328696 [J 3: 2801 1157408 [I 4: 31998 767952 java.lang.String 5: 4922 718224 [B 6: 17622 563904 java.util.HashMap$Node 7: 4450 391600 java.lang.reflect.Method root@df763096e049:/usr/local/tomcat#
ガベージは、下記のようにPID=1を1000ms毎に3回取得します。
root@df763096e049:/usr/local/tomcat# jstat -gc 1 1000 3 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 512.0 8704.0 0.0 0.0 33792.0 1730.6 30208.0 13429.3 15872.0 15252.9 1792.0 1669.2 6 0.027 2 0.068 0.095 512.0 8704.0 0.0 0.0 33792.0 1730.6 30208.0 13429.3 15872.0 15252.9 1792.0 1669.2 6 0.027 2 0.068 0.095 512.0 8704.0 0.0 0.0 33792.0 1730.6 30208.0 13429.3 15872.0 15252.9 1792.0 1669.2 6 0.027 2 0.068 0.095 root@df763096e049:/usr/local/tomcat#