CLOVER🍀

That was when it all began.

Infinispan Server 15.0をsystemdで起動できるようにする&設定できる環境変数やシステムプロパティを確認する

これは、なにをしたくて書いたもの?

Infinispan Serverにsystemdの設定ファイルが含まれていることに今更ながら気づいたので、せっかくなのでちょっと設定してみようかなと
いうことで。

ついでに、設定可能な環境変数やシステムプロパティなども見ていってみようと思います。

環境

今回の環境は、こちら。

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy


$ uname -srvmpio
Linux 5.15.0-101-generic #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux


$ java --version
openjdk 21.0.2 2024-01-16
OpenJDK Runtime Environment (build 21.0.2+13-Ubuntu-122.04.1)
OpenJDK 64-Bit Server VM (build 21.0.2+13-Ubuntu-122.04.1, mixed mode, sharing)
Infinispan Serverをsystemdで起動できるように設定する

まずはInfinispan Serverをダウンロードします。

$ curl -LO https://downloads.jboss.org/infinispan/15.0.0.Final/infinispan-server-15.0.0.Final.zip

展開します。

$ unzip infinispan-server-15.0.0.Final.zip

展開したディレクトリ内の、docs/systemd/infinispan.serviceというファイルがsystemdのユニット定義ファイルのサンプルになっています。

infinispan-server-15.0.0.Final/docs/systemd/infinispan.service

# This script allows you to run Infinispan Server as a systemd service.
# Modify environment properties in this script as appropriate.
# Copy this script to the following location: /etc/systemd/system
# Activate with 'systemctl daemon-reload'
#               'systemctl start|enable infinispan'

[Unit]
Description=Infinispan Server Service
After=network.target

[Service]
Environment="INFINISPAN_HOME=/opt/infinispan"
#Environment="JAVA_HOME=/usr/java/jdk-11.0.8"
ExecStart=/bin/bash -c ${INFINISPAN_HOME}/bin/server.sh
Type=simple
User=infinispan

[Install]
WantedBy=multi-user.target

ソースコードとしては、こちらにあります。

https://github.com/infinispan/infinispan/blob/15.0.0.Final/server/runtime/src/main/server/docs/systemd/infinispan.service

どうやらInfinispan 11.0.5.Final、12.0.0.CR1で含まれるようになったようです。

Possibility to separate the subdirectories under server-root

全然気づいていませんでした。

では、こちらを使ってInfinispan Serverをsystemdで起動できるようにしていきましょう。

infinispanというユーザーを前提としているようなので、合わせてユーザーを作成します。

$ sudo adduser --shell /usr/sbin/nologin --disabled-password --no-create-home --gecos '' infinispan

また、配置場所は/opt/infinispanディレクトリを期待しているようなので、そちらに移動して所有者の変更。

$ sudo mv infinispan-server-15.0.0.Final /opt/infinispan
$ sudo chown -R infinispan:infinispan /opt/infinispan

systemdのユニット定義ファイルを/etc/systemd/system/ディレクトリにコピーします。

$ sudo cp /opt/infinispan/docs/systemd/infinispan.service /etc/systemd/system/

変更を反映して

$ sudo systemctl daemon-reload

起動。

$ sudo systemctl start infinispan

ステータスを見てみます。

$ sudo systemctl status infinispan
● infinispan.service - Infinispan Server Service
     Loaded: loaded (/etc/systemd/system/infinispan.service; disabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-03-23 23:37:01 JST; 15s ago
   Main PID: 3113 (server.sh)
      Tasks: 40 (limit: 2220)
     Memory: 191.6M
        CPU: 8.893s
     CGroup: /system.slice/infinispan.service
             ├─3113 /bin/sh /opt/infinispan/bin/server.sh
             └─3196 java -server --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAM>

 3月 23 23:37:07 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:07,408 INFO  [o.i.CONTAINER] ISPN000390: Persisted state, version=15.0.0.Final timestamp=2024-03-23T14:37:07.4068825>
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,038 INFO  [o.i.CONTAINER] ISPN000104: Using EmbeddedTransactionManager
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,323 INFO  [o.i.SERVER] ISPN080018: Started connector Memcached (internal)
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,326 INFO  [o.i.SERVER] ISPN080018: Started connector Resp (internal)
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,375 INFO  [o.i.SERVER] ISPN080018: Started connector HotRod (internal)
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,496 INFO  [o.i.SERVER] ISPN080018: Started connector REST (internal)
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,510 INFO  [o.i.SERVER] ISPN005055: Using transport: Epoll
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,607 INFO  [o.i.SERVER] ISPN080004: Connector SinglePort (default) listening on 127.0.0.1:11222
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,608 INFO  [o.i.SERVER] ISPN080034: Server 'ubuntu2204-43585' listening on http://127.0.0.1:11222
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,654 INFO  [o.i.SERVER] ISPN080001: Infinispan Server 15.0.0.Final started in 5523ms

OKですね。

自動起動の設定。

$ sudo systemctl enable infinispan
Created symlink /etc/systemd/system/multi-user.target.wants/infinispan.service → /etc/systemd/system/infinispan.service.

標準出力に書き出されたログもjournalctlで見ることができます。

$ sudo journalctl -u infinispan

Infinispan Serverに設定できる環境変数やシステムプロパティを確認する

で、これだけで終わっても面白くないので、Infinispan Serverに設定できる環境変数やシステムプロパティを確認していきたいと思います。

ドキュメントは…見ている限りありません。

以前、こういう設定ファイルがありますよ、くらいは調べたことがあります。

Infinispan Server 14.0の設定まわりのファイルをメモしておく - CLOVER🍀

systemdで起動できるようにしたので、環境変数やシステムプロパティは把握したいところですね。

まずはInfinispan Serverのディレクトリ内に移動。

$ cd /opt/infinispan

起動スクリプトまわりでポイントになるのは、次の3つのファイルです。

設定箇所や、すでに環境変数が設定されているかどうかの判定などを抜き出してみます。

$ grep -E 'x\$|^#?[^ ]+=' bin/server.sh bin/common.sh bin/server.conf
bin/server.sh:LOADER_CLASS=org.infinispan.server.loader.Loader
bin/server.sh:MAIN_CLASS=org.infinispan.server.Bootstrap
bin/server.sh:ARGUMENTS=
bin/server.sh:PROCESS_NAME=infinispan-server
bin/server.sh:PROGNAME=$(basename "$0")
bin/server.sh:DIRNAME=$(dirname "$0")
bin/server.sh:   if [ "x$ISPN_PIDFILE" != "x" ]; then
bin/server.sh:   if [ "x$ISPN_PIDFILE" != "x" ]; then
bin/common.sh:DEBUG_MODE="${DEBUG:-false}"
bin/common.sh:DEBUG_PORT="${DEBUG_PORT:-8787}"
bin/common.sh:JMX_REMOTING="${JMX:-false}"
bin/common.sh:JMX_PORT="${JMX_PORT:-9999}"
bin/common.sh:GC_LOG="$GC_LOG"
bin/common.sh:JAVA_OPTS_EXTRA=""
bin/common.sh:PROPERTIES=""
bin/common.sh:GREP="grep"
bin/common.sh:MAX_FD="maximum"
bin/common.sh:MALLOC_ARENA_MAX="${MALLOC_ARENA_MAX:-1}"
bin/common.sh:cygwin=false;
bin/common.sh:darwin=false;
bin/common.sh:linux=false;
bin/common.sh:solaris=false;
bin/common.sh:freebsd=false;
bin/common.sh:other=false
bin/common.sh:RESOLVED_ISPN_HOME=$(cd "$DIRNAME/.." >/dev/null; pwd)
bin/common.sh:if [ "x$ISPN_HOME" = "x" ]; then
bin/common.sh:if [ "x$RUN_CONF" = "x" ]; then
bin/common.sh:JAVA_OPTS="$JAVA_OPTS_EXTRA $JAVA_OPTS"
bin/common.sh:    if [ "x$DEBUG_OPT" = "x" ]; then
bin/common.sh:    if [ "x$JMX_OPT" = "x" ]; then
bin/common.sh:if [ "x$JAVA" = "x" ]; then
bin/common.sh:    if [ "x$JAVA_HOME" != "x" ]; then
bin/common.sh:if [ "x$ISPN_ROOT_DIR" = "x" ]; then
bin/common.sh:if [ "x$ISPN_LOG_DIR" = "x" ]; then
bin/common.sh:if [ "x$ISPN_CONFIG_DIR" = "x" ]; then
bin/common.sh:    if [ "x$JVM_D32_OPTION" != "x" ]; then
bin/common.sh:    elif [ "x$JVM_D64_OPTION" != "x" ]; then
bin/common.sh:    elif $darwin && [ "x$SERVER_SET" = "x" ]; then
bin/common.sh:    if [ "x$CLIENT_SET" = "x" -a "x$SERVER_SET" = "x" ]; then
bin/common.sh:        if [ "x$NO_GC_LOG_ROTATE" = "x" ]; then
bin/common.sh:CLASSPATH=
bin/server.conf:#MAX_FD="maximum"
bin/server.conf:#PROFILER=""
bin/server.conf:#JAVA_HOME="/opt/java/jdk"
bin/server.conf:#JAVA=""
bin/server.conf:#PRESERVE_JAVA_OPTS=true
bin/server.conf:if [ "x$JAVA_OPTS" = "x" ]; then
bin/server.conf:#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
bin/server.conf:#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n,address=infinispan"
bin/server.conf:if [ "x$GC_LOG" = "x" ]; then

このあたりをヒントに、設定できる環境変数と設定していなかった場合のデフォルト値、デフォルト値の定義場所などを見てみます。

環境変数名 意味 デフォルト値 デフォルト値の定義場所
JAVA_OPTS JavaVMオプション -Xms64m -Xmx512m -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true bin/server.conf#L49-L50
JAVA_HOME javaコマンドの探索に利用 なし bin/server.conf#L30
JAVA javaコマンドのパス java bin/server.conf#L38、bin/common.sh#L167-L169
GC_LOG trueに設定するとGCログ
(-Xlog:gc*:file=\"$ISPN_LOG_DIR/gc.log\":time,uptimemillis:filecount=5,filesize=3M)を有効にする
true bin/server.conf#L63
JMX trueにするとJMX Remote(-Dcom.sun.management.jmxremote)を
有効にする
false bin/common.sh#L14
JMX_PORT JMX=trueとした場合に
-Dcom.sun.management.jmxremote.port=に設定される
9999 bin/common.sh#L15
DEBUG_MODE trueに設定するとJavaVMオプションに
-agentlib:jdwp=transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=nを
追加する
false bin/common.sh#L7
DEBUG_PORT DEBUG_MODEがtrueの場合に
-agentlib:jdwp=...,address=$DEBUG_PORT,...の部分に使用される
8787 bin/common.sh#L8
PRESERVE_JAVA_OPTS true以外に設定するとJavaVMオプションの調整を行わなくなる なし bin/server.conf#L43
MALLOC_ARENA_MAX mallocが使用するメモリープールの数をglibcに伝える -1 bin/common.sh#L73
RUN_CONF 起動スクリプトが読み込む設定ファイルを指定する bin/server.conf bin/common.sh#L136
ISPN_LOG_DIR Infinispan Serverのログ出力先ディレクトリ [Infinispan Serverのインストールディレクトリ]/log bin/common.sh#L251
ISPN_CONFIG_DIR Infinispan Serverの設定ファイル配置ディレクトリ [Infinispan Serverのインストールディレクトリ]/conf bin/common.sh#L255

すべてを列挙しているわけではないのですが、知っておいたら良さそうなのはこんなところでしょうか。

とはいえ、コマンドラインオプションで指定できる項目があることも忘れてはいけません。

$ bin/server.sh --help

Infinispan Server 15.0.0.Final (I'm Still Standing)
Copyright (C) Red Hat Inc. and/or its affiliates and other contributors
License Apache License, v. 2.0. http://www.apache.org/licenses/LICENSE-2.0
Usage:
  -b, --bind-address=<address>  Binds the server endpoint to a specific address.
  -c, --server-config=<config>  Specifies a server configuration file. Defaults to `infinispan.xml`. Can be repeated, in which case the configurations are layered.
  -l, --logging-config=<config> Specifies a logging configuration file. Defaults to `log4j2.xml`.
  -g, --cluster-name=<name>     Sets the name of the cluster. Default set by configuration expression
  -h, --help                    Displays usage information and exits.
  -j, --cluster-stack=<name>    Specifies the JGroups stack for clustering. Default set by configuration expression
  -k, --cluster-address=<name>  Specifies the JGroups bind address for clustering.
  -n, --node-name=<name>        Sets the name of this node. Must be unique across the cluster.
  -o, --port-offset=<offset>    Adds a numeric offset to all ports.
  -p, --bind-port=<port>        Binds the server to a specific port. Defaults to `11222`.
  -s, --server-root=<path>      Specifies the root path for the server. Defaults to `server`.
  -v, --version                 Displays version information and exits.
  -D<name>=<value>              Sets a system property to the specified value.
  -P, --properties=<file>       Sets system properties from the specified file.

コマンドラインオプションでシステムプロパティを指定することもできます。

また、ここに記載がありませんが、コマンドラインオプションで--debugや--jmxを指定することで
DEBUG_MODE=trueやJMX_REMOTING=trueを指定した状態にもできます。

https://github.com/infinispan/infinispan/blob/15.0.0.Final/server/runtime/src/main/server/bin/common.sh#L23-L36

最後にシステムプロパティです。

システムプロパティ名 同義のコマンドラインオプション 意味 デフォルト値
-Dinfinispan.bind.address=... -b, --bind-address=<address> Infinispan Serverがバインドするアドレス 127.0.0.1(定義場所)
-Dinfinispan.bind.port=... -p, --bind-port=<port> Infinispan Serverがバインドするポート 11222(定義場所)
-Dinfinispan.cluster.name=... -g, --cluster-name=<name> クラスター名 cluster(定義場所)
-Dinfinispan.cluster.stack=... -j, --cluster-stack=<name> 使用するJGroupsスタック tcp(定義場所)
-Dinfinispan.node.name=... -n, --node-name=<name> Infinispan Serverのノード名 なし(定義場所)
-Dinfinispan.socket.binding.port-offset=... -o, --port-offset=<offset> 同一ホストに複数インスタンスを起動する時に使うポートオフセット 0(定義場所)
-Djgroups.bind.address=... JGroupsがバインドするアドレス SITE_LOCAL(定義場所は選択したJGroupsスタックごとに依存)
-Djgroups.bind.port=... JGroupsがバインドするポート 定義値は選択したJGroupsスタックごとに依存
-Djgroups.fd.port-offset=... JGroupsのポートオフセット 定義値は選択したJGroupsスタックごとに依存

JGroupsの場合、これ以外にも設定可能なシステムプロパティがあるので、各スタックの定義を参照してください。各スタックの
デフォルトの設定ファイルは以下にあります。

https://github.com/infinispan/infinispan/tree/15.0.0.Final/core/src/main/resources/default-configs

システムプロパティを設定する場合は、環境変数JAVA_OTPSに指定するか、コマンドラインオプションで指定することになるでしょう。

こちらも環境変数と同様、すべてを列挙しているわけではないのですが知っておいたら良さそうなのはこんなところかなと。

その他はこのあたりと

https://github.com/infinispan/infinispan/blob/15.0.0.Final/server/runtime/src/main/java/org/infinispan/server/Server.java#L160-L188

デフォルト値はこのあたりを見るとよいでしょう。

https://github.com/infinispan/infinispan/blob/15.0.0.Final/server/runtime/src/main/java/org/infinispan/server/Server.java#L190-L206

設定してみる

では、せっかくなので設定してみましょう。

こんなファイルを用意。JavaVMオプションの調整とGCログの無効化をしてみます。

/etc/default/infinispan

JAVA_OPTS=-Xmx1G -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dinfinispan.bind.address=192.168.33.10
GC_LOG=false

作成したファイルの内容を環境変数として読み込むように、EnvironmentFileとして追加。

/etc/systemd/system/infinispan.service

# This script allows you to run Infinispan Server as a systemd service.
# Modify environment properties in this script as appropriate.
# Copy this script to the following location: /etc/systemd/system
# Activate with 'systemctl daemon-reload'
#               'systemctl start|enable infinispan'

[Unit]
Description=Infinispan Server Service
After=network.target

[Service]
Environment="INFINISPAN_HOME=/opt/infinispan"
EnvironmentFile=-/etc/default/infinispan
ExecStart=/bin/bash -c ${INFINISPAN_HOME}/bin/server.sh
Type=simple
User=infinispan

[Install]
WantedBy=multi-user.target

systemdの設定を再読み込みして、Infinispan Serverを再起動。

$ sudo systemctl daemon-reload
$ sudo systemctl restart infinispan

変更前のJavaVM引数はこうでした。

$ sudo jcmd 5343 VM.command_line
5343:
VM Arguments:
jvm_args: --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED -Xlog:gc*:file=/opt/infinispan/server/log/gc.log:time,uptimemillis:filecount=5,filesize=3M -Xms64m -Xmx512m -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dvisualvm.display.name=infinispan-server -Djava.util.logging.manager=org.infinispan.server.loader.LogManager -Dinfinispan.server.home.path=/opt/infinispan
java_command: org.infinispan.server.loader.Loader org.infinispan.server.Bootstrap
java_class_path (initial): :/opt/infinispan/boot/infinispan-server-runtime-15.0.0.Final-loader.jar
Launcher Type: SUN_STANDARD

再起動後は、こうなりました。

$ sudo jcmd 5506 VM.command_line
5506:
VM Arguments:
jvm_args: --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED -Xmx1G -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dinfinispan.bind.address=192.168.33.10 -Dvisualvm.display.name=infinispan-server -Djava.util.logging.manager=org.infinispan.server.loader.LogManager -Dinfinispan.server.home.path=/opt/infinispan
java_command: org.infinispan.server.loader.Loader org.infinispan.server.Bootstrap
java_class_path (initial): :/opt/infinispan/boot/infinispan-server-runtime-15.0.0.Final-loader.jar
Launcher Type: SUN_STANDARD

変更が反映されました。

こんなところでしょうか。

おわりに

Infinispan Serverをsystemdで起動できるようにしたのと、設定できる環境変数やシステムプロパティをいろいろ見ていってみました。

環境変数やシステムプロパティはある程度は知っていたのですが、デバッグ用のものなどはそれほど気にしていなかったので参考に
なりましたね。
デバッグしたくなったら使ってみましょう…。