Linux Kernel: cgroup, sysfs, kobject, uevent についての調べ物 - (3) slub_memcg_sysfs ブートパラメータについて

以下のエントリの続きです

hiboma.hatenadiary.jp

hiboma.hatenadiary.jp

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.

コミットログはこれ

github.com

CONFIG_SLUB_MEMCG_SYSFS_ON の有無でデフォルトでサポートするかどうかが決まるようです

cateee.net

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

検証の手順

hiboma.hatenadiary.jp

前回と同じ手順で進めていきます

適当な 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 でブロックされ、ロードアベレージ上昇のアラートを招いていたのが発端でした。

このパラメータで抑制できるといいなぁ