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件のフィードバック
コメントは受け付けていません。