Splunk v7.2 から使える リソース利用の管理機能 Workload Management を設定してみました。
Linux の cgroup を活用したサーチ、インデックス負荷の コントロールができるようになります。
Environment
以下の環境で設定してみる。
- Ubuntu 16.04.5 LTS (VirtualBox Guest)
- Splunk 7.2.6
$ 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.conf
の
SPLUNK_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 を選択。
- Unit file present が OK なのに、以下が NG のとき。
-> systemd Unit file のファイル名をチェック。- CPU Splunk base directory present
- Delegate property set to true
- Splunk launched under systemd
- Memory Splunk base directory present
- CPU Splunk base directory permissions とMemory Splunk base directory permissions が NG
-> Splunkd.service の ExecStartPost の記述をチェック。
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.conf
で
default_pool
、ingest_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.conf
の workload_pool
に、
default_pool
や ingest_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
が追加されている。