Linux Kernel: cgroup, sysfs, kobject, uevent についての調べ物 - (2) 実験編

前回のエントリの続きです

hiboma.hatenadiary.jp

実験用のカーネルモジュールを作り、cgroup v1 のメモリコントローラーで制限をかけた状態で sysfs の kobject (slab) が生成されるかどうかを確かめます

実験用のカーネルモジュール

適当な名前の slab キャッシュを生成/破棄するカーネルモジュールを作りました

github.com

これを使って実験をします

実験環境

root@bionic:/vagrant/debugslub# uname -a
Linux bionic 5.0.0-32-generic #34~18.04.2-Ubuntu SMP Thu Oct 10 10:36:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

実験 1.

インストールする

まずは拙作のカーネルモジュールを insmod します

root@bionic:/vagrant/debugslub# make insmod
insmod kmem_cache.ko

同時に udevadm で uevent をモニタしておきます. すると ...

vagrant@bionic:/ $ udevadm monitor --kernel | grep debugslub
KERNEL[1158.522451] add      /kernel/slab/@debugslub (slab)

insmod のタイミングで slab 作成のイベントをキャッチできました.

これは module_init() 呼び出す関数の中で kmem_cache_create("@debugslub", ... ) を捉えたものです.

sysfs の確認

insmod 後、以下のように /sys/kernel/slab 以下にファイルが生えています

vagrant@bionic:/$ find /sys/kernel/slab/\@debugslub/ | head
/sys/kernel/slab/@debugslub/
/sys/kernel/slab/@debugslub/remote_node_defrag_ratio
/sys/kernel/slab/@debugslub/total_objects
/sys/kernel/slab/@debugslub/alloc_calls
/sys/kernel/slab/@debugslub/cpu_slabs
/sys/kernel/slab/@debugslub/objects
/sys/kernel/slab/@debugslub/objects_partial
/sys/kernel/slab/@debugslub/cpu_partial
/sys/kernel/slab/@debugslub/validate
/sys/kernel/slab/@debugslub/free_calls

cgroup を作る

次に cgroup v1 で @hogehoge グループを作ります ( @ は見やすい目印にしたいだけ )

root@bionic:/# mkdir     /sys/fs/cgroup/memory/@hogehoge
root@bionic:/# echo $$ > /sys/fs/cgroup/memory/@hogehoge/tasks

拙作のカーネルモジュールで生えた debugfs のファイルに write(2) します (内部で kmem_cache_alloc() を呼びます )

root@bionic:/# echo 1 > /sys/kernel/debug/debugslub 

cgroup 内で slab が作られたことが uevent で通知され、 udevmadm でキャッチできます

vagrant@bionic:/vagrant/debugslub$ udevadm monitor --kernel | grep debugslub
KERNEL[1284.715508] add      /kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge) (cgroup) 👈

sysfs の確認

sysfs を見てみるとファイルとディレクトリがどわっと生えていますね

root@bionic:/vagrant/debugslub# find /sys/kernel/ | grep @debugslub | tail
/sys/kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge)/shrink
/sys/kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge)/hwcache_align
/sys/kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge)/objs_per_slab
/sys/kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge)/partial
/sys/kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge)/slabs_cpu_partial
/sys/kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge)/ctor
/sys/kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge)/slab_size
/sys/kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge)/cache_dma
/sys/kernel/slab/@debugslub/slab_size
/sys/kernel/slab/@debugslub/cache_dma

削除してみる

cgroup を削除します

root@bionic:/# rmdir /sys/fs/cgroup/memory/\@hogehoge

udevadm で削除をキャッチできます

vagrant@bionic:/vagrant/debugslub$ udevadm monitor --kernel | grep debugslub
KERNEL[1338.196854] remove   /kernel/slab/@debugslub/cgroup/@debugslub(930:@hogehoge) (cgroup)

sysfs の確認

削除されています

root@bionic:~# ls -hal /sys/kernel/slab/\@debugslub/cgroup/
total 0
drwxr-xr-x 2 root root 0 Dec  2 14:49 .
drwxr-xr-x 3 root root 0 Dec  2 14:49 ..
root@bionic:~# 

まとめ

  • 実際に作ってみると「ああ なるほど」という理解が進む
  • 元々これらのネタを調べ始めたのは sysfs の kobject を削除する際の kobject_uevent が競合する問題を業務で追っていたからだった。(まだ解決できていない)