ことの起こりは Haskell night 2009 だった。パネルの司会をしてくださった赤池さんから、「Simon Peyton Jones さんが2010年4月に日本にやってくるので、日本の人達と会いたいと言っている」と相談された。Simon さんとは「ビューティフルコード」の編集でメールをやり取りして、知り合いになったらしい。
この件は僕が引き取ることになり、紆余曲折の末、Haskellers Meeting 2010 Springを開催できることとなった。僕は「Haskell で Web サーバーを実装してみました」という発表をした。頑張って、資料も日本版と英語版を用意したし、両方の言語で喋って説明したので、Simon さんも理解してくれたらしい。
結局、この発表で言いたかったのは、「Haskell の IO マネージャーは select システムコールを使っているので、同時に 1024 以上のコネクションをさばくサーバーを作るのは難しいし、効率も悪いよ」ということだ。この問題は、Bryan O'Sullivan さんと Johan Tibell さんが、epoll/kqueue を使う IO マネージャーを書いて解決した。
あるとき、Simon さんから「Parallel GHC プロジェクト」に応募してくれないか」というメールを受け取った。僕は並列というと Data Parallel という言葉は聞いたことがあるぐらいのレベルだし、僕がやっているのは並行(Concurrent)だから、ふさわしくないと思ったが、「並行も対象にしているので、ぜひ」と言われた。
このプロジェクトは、Well-Typedという Haskell のコンサル会社が、MSR から請け負っている。プロジェクトに応募してみると、IIJ-II も Well-Typed のパートナーとして選ばれた。金銭的なやり取りがあるのは、MSR と Well-Typed 間のみである。
プロジェクトの一環として、まず最初に GHC7 の IO マネージャーが本当に安定して動くのかを確かめようと、mighttpd を GHC7 でコンパイルし、1プロセスのみでたくさんのコネクションを受け取るように設定して動かしてみた。すぐに、まともに動いていないことが判明した。Well-Typed の Dmitry Astapov さんが僕の担当者になり、2人での長いデバック作業が始まった。
これまで見つけたバグは以下の通り。
- Mac ではデーモン化すると kqueue ソケットがなくなってしまう
- シグナルがおかしい
- イベントログがおかしい
- IO マネージャーがデッドロックする可能性がある
- getContents の挙動が変
- Mac では hsc2hs がまともに動かない
1から4は修正済みで GHC 7.0.2 用のブランチには取り込まれている。4 は、network パッケージにも関係があるが、最新の 2.3.0.1 では修正済み。5 は HEAD では直っていて、7.0.2 のブランチに取り込まれるのを待っている状況。6 は作業中とのことだが、いつ直るのか分からない感じ。これが直ると 7.0.2 rc2 が出るのだそうだ。
という訳で、mighttpd は GHC 7.0.2 (となるべきバージョン)で、まともに動き始めた。GHC 7.0.2 以降では、外部と通信する軽量なユーザースレッドを大量に使うことが可能になるので、そういう特徴を活かしたアプリケーションが増えると面白いと思う。
追記
上記の問題はすべて解決されました。7.0.2 のリリースに期待しましょう。