PPerl と plagger

Perl Hacks に載ってた Hack #81PPerl を plagger で試してみよう、と思ったら 既に試していらっしゃる方 がおりました。

というわけで、PPerl が何なのかは id:odz さん の上記エントリを見てください。

と、これだけでも何なので、PPerl について気になって調べたことをメモ。まず、global セクションだけ書いた config.yaml で plagger を起動して、ps コマンドで仮想メモリ容量を見てみると、こんな感じになってます。

$ pperl plagger                                           [~/plagger]
Plagger [info] plugin Plagger::Plugin::Aggregator::Simple loaded.
$ ps -eo pid,ppid,vsz,args|grep plagger|grep -v grep           [~/plagger]
 6470     1 10772 plagger
 6471  6470 18592 plagger
 6472  6470 10772 plagger
 6473  6470 10772 plagger
 6474  6470 10772 plagger
 6475  6470 10772 plagger

さらにもう2回ほど pperl plagger を実行すると、

$ pperl plagger                                           [~/plagger]
Plagger [info] plugin Plagger::Plugin::Aggregator::Simple loaded.
$ pperl plagger                                           [~/plagger]
Plagger [info] plugin Plagger::Plugin::Aggregator::Simple loaded.
$ ps -eo pid,ppid,vsz,args|grep plagger|grep -v grep           [~/plagger]
 6470     1 10772 plagger
 6471  6470 18592 plagger
 6472  6470 18582 plagger
 6473  6470 18582 plagger
 6474  6470 10772 plagger
 6475  6470 10772 plagger

さらにもう何回か実行してみる。

$ ps -eo pid,ppid,vsz,args|grep plagger|grep -v grep      [~/plagger]
 6470     1 10772 plagger
 6471  6470 18592 plagger
 6472  6470 18592 plagger
 6473  6470 18592 plagger
 6474  6470 18592 plagger
 6475  6470 18592 plagger

こんな感じで、プロセス ID 6470 が大元の親プロセスになって、他の plagger プロセスをフォークしていて、 親プロセスの仮想メモリ容量が 10772KB、他の子プロセスの仮想メモリ容量との差分である 7820KB が plagger 関連モジュールが確保している仮想メモリ容量なんだろうなぁ、ということが分かります。

で、今度は普段使っているコンフィグで起動してみます。

$ pperl plagger --config=gmail.yaml
Plagger [info] plugin Plagger::Plugin::Subscription::Bloglines loaded.
Plagger [info] plugin Plagger::Plugin::Subscription::Config loaded.
Plagger [info] plugin Plagger::Plugin::CustomFeed::Simple loaded.
Plagger [info] plugin Plagger::Plugin::CustomFeed::YajiumaWatch loaded.
Plagger [info] plugin Plagger::Plugin::CustomFeed::KotonohaInbox loaded.
Plagger [info] plugin Plagger::Plugin::Filter::EntryFullText loaded.
Plagger [info] plugin Plagger::Plugin::Filter::TruePermalink loaded.
Plagger [info] plugin Plagger::Plugin::Filter::StripRSSAd loaded.
Plagger [info] plugin Plagger::Plugin::Filter::BloglinesContentNormalize loaded.
Plagger [info] plugin Plagger::Plugin::Filter::HatenaDiaryKeywordUnlink loaded.
Plagger [info] plugin Plagger::Plugin::Filter::Rule loaded.
Plagger [info] plugin Plagger::Plugin::Widget::Delicious loaded.
Plagger [info] plugin Plagger::Plugin::Widget::BloglinesSubscription loaded.
Plagger [info] plugin Plagger::Plugin::Publish::Gmail loaded.
... snip ...
$ ps -eo pid,ppid,vsz,args|grep plagger|grep -v grep      [~/plagger]
 6470     1 10772 plagger
 6471  6470 18592 plagger
 6472  6470 18592 plagger
 6473  6470 18592 plagger
 6474  6470 18592 plagger
 6475  6470 37388 plagger

と、こんな感じで、ID 6475 のプロセスが大きくなってます。これがこのコンフィグで増えた Plagger Plugin モジュールのメモリ容量みたいですね。

といったように、pperl を最初に起動した時のモジュールだけをメモリ上に確保するだけではなく、その後新たに読み込まれたモジュールもちゃんとメモリ上に確保してくれているようです。当たり前っちゃ当たり前の気もしますが、何となく気になったので。

他に気になった点として、起動するプロセスの数を増やしたり、制限したりできるのかな、と思ったところ、以下の様なオプションがあるので、この辺りも制御できるようですね。

$ pperl --help                                            [~/plagger]
pperl version 0.25
Usage: pperl [options] filename
perl options are passed to your perl executable (see the perlrun man page).
pperl options control the persistent perl behaviour

PPerl Options:
  -k  or --kill      Kill the currently running pperl for that script
  -h  or --help      This page
  --prefork          The number of child processes to prefork (default=5)
  --maxclients       The number of client connections each child
                       will process (default=100)
  -z  or --anyuser   Allow any user (after the first) to access the socket
                       WARNING: This has severe security implications. Use
                       at your own risk
  --no-cleanup       Skip the cleanup stage at the end of running your script
                       this may make your code run faster, but if you forget
                       to close files then they will remain unflushed and unclosed