概要
Linuxにおいてsystemd-tmpfiles-clean.timerが/tmp配下を定期的に自動クリーンアップすることにより、稼働中のJavaプロセスが使用する/tmp/.java_pid<pid>等の一時ファイルが削除される場合があります。これにより、jstack, jcmd等のJDKコマンドの実行や、WebOTXのプロセスグループのスタックトレース採取が失敗する等の影響が発生することから、/tmp配下の対象ファイルをクリーンアップ対象から除外する設定を推奨します。
影響のある製品
< Linux >
- WebOTX Application Server Standard V11.2 以降の全てのバージョン
詳細
RHEL 9系・Oracle Linux 9系・Amazon Linux 2023以降のディストリビューションでは、systemd-tmpfiles-clean.timerが標準で有効化されており、/tmp配下の一時ファイルを定期的に自動削除します。動作タイミングや削除対象の条件(タイマーの起動間隔・ファイルの保持期間等)は、例えば以下のコマンドで確認できます。
# タイマーの動作設定(OnBootSec・OnUnitActiveSec等)を確認
systemctl cat systemd-tmpfiles-clean.timer
# クリーンアップ設定(保持期間等)を確認
systemd-tmpfiles --cat-config
ただし、設定値はOSのバージョンやディストリビューションによって異なる場合があります。詳細についてはご利用のOSのサポートにお問い合わせください。
Java(HotSpot JVM)は、以下のファイルを/tmp配下に作成し、JDKコマンドの動作基盤として使用します。これらのファイルがsystemd-tmpfiles-clean.timerにより削除されると、以下の問題が発生します。
(1) /tmp/.java_pid<pid>
HotSpot Dynamic Attach機構(jstack, jcmd, jmap等)が使用するUNIXドメインソケットファイルです。
このファイルが削除されると、jcmd等のJDKコマンドによる診断操作ができなくなります。
また、WebOTXのプロセスグループのスタックトレース採取(stackTrace操作)は内部的にこのソケットを使用するため、
/tmp/.java_pid<pid>が削除されると初回(ソケット再作成後)は採取できるものの、2回目以降は出力されなくなる事象が
発生します(次回のドメイン再起動まで解消されません)。
(2) /tmp/.attach_pid<pid>
HotSpot Dynamic Attach機構の起動トリガとして使用されるファイルです。
/tmp/.java_pid<pid>とあわせて除外設定することを推奨します。
(3) /tmp/hsperfdata_<ユーザー名>/<pid>
JVM統計情報(JVM PerfData)のファイルです。
jps・jstat・JDK Mission Control・VisualVM等のツールがローカルJVMを検出・監視するために使用します。
このファイルが削除されると、これらのツールがローカルJVMを認識できなくなります。
systemd公式 GitHub Issue #20635 において、HotSpot JVM の Dynamic Attach API が /tmp/.java_pid<pid> という UNIX ドメインソケットを使用していること、および systemd-tmpfiles-clean による削除により JVM の診断機能(jstack, jcmd等)が継続して利用できなくなる可能性があることが示されています。この挙動は systemd 側でも既知の事象であり、systemd-tmpfiles の仕様上回避不能であるとの判断から、tmpfiles.d による除外設定が有効な運用対応として紹介されています。
https://github.com/systemd/systemd/issues/20635
また、JDK側では、JDK-8225690の修正にてソケットファイルが削除された場合にJVMが再生成を試みる仕組みが導入されています。ただし、この再生成は一定間隔でファイルの削除を検知した後に行われるため、すべてのケースで即座かつ完全に復旧するものではありません。このため、JVM側の再生成に頼るのではなく、OS側のクリーンアップ対象から除外する設定を行うことを推奨します。
https://bugs.openjdk.org/browse/JDK-8225690
対処方法
/tmp配下の対象ファイルをsystemd-tmpfiles-clean.timerのクリーンアップ対象から除外するため、以下の手順で設定ファイルを作成してください。
[設定手順]
1. 設定ファイルを新規作成します。
/usr/lib/tmpfiles.d/ 直下のファイルを直接変更するとOSのアップデートで上書きされる可能性があるため、
/etc/tmpfiles.d/ 配下に新規ファイルとして作成してください。
sudo vi /etc/tmpfiles.d/webotx-java.conf
2. 以下の内容を記述して保存します。
# Exclude HotSpot Dynamic Attach files from systemd-tmpfiles cleanup
x /tmp/.java_pid*
x /tmp/.attach_pid*
# Exclude JVM PerfData (required by jps / jstat / JDK Mission Control / VisualVM)
x /tmp/hsperfdata_*
3. 設定が反映されていることを確認します。
systemd-tmpfiles --cat-config | grep -E '\.java_pid|\.attach_pid|hsperfdata'
手順2で追加した3行が表示されれば設定完了です。
4. 既に/tmp/.java_pid<pid>等が削除された状態でスタックトレース採取等が失敗している場合は、
WebOTXのドメインあるいはTPシステムを再起動してください。
PGプロセスの再起動に伴いソケットファイルが再作成され、事象が解消します。
ドメインの停止:
otxadmin stop-domain <ドメイン名>
ドメインの起動:
otxadmin start-domain <ドメイン名>
TPシステムの停止:
otxadmin stop-system -u <ユーザー名> -w <パスワード> --port <ポート番号>
TPシステムの起動:
otxadmin start-system -u <ユーザー名> -w <パスワード> --port <ポート番号>
回避方法
プロセスグループのスタックトレース採取について、/tmp/.java_pid<pid>が削除された状態でもgenerate-jvm-reportコマンドを使用することで、スタックトレースを採取できます。
[コマンド例](アプリケーショングループ名apg、プロセスグループ名pgの場合)
otxadmin> generate-jvm-report --type thread --apgroup apg --pgroup pg
ファイルへリダイレクトする場合は以下のように実行します。
/opt/WebOTX/bin/otxadmin generate-jvm-report --user <ユーザー名> --password <パスワード> \
--host <ホスト名> --port <ポート番号> \
--type thread --apgroup <アプリケーショングループ名> --pgroup <プロセスグループ名> > threaddump.txt
詳細は以下のマニュアルを参照してください。
WebOTX Manual Application Server > 構築・運用 > ドメインの構築 > Javaプロセスの監視・管理 > 統計レポート出力
→「スレッド情報の表示(スレッドダンプ、デッドロック検出、etc.)」
ただし、generate-jvm-reportはプロセスグループのスタックトレース採取における代替手段です。jstack, jcmd等のJDKツールの利用や、jps, jstat等による監視に対しては、本回避方法では対処できません。これらを含め、根本的な対処としては「対処方法」の除外設定を実施することを推奨します。
更新履歴
本サイトについてのご注意
本サイトに掲載した製品には他社の製品も含まれており、 これらの製品の情報につきましては、 他社から提供または公開された情報を基にしております。 最新の情報につきましては製品開発元の情報を参照してください。