CentOS7でMuninのjstat__heapで情報が取得できない

以下のmuninプラグインJavaのheap使用状況を監視しています。

github.com

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上では情報が取れていません。 f:id:yomon8:20160701133809p:plain

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という機能が原因でした。

access.redhat.com

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