タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

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