mruby-cgroupを書いてみたがかなり便利な件

Linux KernelのControl Group機能によって、プロセスの様々なリソース管理を行うcgroupをmrubyから呼び出せるようにしました。

それをmruby-cgroupと呼ぶことにします。

これがなかなか素晴らしくて、C言語で書いたプログラムにmrubyを組み込むことで、そのC言語で書かれたホストプログラムをとても簡単にリソース管理できてしまいます。

使い方

mrbgemsとして作っているので、mruby-cgroupのREADMEに従ってbuild_config.rbにgitのURLを書くと簡単にrakeでlibmruby.aに組み込めます。

現状は、CPUとIOリソースの管理の機能のみですが、cgroupのコンテキストのやり取り等、ベースとなる部分の実装はできているので、後はどんどんcgroupの機能を追加していくだけです。

例えば、以下のように書きます。

[program lang=’ruby’ escaped=’true’]

cpu = Cgroup::CPU.new("test_group")
io = Cgroup::BLKIO.new("test_group")

# cpuリソース制限
cpu.cfs_quota_us  = 30000
cpu.shares  = 2048

# ioリソース制限
io.throttle_read_bps_device "8:0", "200000000"
io.throttle_write_bps_device "8:0", "100000000"
io.throttle_read_iops_device "8:0", "20000"
io.throttle_write_iops_device "8:0", "20000"

# groupを作成
cpu.create;
io.create;

# groupに参加(引数にpidを渡せる、引数無しの場合は自分自身をattach)
cpu.attach
io.attach

#
# この辺でcpu処理やIO負荷の高い処理
#

# group削除
cpu.delete
io.delete

[/program]

という風にかけます。簡単に自分自身のリソースを制御したり、別のプロセスを制御したりできますね。

例えばmod_mrubyに組み込む

例えばmod_mrubyにmruby-cgroupを組み込むと、リクエストのリソース使用量を簡単に制御できます。

例えば、以下のようなmrubyスクリプトを書いて、コンテンツ処理前にmod_mrubyでフックします。

[program lang=’ruby’ escaped=’true’]

r = Apache::Request.new

if r.filename == "/var/www/html/while.cgi"
  c = Cgroup::CPU.new("apache/mod_mruby_group")
  c.cfs_quota_us = 10000
  c.create
  c.attach
end

[/program]

こんな風に書くと、while.cgiにリクエストがあった場合は、while.cgiをCPU10%で処理します。簡単ですね。ngx_mrubyでも同じような事ができるでしょう。というより、mruby-cgroupを組み込めば、cgroupに対応したLinuxのリソース管理は自由自在になるでしょう。

最後に

mruby-cgroupによって、mrubyを組み込んだプログラムを非常に簡単にリソース制御できるようになりました。これで、Linux上で動くCで書かれたホストプログラムやmrubyを組み込んだプログラムを自由自在にリソース制御することが可能になります。

これまで、動いているプロセスのリソース管理というのは機能が貧弱(niceとか)で非常に難しかったのですが、mrubyの組み込みやすさによって、あらゆるプログラムをmrubyで制御可能になり、そこにmruby-cgroupを組み込むことで効率良く、そして簡単にリソース制御できるようになるでしょう。

mruby-cgroupを書いてみたがかなり便利な件、でした。

「mruby-cgroupを書いてみたがかなり便利な件」への2件のフィードバック

コメントは受け付けていません。