cgroup には複数のサブシステム(controller)があるが、その中の cpu.shares について検証してみた。
cpu.shares とは
cpu.shares を設定すると、タスクが使用できる CPU 時間の割合を変更することができる。
具体的に言うと、A B2つのグループを作り、cpu.shares をそれぞれ1024 2048とした場合、B のグループにいるプロセスが、A のグループにいるプロセスより 2倍 CPU を使えるようになる。以下、実行例。
cgroup には複数のサブシステム(controller)があるが、その中の cpu.shares について検証してみた。
cpu.shares を設定すると、タスクが使用できる CPU 時間の割合を変更することができる。
具体的に言うと、A B2つのグループを作り、cpu.shares をそれぞれ1024 2048とした場合、B のグループにいるプロセスが、A のグループにいるプロセスより 2倍 CPU を使えるようになる。以下、実行例。
cgroup の memory サブシテムを利用すると、登録したプロセスがメモリを使いすぎた際、oom-killer が動作し、対象プロセスを kill することができる(デフォルト動作)。
kill されたことは syslog など見ればわかるが、cgroup には通知APIといった機能があり、アプリ側で oom-killer が動作した際のイベントを受け取ることが可能なので、この機能を試してみる。
mruby-cgroup は、mruby から cgroup を利用するためのモジュールで、いわゆる libcgroup のバインディング。現在、mruby-cgroup 9cad17343 で対応しているサブシテムは以下のとおり。
他に、cgroup のサブシステムには以下のようなものがある(CentOS 6.4)
# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 10 1 1
ns 0 1 1
cpu 11 1 1
cpuacct 12 1 1
memory 13 1 1
devices 14 1 1
freezer 15 1 1
net_cls 16 1 1
blkio 17 1 1
perf_event 0 1 1
net_prio 0 1 1
この中から、簡単に使えそうな memory サブシステムを追加してみた。
mruby-cgroup は、@matsumotory が開発している mruby から cgroup を利用するためのライブラリ。
https://github.com/matsumoto-r/mruby-cgroup
cgroup は linux カーネルの機能で、タスク(プロセス)のリソース(CPU, メモリ, IO, etc)を制御するための仕組み。 これを利用すると「特定のプロセスが CPU100% 使うような処理を行っても 50% しか利用させない」といった制御ができるようになる。