[AWS][Ubuntu] microインスタンスのCPU制限を行う方法

AWSのt1.microのCPUがStealする話。

色々散々出てきているので既知の話だと思いますが cgroup するのがRedhat経の話ばかりでUbuntuのやり方が出ていなかったのでその二番煎じの記事です。

なので環境はUbuntuで実施しています。

1) install cgroup-bin

sudo apt-get install cgroup-bin

2) Reboot.

リブートすると /sys/fs/cgroup ができていると思います。再起動しなくてもできている?

3) Edit /etc/cgconfig.conf

このファイルは存在しないので1から作ります。制限をかけるのがユーザが別なのかRootユーザなのかで変わってくると思いますが。

group limit {
    cpu {
        cpu.cfs_quota_us = 250000;
        cpu.cfs_period_us = 1000000;
    }
    cpuacct { 
    }
}

その後

cgconfigparser -l /etc/cgconfig.conf

を実行。これを実行しておかないと [cgroup change of group failed]というエラーが表示されました。

4) Run Process.

cgexec -g cpu:limit perl ./test1.pl &

上記は適宜読み替えて下さい。

1 root dev003 home test ssh

画像ではあえて2つのユーザでPerを実行していますが25%,25%づつになっているのがわかります。(このサーバはt1.microではないのでstealは発生していません)

起動時には cgconfig.conf を読み込んでくれません。cgconfigpaserを実行した後に cpu/limit のディレクトリが作成されます。ubuntuのパッケージは自動起動用のツールが用意されていませんので気をつけます。

5) 実際に使ってみる

muninのサーバを動かした場合には、ユーザが munin となるため /etc/cgconfig は以下のように記述します。 /sys/fs/cgroup/cpu/limit の権限に実行するユーザの権限が必要になります。

group limit {
 perm {
    admin {
        uid = munin;
    }
    task {
        uid = munin;
    }
 }
 cpu {
   cpu.cfs_quota_us = 250000;
   cpu.cfs_period_us = 1000000;
 }
 cpuacct {
 }
}

なので上記のように定義しておきます。この状態で cgconfigparserを実行すると

munin@ip-172-16-1-133:/var/log/munin$ ls -l /sys/fs/cgroup/cpu/
drwxr-xr-x 2 munin root 0 Mar 17 14:47 limit

上記のように limit ディレクトリの所有者が munin に変更されます。こうなっているとmuninユーザでもcgexecが実行できるようになります。
その後はCronから起動される munin-cron の中で実行しているコマンドに cgexec を付与することで有効になります。

1 root ip 172 16 1 133 etc cron d ssh

起動設定については /etc/init.d/munin のStartの部分にcgconfigparserを追加

case "$1" in
  start|restart|force-reload)
    # Create various dirs
    /usr/sbin/cgconfigparser -l /etc/cgconfig.conf
    mkdir -p /var/run/munin && chown munin /var/run/munin
    exit $?
    ;;
  stop)

ちなみにSteal中はこんな感じに燃え上がる。

NewImage

変更実施後は

NewImage

このように赤い(Steal)がなくなっているのがわかる、これにともなって以下のようにLoadやDevice Latencyも同様に改善されているのが分かります。

NewImage

NewImage

上部へスクロール