以下のエントリの続きです
cgroup 内で生成される slab キャッシュに対応する sysfs のファイルが /sys/kernel/slab/<キャッシュの名前>/cgroup/...
以下に生成されることを追っていました。
kernel のブートパラメータに slub_memcg_sysfs=0
を足すことで sysfs のファイル作成を抑制できるのを確認したのを記したエントリです
slub_memcg_sysfs={0,1}
Documentation/admin-guide/kernel-parameters.txt には下記のような説明が記されています
slub_memcg_sysfs= [MM, SLUB] Determines whether to enable sysfs directories for memory cgroup sub-caches. 1 to enable, 0 to disable. The default is determined by CONFIG_SLUB_MEMCG_SYSFS_ON. Enabling this can lead to a very high number of debug directories and files being created under /sys/kernel/slub.
コミットログはこれ
CONFIG_SLUB_MEMCG_SYSFS_ON
の有無でデフォルトでサポートするかどうかが決まるようです
Ubuntu Bionic で扱えるカーネルでは全て y
でした
vagrant@bionic:~$ grep CONFIG_SLUB_MEMCG_SYSFS_ON /boot/* /boot/config-4.15.0-29-generic:CONFIG_SLUB_MEMCG_SYSFS_ON=y /boot/config-4.15.0-43-generic:CONFIG_SLUB_MEMCG_SYSFS_ON=y /boot/config-4.15.0-66-generic:CONFIG_SLUB_MEMCG_SYSFS_ON=y /boot/config-5.0.0-32-generic:CONFIG_SLUB_MEMCG_SYSFS_ON=y /boot/config-5.3.9-050309-generic:CONFIG_SLUB_MEMCG_SYSFS_ON=y /boot/config-5.4.0-050400rc7-generic:CONFIG_SLUB_MEMCG_SYSFS_ON=y
実験
ブートパラメータに slub_memcg_sysfs=0
を足して再起動をかけます
vagrant@bionic:~$ sudo grep slub_memcg_sysfs /etc/default/grub GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 slub_memcg_sysfs=0 "
vagrant@bionic:~$ sudo update-grub
検証の手順
前回と同じ手順で進めていきます
適当な cgroup + memory コントローラーでグループを作り、適当なコマンドを打ちます
root@bionic:~# mkdir /sys/fs/cgroup/memory/@hogehoge root@bionic:~# echo $$ > /sys/fs/cgroup/memory/@hogehoge/tasks
/sys/kernel/cgroup 以下にファイルが生成されていません
root@bionic:~# find /sys/kernel/cgroup/ | grep @hogehoge
/sys/kernel/ .. 以下にファイルを生成しないため udevadm で uevent をモニタしていても何もキャッチしません
vagrant@bionic:~$ udevadm monitor --kernel monitor will print the received events for: KERNEL - the kernel uevent # ... 何も起こらない
まとめ
- k8s や大量の cgroup やコンテナを扱う環境で余計な sysfs ファイルの生成を抑制できそうです
- カーネルの中で抱えるメモリ ( slab かな? ... ) に優しくなる気がします ... 計測はしていませんが ... sorry
そもそも、このネタを調べていたのは「とある大量のコンテナを扱う production 環境」で、sysfs ファイル削除のタイミングで uevent が大量に送出され、それを処理するカーネルスレッドが競合を起こし TASK_UNINTERRUPTIBLE でブロックされ、ロードアベレージ上昇のアラートを招いていたのが発端でした。
このパラメータで抑制できるといいなぁ