今日もおじさん

脳みそのキューが小さく、新しいことを覚えると少し前のことを忘れてしまうおじさんの備忘録的ブログです。

Splunkの自動起動設定について

先日書いた以下エントリで、Splunkインストール後、うっかりsysVinitで起動するように設定してしまっていた。
ojisanworld.hateblo.jp

なぜこの事実に気づいたかというとこちらのエントリを読んだから。
簡単だけど注意しておきたいSplunkインストール前の考慮点 - Qiita

読んだ瞬間、「え、Splunkってsystemdじゃないの?」って思いました。
というのも、以前仕事で構築した際はsystemdだった気がするんです。
ただ、7.2.2だった気もするんだよなぁ。。

でも、boot-startの設定後、Splunkのユニットファイルがなかったんで、おかしいと思ってはいたんです。こんな感じ。

# ls -l /etc/systemd/system/
合計 4
drwxr-xr-x. 2 root root   31  319 21:13 basic.target.wants
lrwxrwxrwx. 1 root root   41  319 21:13 dbus-org.fedoraproject.FirewallD1.service -> /usr/lib/systemd/system/firewalld.service
lrwxrwxrwx. 1 root root   57  319 21:13 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root   41  319 21:13 dbus-org.freedesktop.timedate1.service -> /usr/lib/systemd/system/timedatex.service
lrwxrwxrwx. 1 root root   37  319 21:15 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root   32  319 21:12 getty.target.wants
drwxr-xr-x. 2 root root 4096  319 21:13 multi-user.target.wants
drwxr-xr-x. 2 root root   48  319 21:13 network-online.target.wants
drwxr-xr-x. 2 root root   52  319 21:13 sockets.target.wants
drwxr-xr-x. 2 root root  207  319 21:13 sysinit.target.wants
lrwxrwxrwx. 1 root root   39  319 21:12 syslog.service -> /usr/lib/systemd/system/rsyslog.service
lrwxrwxrwx. 1 root root    9  512  2019 systemd-timedated.service -> /dev/null
drwxr-xr-x. 2 root root   34  319 21:13 timers.target.wants
drwxr-xr-x. 2 root root   29  319 21:13 vmtoolsd.service.requires

systemctlでのステータス確認でも/etc/rc.d/init.d/配下のスクリプト読んでるのが確認できますし。

# systemctl status splunk
● splunk.service - SYSV: Splunk indexer service
   Loaded: loaded (/etc/rc.d/init.d/splunk; generated)
   Active: active (running) since Tue 2020-03-24 23:26:40 JST; 8min ago
...以下略


以前触ったときにsystemdだった気がするっていうのもあるけど、システム要件の記載も罠なんですよね。

System requirements for use of Splunk Enterprise on-premises - Splunk Documentation
以下の記述。

On machines that run Linux where Splunk Enterprise services are managed by systemd, you can update the /etc/systemd/system/Splunkd.service unit file to set the values shown in the table below. Review the values and adjust them depending on the machine resources available.

これだけ読んだらLinux上だとsystemdで管理されているだな、って思いますよね。。
実はこちらも読まなくちゃいけないんですよ。
Run Splunk Enterprise as a systemd service - Splunk Documentation
これ先述のシステム要件のところにリンク貼っておいてほしいです。
Splunk 7.2.2以降のバージョンで、systemd管理にするためにはboot-start実行時に"-systemd-managed 1"オプションをつける必要があると記載されています。
(デフォルトでは暗黙的に"-systemd-managed 0"となっている)

systemdについては賛否があるようですが、RHEL8も既定はsystemdですし、Splunkもsystemd管理にしたいところ。ということで手順に従ってsystemdに変更してみます。

まずはSplunkサービスの停止と自動起動の無効化

# /opt/splunk/bin/splunk stop
Stopping splunkd...
Shutting down.  Please wait, as this may take a few minutes.
..                                                         [  OK  ]
Stopping splunk helpers...
                                                           [  OK  ]
Done.

# /opt/splunk/bin/splunk disable boot-start
Disabled.

そして"-systemd-managed 1"オプションを追加しての自動起動有効化。

# /opt/splunk/bin/splunk enable boot-start -systemd-managed 1 -user splunk
Systemd unit file installed at /etc/systemd/system/Splunkd.service.
Configured as systemd managed service.

Splunkサービスの起動。

$ /opt/splunk/bin/splunk start

Splunk> CSI: Logfiles.

Checking prerequisites...
        Checking http port [8000]: open
        Checking mgmt port [8089]: open
        Checking appserver port [127.0.0.1:8065]: open
        Checking kvstore port [8191]: open
        Checking configuration... Done.
        Checking critical directories...        Done
        Checking indexes...
                Validated: _audit _internal _introspection _metrics _telemetry _thefishbucket history main summary
        Done
        Checking filesystem compatibility...  Done
        Checking conf files for problems...
        Done
        Checking default conf files for edits...
        Validating installed files against hashes from '/opt/splunk/splunk-8.0.2.1-f002026bad55-linux-2.6-x86_64-manifest'
        All installed files intact.
        Done
All preliminary checks passed.

Starting splunk server daemon (splunkd)...
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====
'Splunkd.service'を開始するには認証が必要です。
Authenticating as: ojisan
Password:
==== AUTHENTICATION COMPLETE ====
Done
                                                           [  OK  ]

ここでの動作がinitとは異なる。ログインしているユーザの認証を求められます。
そして以前仕事で扱った際にはこれが出たことを記憶しています。
※表示された瞬間、「これだよ、これ!」って声が出た。

Splunkd.serviceというユニットファイルも生成されていることが確認できましたが、systemctlでステータス確認したら"not-found"が出ました。

# ls -l /etc/systemd/system
-rw-r--r--. 1 root root  627  324 23:56 Splunkd.service

# systemctl status splunk
● splunk.service
   Loaded: not-found (Reason: Unit splunk.service not found.)
   Active: active (exited) since Tue 2020-03-24 23:26:40 JST; 34min ago
...以下略

原因調査したいけど、時間がない。
とりあえず、困ったときのOS再起動で挙動を確認してみます。

$ systemctl status splunk
Unit splunk.service could not be found.

まさかのステータスさえ確認できなくなってしまいました。。

$ /opt/splunk/bin/splunk status
splunkd is running (PID: 994).
splunk helpers are running (PIDs: 1733 1747 1818 1915 2086).

でもSplunk CLIより自動起動していることが確認できます。
深追いは時間がかかりそうなので、また今度。

[2020/03/25更新]
原因わかりました。原因というか、凡ミスなんですが。
systemdだとユニット名は"splunk"ではなく"Splunkd"なんですね。

ユニットファイル名確認したときに気づけよ、という話ではありますが。。
ということで、ユニット名を"Splunkd"にすれば自動起動が正常に設定されていることが確認できます。

$ systemctl status Splunkd
● Splunkd.service - Systemd service file for Splunk, generated by 'splunk enable boot-start'
   Loaded: loaded (/etc/systemd/system/Splunkd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-03-25 21:42:08 JST; 42s ago
...以下略

個人的には大文字から始まるのやめてほしいな。。

なんにせよ、これにて無事systemdへの変更が完了です。

ついでにlimit設定とTHPの無効化も行っちゃいます。
設定方法は各所で説明されているので設定値だけ。

"/etc/systemd/system/Splunkd.serive"に以下を追記しました。

ExecStartPre=/bin/bash -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"
LimitNOFILE=65536 * これは最初から設定されていました。
LimitNPROC=16000
LimitFSIZE=infinity

そして以下を実行します。

$ systemctl daemon-reload

$ systemctl restart Splunkd

正しく反映されているか確認です。
ここでlimit設定ですが、システム要件ではulimitコマンドで確認するような記載となっていますが、Splunkd.serviceへのlimit設定は起動プロセスに適用されていることに注意します。
※ulimitコマンドで確認できるのは、実行したユーザのlimit設定です。

Splunkのプロセスに適用されているlimitを確認するためには、まず起動しているプロセスを特定します。
psコマンドでもいいですが、systemctlで確認してしまうのが手っ取り早いと思います。

$ systemctl status Splunkd
● Splunkd.service - Systemd service file for Splunk, generated by 'splunk enable boot-start'
   Loaded: loaded (/etc/systemd/system/Splunkd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-03-25 22:06:39 JST; 14min ago
 Main PID: 2260 (splunkd)
...以下略

Main PIDよりプロセス番号が確認できました。

次に"/proc/確認したプロセス番号/limits"ファイルを参照します。上記の場合PIDが2260なので"/proc/2260/limits"となります。

$ cat /proc/2260/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        unlimited            unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             16000                16000                processes
Max open files            65536                65536                files
Max locked memory         16777216             16777216             bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       7087                 7087                 signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

Soft Limit、Hard Limitともに、先に設定したlimitが適用されているのが確認できました。

次はTHPです。
これは簡単で以下のコマンドで"never"が"[]"でくくられているのを確認するだけです。

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
$ cat /sys/kernel/mm/transparent_hugepage/defrag
always defer defer+madvise madvise [never]

RHELのサイトをみると、grubの設定でTHPを無効化する方法も記載されていますが、まあこのほうが簡単で安全でしょう。

OS周りの設定はこんなもんかと思いますので、今回はここまでとします。