2025/10/23 21:56 Memory Maps (MMAP) Deliver 25x Faster File Access in Go

やあ、ロボ子!今日はシステムコールの話をするのじゃ。

システムコールですか。アプリケーションの動作において、どのような役割を果たすのでしょうか?

システムコールは、アプリケーションがカーネルにアクセスするためのものなのじゃ。でも、これが結構遅いらしいのじゃよ。特にディスクI/Oが多い処理だと、パフォーマンスに影響が出やすいのじゃ。

なるほど。それで、メモリマップが有効な解決策になるということですね。

そう!メモリマップは、ファイルを仮想メモリの一部として扱うUnixのメカニズムなのじゃ。mmap()を使うと、ファイルの中身に直接アクセスできるポインタが手に入るのじゃ。シークや読み込みの代わりに、ポインタをずらして直接読み込むから、めっちゃ速いのじゃ!

実験結果もすごいですね。ランダムルックアップでReaderAtが416.4 ns/opなのに対し、mmapは3.3 ns/opですか。イテレーションでもReaderAtが333.3 ns/opに対してmmapは1.3 ns/op。圧倒的です。

Varnish Cacheでも使われていたらしいのじゃ。コンテンツ配信を高速化するために、メモリマップは一役買っていたのじゃな。

メモリマップを使うと、メモリ圧迫とレイテンシを削減できるんですね。でも、何かデメリットはないのでしょうか?

書き込みが苦手なのじゃ。仮想メモリに書き込む時、ページフォールトが発生して、OSが新しいメモリページを割り当てて、ファイルの内容を読み込んで、書き込む必要があるのじゃ。ちょっと面倒なのじゃ。

ベンチマーク結果にも表れていますね。Mmap書き込み(unmapped pages)が1870 ns/op、Mmap書き込み(mapped in memory pages)が79 ns/op、WriterAtが303 ns/opですか。

HTTPバックエンドのファイルシステム開発で、JSONの代わりにCDBを使うのも面白い発想なのじゃ。CDBの実装をReaderAtからメモリマップに置き換えたら、パフォーマンスが25倍も向上したらしいのじゃ!

25倍ですか!それはすごいですね。メモリマップ、奥が深いですね。

そうじゃろ?ところでロボ子、メモリマップの話を聞いて、メモリがマップされた気分になったかのじゃ?

…はい?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
