libcgroup-0.40.rc1-5.el6_5.1.x86_64 の template 記法のバグ


CentOS6.5 の libcgroup-0.40.rc1-5.el6_5.1.x86_64 で、 /etc/cgconfig.conf と /etc/cgrules.conf に template 記法 を使ってみたところ意図しない挙動になりました。どうもバグがあるようです

template についての詳細は man cgconfig.conf もしくは man cgrules.conf でご確認ください :)

/etc/cgconfig.conf

下記のように設定しています

  • template 記法を使用
  • /cgroup/{cpu,cpuset,memory}/vagrant/ に制限を入れる
mount {
        cpuset  = /cgroup/cpuset;
        cpu     = /cgroup/cpu;
        cpuacct = /cgroup/cpuacct;
        memory  = /cgroup/memory;
        devices = /cgroup/devices;
        freezer = /cgroup/freezer;
        net_cls = /cgroup/net_cls;
        blkio   = /cgroup/blkio;
}

template %u {
    cpu {
        cpu.cfs_quota_us = 50000;
    }
    cpuset {
        cpuset.mems = 0;
        cpuset.cpus = 0;
    }
    memory {
        memory.limit_in_bytes       = 104857600;
        memory.memsw.limit_in_bytes = 104857600;
    }
}

/etc/cgrules.conf

下記のように設定しています

  • template 記法を使用
  • vagrant ユーザは /cgroup/{cpuset,cpu,memory}/vagrant/ で制限を課す
  • 他のユーザは特に何もしない
# /etc/cgrules.conf
#The format of this file is described in cgrules.conf(5)
#manual page.
#
# Example:
#<user>         <controllers>   <destination>
vagrant         cpuset,cpu,memory  %u
*               *                  default

yum install した libcgroup-0.40.rc1-5.el6_5.1.x86_64 で動作させた場合

うーん 設定ファイルに指定した値と違いますね

[vagrant@vagrant-centos65 ~]$ cat /cgroup/cpu/vagrant/cpu.cfs_quota_us
-1

[vagrant@vagrant-centos65 ~]$ cat /cgroup/memory/vagrant/memory.limit_in_bytes
9223372036854775807

[vagrant@vagrant-centos65 ~]$ cat /cgroup/memory/vagrant/memory.memsw.limit_in_bytes
9223372036854775807

libcgroup-0.41 で動作させた場合

libcgroupの現時点の最新バージョンは 0.41 なので、設定ファイルは変えずに libcgroup だけアップグレードしてみます (方法は後述)

[vagrant@vagrant-centos65 ~]$ cat /cgroup/cpu/vagrant/cpu.cfs_quota_us
50000
[vagrant@vagrant-centos65 ~]$ cat /cgroup/memory/vagrant/memory.limit_in_bytes
104857600
[vagrant@vagrant-centos65 ~]$ cat /cgroup/memory/vagrant/mmemory.memsw.limit_in_bytes
104857600

おお 変わった!あんれー それじゃ libcgroup のバグなのかな ...

バグの検証方法

Vagrantfile と serverspec を用意していますので、下記の手順に従うと再現できます

また spec 以下に serverspec を用意していて、cgroup が設定ファイルに記述した値になっているかどうかをテストします

git clone https://github.com/hiboma/vagrant-inspect-libcgroup.git
cd vagrant-inspect-libcgroup
bundle install
vagrant up
  • libcgroup-0.40.rc1-5.el6_5.1.x86_64 での動作確認
# yum install した libcgroup でセットアップ + serverspec する
vagrant provision && bundle exec rake spec

sererspec のテストがコケるはずです

  • libcgroup-0.41 での動作確認
# libcgroup-0.41 でセットアップ + serverspec する
LIBCGROUP_VERSION=0.41 vagrant provision && bundle rake spec

0.41 をインストールして使います。serverspec のテストが通るはずです。

イマココ

ということで、どこで挙動が変わったのかコミットログを追っています

このエントリに記述した結果とは違う結果になった、もしくはお前の設定の記述に不備があるんじゃね!?等ありましたらコメントお待ちしています

感想

rc 付きのバージョンをパッケージとして出しちゃまずいのかなと思いました。ディストリビューションに詳しい方のご意見をうかがってみたい!