前回のエントリの続きです
実験用のカーネルモジュールを作り、cgroup v1 のメモリコントローラーで制限をかけた状態で sysfs の kobject (slab) が生成されるかどうかを確かめます
実験用のカーネルモジュール
適当な名前の slab キャッシュを生成/破棄するカーネルモジュールを作りました
これを使って実験をします
実験環境
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
が競合する問題を業務で追っていたからだった。(まだ解決できていない)