読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

Linux 3.8 で改良された memory cgroup (1)

Linux Container cgroup

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 を使うのと同じです.

  1. まずは新しいカーネルメモリのファイルが 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
  2. 新しいグループを作成してみます.
    # 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
  3. 制限値を入れてみます.
    # echo 1M > memory.kmem.limit_in_bytes
    # cat memory.kmem.limit_in_bytes
    1048576
  4. とあるシェルのプロセスを登録してみました.
    # echo 15656 > tasks
    # cat tasks
    15656
  5. このシェル上で Apache を起動しましたよ.単に起動しただけでは足りなくなることもないようです.
    # cat memory.kmem.max_usage_in_bytes
    880640
    # cat memory.kmem.failcnt
    0
  6. ブラウザでアクセスしたけど普通に応答が返ってきたのでもう少し制限値を厳しくしてみようかなと思いましたが,ここで 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
  7. failcnt と max_usage を確認してみると
    # cat memory.kmem.failcnt
    2
    # cat memory.kmem.max_usage_in_bytes
    1048576

制限出来ているようです (当たり前 :-)

(つづく... かも?)