Splunk Workload Management (WLM)

April 19, 2019
Splunk cgroup

Splunk v7.2 から使える リソース利用の管理機能 Workload Management を設定してみました。

Linux の cgroup を活用したサーチ、インデックス負荷の コントロールができるようになります。

Environment

以下の環境で設定してみる。

$ systemctl --version
systemd 229
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN
$ pidof systemd
29575

systemd 下での cgroups の設定

(Splunk v7.2.2 以降では systemd の設定はデフォルトで入るようですが、 記録がてら残しておきます)

Splunk (splunkd) を systemd 経由で起動するようにする。

事前に停止し、enable boot-start で設定した LSB 経由の起動を止めておく。

$ sudo -u splunk $SPLUNK_HOME/bin/splunk stop
$ sudo $SPLUNK_HOME/bin/splunk disable boot-start

$SPLUNK_HOME/etc/splunk-launch.confSPLUNK_SERVER_NAME を確認する。 この環境では、 Splunkd

systemd の service unit ファイルを /etc/systemd/system/Splunkd.service という名称で作成。

大文字から始まる Splunkd.service に合わせること。 異なると、後の preflight check で失敗します。

[Unit]
After=network.target

[Service]
Type=simple
Restart=always
ExecStart=/opt/splunk/bin/splunk _internal_launch_under_systemd
LimitNOFILE=65536
SuccessExitStatus=51 52
RestartPreventExitStatus=51
RestartForceExitStatus=52
KillMode=mixed
KillSignal=SIGINT
TimeoutStopSec=10min
User=splunk
Delegate=true
MemoryLimit=100G
CPUShares=1024
PermissionsStartOnly=true
ExecStartPost=/bin/bash -c "chown -R splunk:splunk /sys/fs/cgroup/cpu/system.slice/%n"
ExecStartPost=/bin/bash -c "chown -R splunk:splunk /sys/fs/cgroup/memory/system.slice/%n"

[Install]
WantedBy=multi-user.target

公式ドキュメント に必須項目と、設定してはいけない項目が書かれているので注意。

$ sudo systemctl daemon-reload
$ sudo systemctl start Splunkd.service
$ sudo systemctl status Splunkd.service

cgroup が生成されていることを確認。

$ ls /sys/fs/cgroup/cpu/system.slice/Splunkd.service
cgroup.clone_children  cpuacct.stat               cpuacct.usage_sys
cgroup.procs           cpuacct.usage              cpuacct.usage_user
cpu.cfs_period_us      cpuacct.usage_all          notify_on_release
cpu.cfs_quota_us       cpuacct.usage_percpu       tasks
cpu.shares             cpuacct.usage_percpu_sys
cpu.stat               cpuacct.usage_percpu_user

$ ls /sys/fs/cgroup/memory/system.slice/Splunkd.service
cgroup.clone_children           memory.kmem.tcp.failcnt             memory.oom_control
cgroup.event_control            memory.kmem.tcp.limit_in_bytes      memory.pressure_level
cgroup.procs                    memory.kmem.tcp.max_usage_in_bytes  memory.soft_limit_in_bytes
memory.failcnt                  memory.kmem.tcp.usage_in_bytes      memory.stat
memory.force_empty              memory.kmem.usage_in_bytes          memory.swappiness
memory.kmem.failcnt             memory.limit_in_bytes               memory.usage_in_bytes
memory.kmem.limit_in_bytes      memory.max_usage_in_bytes           memory.use_hierarchy
memory.kmem.max_usage_in_bytes  memory.move_charge_at_immigrate     notify_on_release
memory.kmem.slabinfo            memory.numa_stat                    tasks

ここまでが OS 側の設定。

Workload Management の設定

事前チェックの実施。

$ sudo -u splunk $SPLUNK_HOME/bin/splunk check workload-config

Workload Management Preflight Checks failed. Fix the following issues: 
    CPU Splunk base directory Splunkd.service requires read and write permissions.
    Memory Splunk base directory Splunkd.service requires read and write permissions.

上は、失敗例。 成功すると Workload Management Preflight Checks pass. と出力される。

もしくは、Splunk Web UI から、Settings -> Workload management を選択。

workload pool の作成

$SPLUNK_HOME/etc/system/local/workload_pools.conf を作成。 (App でも良いらしい。Web UI から設定すると search app に属する)

workload_pool_base_dir_name は、cgroup の設定と一致している必要ありそう。

[general]
default_pool = matsu_pool
ingest_pool = ingest_pool
enabled = 1
workload_pool_base_dir_name = Splunkd

[workload_pool:matsu_pool]
cpu_weight = 40
mem_weight = 40

[workload_pool:ingest_pool]
cpu_weight = 30
mem_weight = 30

[workload_pool:take_pool]
cpu_weight = 20
mem_weight = 20

[workload_pool:ume_pool]
cpu_weight = 10
mem_weight = 10

workload_pools.confdefault_poolingest_pool に指定した pool は、 rule の workload_pool には指定すると、有効化できない。

WARN WorkloadConfig - Failed to process invalid rule=rule_admin with error=workload pool used in workload rule is invalid.

$SPLUNK_HOME/etc/system/local/workload_rules.conf はこんな感じ。

[workload_rules_order]
rules = rule_admin,rule_app,rule_user

[workload_rule:rule_admin]
predicate = role=admin
workload_pool = take_pool

[workload_rule:rule_app]
predicate = app=search
workload_pool = take_pool

[workload_rule:rule_user]
predicate = role=user
workload_pool = ume_pool

workload 関連の conf を書き換えたら、splunkd を再起動すること。

Troubleshooting

Error: Failed to validate workload management configuration for splunk node:bubo with guid=8F21D204-6D31-4EF1-BAA6-E04C7593F232 with error=failed to read/process workload rules in workload configuration. Check the workload management preflight-checks status for additional information.
$ ./bin/splunk check workload-config

Workload Management Preflight Checks pass. 

となるときは、workload_rules.confworkload_pool に、 default_poolingest_pool が指定されていることあり。

WLM の有効化と、状態の確認

晴れて成功すると以下の記述。

$ splunk enable workload-management
$ splunk show workload-management-status

    Workload Management Status:
        Enabled: 1
        Supported: 1
        Ingest Pool: ingest_pool
        Default Pool: matsu_pool
        Error: 

    Workload Pools:
        ingest_pool:
            CPU Group: /sys/fs/cgroup/cpu/system.slice/Splunkd.service/ingest_pool
            Memory Group: /sys/fs/cgroup/memory/system.slice/Splunkd.service/ingest_pool
            CPU Weight: 30
            Memory Weight: 30

        matsu_pool:
            CPU Group: /sys/fs/cgroup/cpu/system.slice/Splunkd.service/matsu_pool
            Memory Group: /sys/fs/cgroup/memory/system.slice/Splunkd.service/matsu_pool
            CPU Weight: 40
            Memory Weight: 40

        take_pool:
            CPU Group: /sys/fs/cgroup/cpu/system.slice/Splunkd.service/take_pool
            Memory Group: /sys/fs/cgroup/memory/system.slice/Splunkd.service/take_pool
            CPU Weight: 20
            Memory Weight: 20

        ume_pool:
            CPU Group: /sys/fs/cgroup/cpu/system.slice/Splunkd.service/ume_pool
            Memory Group: /sys/fs/cgroup/memory/system.slice/Splunkd.service/ume_pool
            CPU Weight: 10
            Memory Weight: 10


    Workload Rules:
        rule_admin:
            Order: 1 
            Predicate: role=admin 
            Workload Pool: take_pool 

        rule_app:
            Order: 2 
            Predicate: app=search 
            Workload Pool: take_pool 

        rule_user:
            Order: 3 
            Predicate: role=user 
            Workload Pool: ume_pool 

サーチの割当

保存済みサーチへの割当

Settings -> Searches, Reports, and Alerts を開き、 任意のサーチを選択して、Edit -> Advanced Edit を選択。 Workload Pool にプール名を指定。

ad-hoc サーチへの割当

サーチ画面のサーチフィールドの右下に、 workload pool を選択できるプルダウンが現れる。

Monitoring Console での確認

Resource Usage に Workload Management が表示されるようになる。

どのプールでどの程度のリソースを使ったか等、タイムラインで表示される。

ダッシュボード

ダッシュボードに埋め込まれたサーチについて、 プールへ割り当てる方法は、マニュアルには見つけられなかったので、 できるかどうか、質問中

Reference

Upgrade to v7.3.0

(2019/6/11 updated)

シングル構成なので、Upgrade 作業は特段難しいこと無く。

etc/apps/search/local/workload_rules.conf

[workload_rules_order]
rules = rule_admin,rule_app,rule_user

[workload_rule:rule_admin]
predicate = role=admin
workload_pool = take_pool

[workload_rule:rule_app]
predicate = app=search
workload_pool = take_pool

[workload_rule:rule_user]
predicate = role=user
workload_pool = ume_pool

etc/apps/search/local/workload_pools.conf

[general]
default_pool = matsu_pool
ingest_pool = ingest_pool
enabled = 1
workload_pool_base_dir_name = Splunkd

[workload_pool:matsu_pool]
cpu_weight = 58
mem_weight = 58
category = search
default_category_pool = 1

[workload_pool:ingest_pool]
cpu_weight = 100
mem_weight = 100
category = ingest
default_category_pool = 1

[workload_pool:take_pool]
cpu_weight = 29
mem_weight = 29
category = search
default_category_pool = 0

[workload_pool:ume_pool]
cpu_weight = 15
mem_weight = 15
category = search
default_category_pool = 0

[workload_category:search]

[workload_category:ingest]
cpu_weight = 30
mem_weight = 30

[workload_category:misc]
cpu_weight = 0
mem_weight = 0

既存 pool の weight が調整されていて、 workload_category が追加されている。