Kubernetes上で動いているJavaのパラメーターを確認する際に、k8s(というかDocker)ならではのつまずきがあるので、うまく行った方法を共有します。
Dockerfileの編集
通常Dockerで起動するプロセスのPIDは1になってしまいますが、後述のjcmdやjinfoはPIDが1のプロセスにアタッチ出来ないため、PIDを変更する必要があります。
PIDの変更にはTiniというパッケージを導入します。またENTRYPOINTをtiniにして、実際に起動したいアプリケーションをパラメータとして渡します。
FROM openjdk:8-jdk-alpine
LABEL MAINTAINER="foo@example.com"
WORKDIR /opt/docker
ADD --chown=daemon:daemon opt /opt
USER daemon
ENTRYPOINT ["/sbin/tini", "--", "/opt/docker/your/app/entrypoint"]
CMD []
USER root
RUN apk --update add bash
RUN apk add --no-cache tini
USER daemon
EXPOSE 9000
Alpine以外のディストーションを利用されている場合は、TiniのGitHubに導入方法をご参照ください。
https://github.com/krallin/tini
Podへのログイン
Podへのログインは通常の方法と同様です。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-name-xxxxxxxxxx-xxxxx 1/1 Running 0 10h
$ kubectl exec -it pod-name-xxxxxxxxxx-xxxxx bash
パラメーターのデフォルト値の確認
$ java -XX:+PrintFlagsFinal -version
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
...
起動中のJavaプログラムのパラメーターの確認
jpsコマンドで対象のプロセスのPID調べます。
$ jps -v
7 ProdServerStart -Duser.dir=/opt/docker
142 Jps -Dapplication.home=/usr/lib/jvm/java-1.8-openjdk -Xms8m
jcmdコマンドで調べたPIDを指定して有効になっているパラメーターの一覧を表示できます。
$ jcmd 7 VM.flags -all
7:
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
...
特定のパラメーターの設定値を確認する場合はjinfoコマンドを使用します。
以下はヒープメモリの最大値の設定を確認する例です。
$ jinfo -flag MaxHeapSize 7
-XX:MaxHeapSize=1960837120
Javaのパラメータ関連の参考サイト
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/java.html
http://etc9.hatenablog.com/entry/2016/05/11/012037
https://x1.inkenkun.com/archives/367
https://qiita.com/kaikusakari/items/9f96ffd3a6dd71dfd914