Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

PerlではCPUリソースをフル活用できないって本当?

PerlではCPUリソースをフル活用できないって本当?

これは、半分くらいは当たっているけれど、半分くらいは間違っている。

プリフォークすれば、CPUリソースをフル活用できる

Webサーバーの構成なんかを考えてほしいんだけれど、MojoliciousなんかのWebサーバーは、プリフォーク + 非同期I/Oという構成をとっている。

経験則についてMojoliciousのドキュメントに書かれているのだけれど、CPUの個数 × 2 にプリフォークする子プロセスの数を設定するとパフォーマンスが最適になるらしい。

つまり、CPUが4つある場合は、フル活用したい場合は、Mojoliciousのhypnotoadの設定ファイルで、フォークする子プロセスの数を、8にすればよいわけだ。

{
  workers => 8
}

forkというのは、プロセスを作成するコマンドで、複数プロセスを立ち上げれば、CPUリソースをフル活用できるということだ。

Webサーバー用途であれば、PerlはCPUリソースをフル活用できると考えていい。

半分当たっているというのは?

子プロセスを立ち上げなければ、PerlはCPUリソースをフル活用することはできないから。

スレッドが正しくサポートされているjavaのような言語や、並列処理が最初から想定されているgoのような言語であれば、一つのプロセス内で、スレッドかスレッドに近い機構を使って、CPUをフル活用できる。

一方Perlの場合は、ひとつのプロセス内で、CPUリソースをフル活用することはできない。

Perlのスレッドは非推奨機能で、ほとんど壊れているといってもよい。

理由は、

  • スレッドがメモリリソースを使いすぎる
  • 他のユーザーが作成したモジュールがスレッドセーフを意識していない

から。

現在は、Windowsでforkをエミュレートするためだけに、スレッド機構は利用されていると考えていたほうがいい。

通常の使用には、とても耐えられない。

だから、ひとつのプロセス内では、CPUリソースをフル活用できないという意味で、半分当たっている。

XSを使えば、C言語で並列処理は書ける

Perlからは無理だけれど、XSの世界に降りてくれば、GPUSIMDを使った処理は書ける。バインディングを使えば、CPUやGPUの並列処理機構を使って、リソースを最大限に活用することはできる。

でもXSはとっても記述が長く、難しいので、これを簡単にするためのSPVMというプロジェクトを作成している。