2013/10/10
mmap
が、「mmapだと必ず速くなる」なんて迷信ですから!!!
これらの記事で紹介されているベンチマークで read が mmap よりも遅く見えるのは、非常に大きなバッファを確保しているから。正しいコードを書けば、シーケンシャルアクセスを行うケースにおいて read(2) が mmap(2) より大幅に遅いということは、まず起こらない。むしろ、read(2) のほうが mmap(2) よりも速くなるというケースも実際には多い。
以前、データベースを書いていた時にひっかかったのは、mmapは速いんだけど munmapに思わぬ時間がかかることがあるってこと。1~2年前のLinuxでの話。
クエリエンジンが 数GB~数10GBのデータファイルをいくつもread-onlyのmap_sharedでmmapしてて、 別プロセスがデータファイルを追記更新したので読み直さないとならない、って場合で、 ディスクI/Oが静かなのにクエリが数秒とかのオーダーでつっかえることがある。 読み直しに時間かかってるなら別だけどそのページは既にバッファに入ってるはずで (別のプロセスが先行してマッピングしてる)、 どこでつっかえてるのか調べていったらmunmapだった。 カーネル内部で何かが競合してるのかとも思ったけど深くは追求してない。 その時は、mremapを使えば時間がかからないことがわかったのでそれで回避した。
この例に限らず、リソースの確保を速くしたはいいが 解放に思わぬ時間がかかることがあるってのはちょくちょくある落とし穴かも。
Tag: Programming
Post a comment