ソフトウェア

プログラムのファイル読み書きで「mmap」を使うと速度が向上する理由とは?


ソフトウェア開発において「ファイルの読み書き」は使用頻度の高い操作であり、速度の向上はソフトウェア全体のパフォーマンスに大きく影響します。そんなファイルの読み書き操作を行う際に「mmapを使った方が通常のシステムコールよりも高速にファイルを操作できる理由」について、ブリティッシュコロンビア大学の准教授であるAlexandra Fedorova氏が説明しています。

Why mmap is faster than system calls | by Alexandra (Sasha) Fedorova | Medium
https://sasha-f.medium.com/why-mmap-is-faster-than-system-calls-24718e75ab37

OS上でユーザーがプログラムを実行する際、プログラムは「ユーザー空間」と「カーネル空間」と呼ばれる2種類の領域を利用します。ユーザー空間はプログラムが自由にアクセスできますが、カーネル空間はプログラムからは直接アクセスできません。リソース空間を2つに分離することはセキュリティの観点からは優れていますが、ファイルの読み書きといったハードウェア操作を伴う処理はカーネル空間でしか行えないため、ユーザーがカーネル空間を扱えないのは不便です。


そこでユーザーからもカーネル空間を扱えるよう、ユーザー空間とカーネル空間の橋渡しをしてくれるのが「システムコール」です。例えばファイルを読み込む際はopenシステムコールを用いてファイルの入出力を行うためのファイルディスクリプタを作成し、readシステムコールを呼び出してファイルディスクリプタからファイルのデータをバッファに読み込み、データの操作を可能にします。

上記はOSでファイル操作を行う際の一般的な手続きですが、ファイルの読み書きはmmapシステムコールでも可能です。mmapはファイルをOSの仮想記憶上にマッピングすることができるシステムコールで、マッピングした仮想記憶のアドレスからファイルの読み書きができるので、他のシステムコールを使う必要がなくなるとのこと。

Fedorova氏は通常のシステムコールを用いた場合とmmapを用いた場合でのファイル操作速度を比較するため、それぞれの場合におけるシーケンシャルリードとランダムリードの速度を4KB、8KB、16KBのブロックサイズで測定したとのこと。以下のグラフはデータがバッファキャッシュに存在していた場合のシーケンシャルリード速度の測定結果で、黄色で示されるmmapでの読み込み速度の方が速いことがわかります。


ランダムリードの速度もシーケンシャルリードの場合と同じく、mmapによる読み込み速度が通常のシステムコールによる読み込み速度を上回っています。


16KBのブロックサイズでシーケンシャルリードを行った際のCPU利用状況を見てみると、データをカーネル空間からユーザー空間へコピーする「copy_user_enhanced_fast_string」にかかった時間がプログラム全体の実行時間における約61%を占めていることがわかります。他にも「functions do_syscall_64」や「entry_SYSCALL_64」といった、カーネル空間からユーザー空間への移動を伴う命令に約15%の時間が割かれています。


mmapを利用した場合、約61%が「__memmove_avx_unaligned_erms」に費やされていたとのこと。つまり、通常のシステムコールによる処理の大部分を占める「copy_user_enhanced_fast_string」とmmapによる処理の多くを占める「__memmove_avx_unaligned_erms」の効率性の違いが、読込速度の違いに大きく影響すると言えます。


両者の効率性の違いはデータを複数ストリームで扱えるAVXに対応しているかどうか。「__memmove_avx_unaligned_erms」はその名前の通りAVXに対応しておりメモリの帯域を効率的に使用できますが、「copy_user_enhanced_fast_string」はAVXに対応しておらず、帯域をフルに利用できないとのこと。Fedorova氏はこれが通常のシステムコールよりもmmapの方が高速にファイル操作を行える大きな理由だと説明しています。

通常のシステムコールがAVXに対応していない理由は、システムコールごとにレジスタの保存とレストア操作が発生し、ユーザー空間とカーネル空間を移動する処理の負荷が大きくなってしまうからだとのこと。Fedorova氏は「ファイル操作を通常のシステムコールからmmapに置き換えることで、アプリケーションをより高速に動作させることができるかもしれません」と語っています。

この記事のタイトルとURLをコピーする

・関連記事
IntelのIce Lake世代CPUは「命令の種類による最大クロック制限」が緩和されている - GIGAZINE

IntelがIce Lake世代のCPUに施した「目立たないパワーアップ」とは? - GIGAZINE

コンピューターのメモリ管理を担う「仮想記憶」の仕組みとは? - GIGAZINE

HDDのコントローラーをハッキングするとデータの傍受やHDD基板へのLinuxインストールが行える - GIGAZINE

in ソフトウェア, Posted by darkhorse_log

You can read the machine translated English article here.