CGIでforkをなくす仕組み。

D言語cgiはforkがあって遅いからなぁって話が出てた。
いや、でも、2chとかでもcgi使ってるし、forkを気にしない手はあるだろうと思った。私が知ってる限り、fastcgiはどのような言語のCGIでもちょっと手を加えるだけで常駐する。mod_perlperl専用の常駐させるためのモジュールだ。phpも常駐するような仕組みを持っている。fastcgiを自分でインストールして使ったことがないので、拾ってきてみて実験してみることに。Windows版Apache2のモジュールを入れてみる。気になるであろうことは、常駐しちゃうと、メモリリークが心配だってこと。これは、D言語についても言えるだろう。実際動かしてリークがないことを確認すればよいんだろうが、runtimeに問題がまったく無いとしても、他のライブラリに問題があればリークしてしまう。そのための対策として考えられるのは、一定如何ごとに、再起動をかけるってこと。例えば、100回起動したら、落とすとか、10分たったら落とすとか。で、落とすやり方をやってみた。で、こけた。なんか、2,3回再起動すると、がりがりHDが言い始めて、うまく返ってこなくなった。いろいろ、いじりまわしたけど駄目だった。で、自分で、常駐してるソフトが子プロセス起動してそいつを持っててあげようとか思った。仕組みが分かるだろうし。perlで作ってたのだけどそれが結構難しい。1日かけてちゃんとろくなものにならない。ソケット1個作って通信しながら、、、みたいな物だったのだけど。親のfastcgiにくっついてるプロセスが死んだときに子プロセスがいっしょに死んでくれないのだ。親が死んだと子に伝える方法が見つからなくて、、、。タイムアウトする方法しかないかな、なんて考えたわけだけど、こんがらがってきたからやめた。

これ作ってて思ったのは、きっと、2chとかaaacafeとかcgiのfork対策ってもっと何か凄い仕掛けをもってるんじゃないかなということ。2chは全cgiを何らかの形でApacheに常駐。aaacafeは出力をフィルタリングして広告入れるてるのだから、モジュールを作るようなことは当然してる。さらに、挙動をみてると、最初の1回目は重くて2回目から軽くなるから、もしかしたら、普通のCGIを常駐させちゃうような仕組みを持ってたりするのかなと思いました。妄想だけど。プロセス起動のカーネルがらみの部分をいじってしまって、プロセス落ちるところで、待ったをかけちゃって常駐。次からはそのプロセス起動しないで、そのメモリイメージから、実行しちゃうと。実行する際、書き換わったら再起動とか、無くなったら、落とすとか言う処理もすると。実行中のプログラムを消せないなら、実行は見えないファイルを作ってそれを実行すると。で、ある一定時間がたったら落とすと。そんなのあればいいよなと思ったわけでした。psとか見る限りそんなことしてるとは思えないけどね。psから見えないようにしちゃえばいいんだろうし。

私には到底できそうにないけど、技術力があれば可能だろう。

ほんとのところは単に使ってないファイルより使ってるファイルのほうが速くアクセスできるってだけの話だと思う。

っていうか、私のプログラムは、そんな多くの人、使っていない。仕事でやってたときは、使ってたんだけど、2週間くらいかけてApacheモジュール作ったけど、メモリリークしちゃって結局使い物にならなかったし。

でも、その位の話は考えておいて損はないんだろうなぁ。

もし、凄いって話題にでもなって広まったときのことを考えると。凄いけど、遅いんだよね。ってところに、ちゃんとした答えを示せればいいんだろうから。安心して使えるものとしては、mod_dってのがあるよって話が一番よさそう。fastcgiは安定性にかけるイメージがある。perlなら、mod_perlとかが安全なイメージがあるから、mod_dがApacheプロジェクトで作られているって話になれば、安心感があっていいだろう。

しかし、ネイティブ言語のサーバーサイドコンパイルをやって、セキュリティ上の安全性を持つことってできるのかなぁ?

VMで出来るんだから、CPUにそういう機能を持たせればできないこたぁないんだろうなぁ。スーパーユーザモードみたいなのとか、メモリ保護機能とかCPUが持ってるし。ハードに頼るってのは一つの解だろうな。

あとは、言語的な機能としてカバーできるか?コンパイラに、制限付きコンパイルを実装できる機能を用意できるか?バッファーオーバーフローとやらを起こさないようにできるのか?配列の範囲外にアクセス可能かどうかって話になるのかな?可能だよなぁ。それは問題だ。不可能にするモードが欲しいな。セキュリティモデルをしっかり持った、ネイティブコンパイル言語か。ナンカ知らんけど、aaacafeでsystem関数使えないよなぁ。あれどうやってるんだろう?似非system関数入りライブラリを提供してるのかな?使える機能を限定するには、リンクするライブラリの関数を制限すればいいのだね。

ログインする機能をつけて、このユーザーだったら、コンパイルっていうのは手かもな。SSL使えばさらに完璧になるのかな。開発者にしかコンパイルできない。UPするのは開発者なんだからそれは手だな。

JSPを一般ユーザーがUPできるなんて聞いたことないもんな。
JSPをカスタマイズすることで、一般ユーザーが好きなようにデザインを変更することが出来るような、そんなシステムあるのかなと。危なそうだなぁ。大体Javaメモリ食いすぎなんだよな。
Tomcatとか、System.exit(0)でサーバー死ぬんじゃ?今はもう大丈夫なのか?
http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/security-manager-howto.html
大丈夫なんだね。
無料でJavaが使えるようにする研究とかxreaではやってるみたいだし、これ以上に沢山考えて、まだ駄目なんだろうなぁ。大変だ。

うーん。これと同じような仕組みを、gdcコンパイラにリンクできるモジュールとして指定できる仕組みがあればいいのか。
nmとかつかってみればいいのかな?ldとか駆使すればできるのかな?

うう、dspとやらをビルドしてみたいけど、d言語のdll作った経験ほとんど無いし、めんどくさそうだ。いい勉強になるけど。

というか、さっさとプログラムせぃ。