以下のmuninプラグインでJavaのheap使用状況を監視しています。
CentOS7になってJavaのheapデータが取れなくなりました。
現象
munin-runでテストしてみたところ問題無くJavaのheap情報取れています。
# munin-run jstat__heap Eden_Used.value 214827008 Eden_Free.value 0 Survivor0_Used.value 2.6619e+07 Survivor0_Free.value 185242 Survivor1_Used.value 0 Survivor1_Free.value 26804224 Old_Used.value 268435456 Old_Free.value 0 Permanent_Used.value 3.62442e+07 Permanent_Free.value 681267
しかしMunin上では情報が取れていません。
Javaのプロセスを動かしているのはrootユーザで、Muninのプラグインを動かしているのもrootユーザなので普通は取れるはず。
原因
調査していくと以下のことがわかりました。
Java heap情報は/tmp以下に格納されている
まず、Javaのheap情報は以下のファイルにあります。
/tmp/hsperfdata_(username)/(pid)
今回のようにrootユーザで起動しているプロセスなら以下のようなファイル名です。JavaのPIDはjpsコマンドで取得します。
/tmp/hsperfdata_root/936
Muninから/tmp配下が見えない
しかしMuninのプラグインからは、この/tmp配下ディレクトリが見えないようでした。
さらに原因を調査するとSystemdのPrivateTmpという機能が原因でした。
Systemdではサービス毎に/tmpディレクトリを持つ、PrivateTmpという設定があります。
このようにsystemdに設定していると、
PrivateTmp=true
サービス毎のtmpがこちらに作成されます。
/tmp/systemd-private-<uuid>/tmp
Muninの設定
munin-nodeのSystemdの設定を見てみると、
vi /etc/systemd/system/multi-user.target.wants/munin-node.service
PrivateTmpが有効になっています。
[Unit] Description=Munin Node Server. Documentation=man:munin-node After=network.target [Service] Type=forking PIDFile=/var/run/munin/munin-node.pid ExecStart=/usr/sbin/munin-node PrivateTmp=true [Install] WantedBy=multi-user.target
これをfalseに設定してPrivateTmpを無効化すると通常のtmpファイルが見えるようになります。
PrivateTmp=false
後はsystemdを再読込してやることでJava__heap情報が見えるようになります。
systemctl daemon-reload systemctl restart munin-node.service