I/Oが遅いと専ら評判のErlangを使っていながら、couchdbはI/Oがガチガチに効いてくるデータベースをどうやって作っているのだろうと気になってソースを読んだことがあった。そのときは「へぇ〜」という結論がなかったので特にアウトプットはなかった。平たく言うとfile:pwrite/3, file:pread/3でひたすら追記していくだけ。ふつうにfile:write/2を使えばいいじゃんと思うのだけど、理由はよくわからない。Linkedin driver使ってもWAL(write ahead log)で高速化するのはそう簡単じゃなくて、そこでの更新性能は重要ではないということなんだとは思う。SSD出てくると別に遅くなくなるのかな。
むしろSSDに対して変に追記しているから遅くなる?遅いといってもふつうはHDDで40MB/sも出れば御の字なんだけど、どれくらいなんだろう。毎パケットでdumpしてたら遅くなるだろうからバルクでwriteしてみたら変わるかも。いやさすがにO_DIRECTにしてるわけないだろうからあんまし変わらないか。
知ってはいたんですがここまで遅いとは ... 相当ネックになりつつあります。
大量のパケットを dump するとかなーり遅いです ... 。
追記
@itawasaにbfileというのがあることを教えてもらった。基本的にfopen(2)系を素直にラップしただけなんだけどI/Oが絶望的に遅かった(とウワサだった)当時のyawsのアクセスログかどこかで使われている模様。ざっとソース読んだ印象では、今のfileモジュールにappendオプションつけて使った方が速そうな印象。実際の性能データはid:Voluntasのテスト結果をお待ちあれ。
追記その2
log4erlでもfile:open/2のオプションをbinary, append, rawにしてログファイル開いているみたい。それで十分性能出ているのかな。でもソースみたところだとキューをあちこちに挟んでいてレスポンス悪そう。いやまぁどうせカーネルバッファがあるんだから一緒か。ううむ。