Linux 3.8 で User Namespace 機能が入った!と浮かれていて,cgroup のメモリコントローラに入った改良に全く気づいていませんでした (^_^;) 他に freezer サブシステムにも改良加わってますよ (階層化かな).
この辺りでしょうか.
ちょっと対象となるコミットとかはまだ見れてません.
さて,早速試してみました.本当に試してみただけなので流行の最先端を行く方なら読むよりやったほうが早いと思います :-)
まずはいつも通り新しい機能を有効にしてカーネルの再構築です.
-> General setup -> Control Group support -> Resource counters -> Memory Resource Controller for Control Groups -> Memory Resource Controller Kernel Memory accounting
この辺りで有効になります.まだ "EXPERIMENTAL" とあります.
あとはフツーに cgroup を使うのと同じです.
- まずは新しいカーネルメモリのファイルが cgroup ファイルシステム以下に出来ているかを確認してみました.当たり前ですが今までなかったファイルが出現しています.memory.kmem.limit_in_bytes とか memory.kmem.max_usage_in_bytes とか memory.kmem.slabinfo とか.
# cd /sys/fs/cgroup/memory
# ls
cgroup.clone_children memory.max_usage_in_bytes
cgroup.event_control memory.memsw.failcnt
cgroup.procs memory.memsw.limit_in_bytes
libvirt/ memory.memsw.max_usage_in_bytes
memory.failcnt memory.memsw.usage_in_bytes
memory.force_empty memory.move_charge_at_immigrate
memory.kmem.failcnt memory.oom_control
memory.kmem.limit_in_bytes memory.soft_limit_in_bytes
memory.kmem.max_usage_in_bytes memory.stat
memory.kmem.slabinfo memory.swappiness
memory.kmem.tcp.failcnt memory.usage_in_bytes
memory.kmem.tcp.limit_in_bytes memory.use_hierarchy
memory.kmem.tcp.max_usage_in_bytes notify_on_release
memory.kmem.tcp.usage_in_bytes release_agent
memory.kmem.usage_in_bytes tasks
memory.limit_in_bytes - 新しいグループを作成してみます.
# mkdir test01
# cd test01
# ls
cgroup.clone_children memory.max_usage_in_bytes
cgroup.event_control memory.memsw.failcnt
cgroup.procs memory.memsw.limit_in_bytes
memory.failcnt memory.memsw.max_usage_in_bytes
memory.force_empty memory.memsw.usage_in_bytes
memory.kmem.failcnt memory.move_charge_at_immigrate
memory.kmem.limit_in_bytes memory.oom_control
memory.kmem.max_usage_in_bytes memory.soft_limit_in_bytes
memory.kmem.slabinfo memory.stat
memory.kmem.tcp.failcnt memory.swappiness
memory.kmem.tcp.limit_in_bytes memory.usage_in_bytes
memory.kmem.tcp.max_usage_in_bytes memory.use_hierarchy
memory.kmem.tcp.usage_in_bytes notify_on_release
memory.kmem.usage_in_bytes tasks
memory.limit_in_bytes - 制限値を入れてみます.
# echo 1M > memory.kmem.limit_in_bytes
# cat memory.kmem.limit_in_bytes
1048576 - とあるシェルのプロセスを登録してみました.
# echo 15656 > tasks
# cat tasks
15656 - このシェル上で Apache を起動しましたよ.単に起動しただけでは足りなくなることもないようです.
# cat memory.kmem.max_usage_in_bytes
880640
# cat memory.kmem.failcnt
0 - ブラウザでアクセスしたけど普通に応答が返ってきたのでもう少し制限値を厳しくしてみようかなと思いましたが,ここで apachectl stop と入力したタイミングでエラー発生!
httpd: Syntax error on line 84 of /etc/httpd/conf/httpd.conf: Cannot load /usr/lib64/apache/mod_ssl.so into server: libssl.so.1.0.0: failed to map segment from shared object: Cannot allocate memory
- failcnt と max_usage を確認してみると
# cat memory.kmem.failcnt
2
# cat memory.kmem.max_usage_in_bytes
1048576
制限出来ているようです (当たり前 :-)
(つづく... かも?)