読者です 読者をやめる 読者になる 読者になる

元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

mod_mruby で特定のCGIのCPU使用率を制限してみたら感動した話

RubyKaigiで知った、mod_mruby/ngx_mrubyならリクエスト単位でリソース割り当てできるという話、管理下のサーバで特定のCGIへのアクセスのみCPUリソースを制限したくなったので試してみました。

結論から言うと、非常に便利です。

  • サーバの再起動なしにルールを変更できる(パフォーマンスへの影響もあまりありません!)
  • Rubyでルールを書ける

[JA] Resource Control Architecture scripting with mruby for a Web Server Separating Computer Resources Virtually at Each HTTP Request - RubyKaigi 2014

mruby-cgroupとmod_mrubyでApacheのリソースを制御、そこから得られるcgroupの挙動とは - 人間とウェブの未来

環境

Cgroups

Cgroupsについてはこのあたり

cgroup について理解する - いますぐ実践! Linuxシステム管理 / Vol.228

cgroups - Wikipedia

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/apacheapacheの部分は、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