coding, photo, plant and demo

*fcgidでrubyが無限増殖して困った件

tech ruby 20151018 235103
8月にサーバをリプレイス して、しばらくサーバで怪現象が起きていた。mysqldが落ちる、memcachedが落ちる、apacheが落ちる、いつの間にかsshにも繋がらなくなる、等。

なんだろうかと思ったら、どうやらこのブログをapache2+fcgid+rubyで動かしてるんだけど、そのrubyが無限増殖していた模様。それでメモリが足りなくなって怪現象が起きていたみたい。
fcgidの設定が腐っているのかと思い、プロセス数の上限などを設けるも効果なし。
cat /etc/apache2/mods-enabled/fcgid.conf 
<IfModule mod_fcgid.c>
  FcgidConnectTimeout 20
  MaxRequestLen 15728640
  FcgidMaxProcessesPerClass 10
  FcgidMaxProcesses 10
  FcgidProcessLifeTime 3600

  <IfModule mod_mime.c>
    AddHandler fcgid-script .fcgi
  </IfModule>
</IfModule>

よくよく調べたら以前はruby 1.8で動かしていたのを今回ruby 2.2で動かすにあたって、文字コード周りの問題を回避するために *0 rubyを起動するときにshell scriptを挟んでいたのが不味かったみたい。

まともに対処するのが面倒なので無理やりこんなことをして動かしてたんだけど、fcgidが管理するプロセスは起動したshell scriptだけで、そこからforkしたrubyの面倒は見ないと思われ野放しのrubyが際限なく増えてしまったというオチらしい。
#!/bin/sh
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
ruby -U index.frb
rubyの前にexecを入れたら問題はそれから1ヶ月以上起きてないし、プロセスも設定以上には増えてない。

というしょっぱい思い出をふと思い出しました。
*0 : こういったスクリプト言語の互換性が無くなる問題はツラミしかないですな。使ってたライブラリも互換性なくなってたり。手軽さを求めてスクリプトを使ってたのになぜこんな目に遭うのか!