mod_mruby で特定のCGIのCPU使用率を制限してみたら感動した話
RubyKaigiで知った、mod_mruby/ngx_mrubyならリクエスト単位でリソース割り当てできるという話、管理下のサーバで特定のCGIへのアクセスのみCPUリソースを制限したくなったので試してみました。
結論から言うと、非常に便利です。
- サーバの再起動なしにルールを変更できる(パフォーマンスへの影響もあまりありません!)
- Rubyでルールを書ける
mruby-cgroupとmod_mrubyでApacheのリソースを制御、そこから得られるcgroupの挙動とは - 人間とウェブの未来
環境
Cgroups
Cgroupsについてはこのあたり
cgroup について理解する - いますぐ実践! Linuxシステム管理 / Vol.228
CentOS6の場合は
$ sudo yum install -y libcgroup
$ sudo vi /etc/cgconfig.conf
cpu = /cgroup/cpu;
$ sudo chkconfig cgconfig on
$ sudo service cgconfig start
でインストールできます。
mod_mruby + mruby-cgroup
事前に必要なパッケージをインストールしておきます。
$ sudo yum install -y hiredis-devel libcgroup-devel
あとは参考記事の通りにインストール。
mruby-cgroupとmod_mrubyでApacheのリソースを制御、そこから得られるcgroupの挙動とは - 人間とウェブの未来
また、Apacheのプロセスはapache権限で動作しているので、事前にcgroup以下にapache権限でアクセスできるcgroupを作っておく必要があります。例えば/sys/fs/cgroup/cpu/apacheを作り、chmod -R apache.aparchで権限を変更しておきましょう。
CentOSの場合は/cgroup/
以下になるのでこんな感じです。
$ sudo mkdir /cgroup/cpu/apache
$ ls /cgroup/cpu/apache/
cgroup.event_control cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release
cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks
$ sudo chown -R httpd:httpd /cgroup/cpu/apache
/cgroup/cpu/apache
のapache
の部分は、cgroup_attach.rb
の
c = Cgroup::CPU.new("apache/mod_mruby_group")
の部分になります。実行後ls /cgroup/cpu/apache
してみるとわかりやすいとおもいます。
性能とか
参考先のスライドに詳しいです。
https://speakerdeck.com/matsumoto_r/rubykaigi-2014-mod-mruby-ngx-mruby