これは、なにをしたくて書いたもの?
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
ソースコードとしては、こちらにあります。
どうやら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を指定した状態にもできます。
最後にシステムプロパティです。
| システムプロパティ名 | 同義のコマンドラインオプション | 意味 | デフォルト値 |
|---|---|---|---|
| -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に指定するか、コマンドラインオプションで指定することになるでしょう。
こちらも環境変数と同様、すべてを列挙しているわけではないのですが知っておいたら良さそうなのはこんなところかなと。
その他はこのあたりと
デフォルト値はこのあたりを見るとよいでしょう。
設定してみる
では、せっかくなので設定してみましょう。
こんなファイルを用意。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で起動できるようにしたのと、設定できる環境変数やシステムプロパティをいろいろ見ていってみました。
環境変数やシステムプロパティはある程度は知っていたのですが、デバッグ用のものなどはそれほど気にしていなかったので参考に
なりましたね。
デバッグしたくなったら使ってみましょう…。