jpsコマンドでSolrプロセスが表示されない

はじめに

あるとき、最近の Solr は jsp でプロセスが表示されないことに気づきました。Solr 5 の頃は表示されていた記憶があります。気になったので原因を調べてみました。

過去のSolrでは表示される

手元にある過去のバージョンの Solr を起動して試してみました。start.jar が Solr のプロセスです。

Solr 5.5.5

$ jps -l
12315 sun.tools.jps.Jps
12077 start.jar

Solr 7.5.0

$ jps -l
12550 start.jar
12668 sun.tools.jps.Jps

Solr 8.1.0

$ jps -l
13052 sun.tools.jps.Jps

Solr 8 あたりでこの変化が起こったようです。

jps で Java プロセスが表示される仕組み

jpsはJavaプロセスが起動するときに作成される /tmp/hsperfdata_USERNAME/PID というファイルの情報を利用して表示されます。たとえば java1 ユーザが起動した PID 13542 のプロセスがあれば /tmp/hsperfdata_java1/13542 というファイルになります。

hsperfdata ファイルは jps に限らず、jstat など Java のツール群で共通して使われるものです。上では /tmp と書きましたが、 システムプロパティ java.io.tmpdir で指定される作業ディレクトリ上に作られます。

jps が Java プロセスを見失うのはどういう場合か

java.io.tmpdir が変更された場合

この場合、java プロセスが作る hsperfdata ファイルの場所が jps の想定する場所と異なるために jps からは見つけられなくなります。

hsperfdata ファイルが作成されなくなる起動オプションが指定された場合

そもそも hsperfdata が作られなければ jps からは見つけられません。 hsperfdata ファイル生成を抑制するオプションとして、 -XX:-UsePerfData や -XX:+PerfDisableSharedMem があります。

Solr 起動時の java コマンドの起動オプション

-XX:+PerfDisableSharedMem が指定されていました。

$ ./solr start -V -p 8984
Using Solr root directory: /home/java1/fsw/solr-8.9.0
Using Java: /home/java1/.sdkman/candidates/java/current/bin/java
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment 18.9 (build 11.0.6+10)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.6+10, mixed mode)

Starting Solr using the following settings:
    JAVA            = /home/java1/.sdkman/candidates/java/current/bin/java
    SOLR_SERVER_DIR = /home/java1/fsw/solr-8.9.0/server
    SOLR_HOME       = /home/java1/fsw/solr-8.9.0/server/solr
    SOLR_HOST       = 
    SOLR_PORT       = 8984
    STOP_PORT       = 7984
    JAVA_MEM_OPTS   = -Xms512m -Xmx512m
    GC_TUNE         = -XX:+UseG1GC -XX:+PerfDisableSharedMem -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=250 -XX:+UseLargePages -XX:+AlwaysPreTouch -XX:+ExplicitGCInvokesConcurrent
    GC_LOG_OPTS     = -Xlog:gc*:file=/home/java1/fsw/solr-8.9.0/server/logs/solr_gc.log:time,uptime:filecount=9,filesize=20M
    SOLR_TIMEZONE   = UTC
    SOLR_OPTS       = -Xss256k


Waiting up to 180 seconds to see Solr running on port 8984 [|]  
Started Solr server on port 8984 (pid=15099). Happy searching!

試しに solr 起動スクリプトで -XX:+PerfDisableSharedMem を指定している箇所をコメントアウトしてみると、起動後に jps で Solr 8.9.0 のプロセスが表示されるようになりました。

コメント