web-dev-qa-db-ja.com

ファイルをメモリマッピングすると、標準のI / Oシステムコールよりもパフォーマンスが大幅に向上します。

オペレーティングシステムの概念は言う

ディスク上のファイルの順次読み取りについて検討します標準のシステムコールopen()、read()、write()を使用各ファイルアクセスにはシステムコールとディスクアクセスが必要

または、これまでに説明した仮想メモリ技術を使用して、ファイルI/Oを通常のメモリアクセスとして扱うこともできます。 ファイルのメモリマッピングと呼ばれるこのアプローチでは、仮想アドレス空間の一部をファイルに論理的に関連付けることができます。後で説明するように、これは大幅なパフォーマンスの向上につながる可能性があります。ファイルのメモリマッピングは、ディスクブロックをメモリ内の1つまたは複数のページにマッピングすることによって行われます。ファイルへの最初のアクセスは、通常のデマンドページングを通じて行われ、ページフォールトが発生します。ただし、ファイルのページサイズの部分は、ファイルシステムから物理ページに読み込まれます(システムによっては、一度に1ページ以上のメモリのチャンクを読み込むこともできます)。その後のファイルへの読み取りと書き込みは、通常のメモリアクセスとして処理されます。 read()およびwrite()システムコールを使用するオーバーヘッドが発生するのではなく、メモリを介してファイルを操作することで、ファイルのアクセスと使用が簡素化および高速化されます。

メモリマップファイルのパフォーマンスを分析できますか?

私が正しい場合、メモリマッピングファイルは次のように機能します。メモリマッピングを作成するには、システムコールが必要です。次に、マップされたメモリにアクセスすると、ページフォールトが発生します。ページフォールトにもオーバーヘッドがあります。

ファイルをメモリマッピングすると、標準のI/Oシステムコールよりもパフォーマンスが大幅に向上します。

ありがとう。

8
Tim

ファイルを直接メモリマッピングすると、read()およびwrite()呼び出しで発生するバッファのコピーが回避されます。 read()およびwrite()への呼び出しには、データが格納されているプロセスのアドレス空間内のバッファーへのポインターが含まれます。カーネルはそれらの場所との間でデータをコピーする必要があります。 mmap()を使用すると、ファイルがプロセスのアドレス空間にマップされるため、プロセスはファイルを直接アドレス指定でき、コピーは不要です。

また、最初の呼び出し後にメモリマップファイルにアクセスするときに、システムコールのオーバーヘッドはありません。

実用的な詳細に関心がある場合は、スタックオーバーフローに関連する質問があります。 mmap()と読み取りブロック

10
sebasth

まず、ほとんどのIOオペレーションでは、基盤となるストレージハードウェアの特性がパフォーマンスを支配します。29のSLOW 5400 rpm SATAディスクの不適切に構成されたRAID5アレイは、 S/Wブロックサイズの不一致とファイルシステムの不整合があるRAIDは、ソフトウェアの調整にもかかわらず、適切に構成および配置されたSSD RAID 1 + 0を高性能コントローラーで実行した場合と比較して、パフォーマンスが低下します。あなたが試すかもしれません。

ただし、mmap()を大幅に高速化できる唯一の方法は、同じデータを2回以上読み取る場合、読み取るデータがの場合です。 tメモリの負荷のため、読み取りと読み取りの間にページアウトされます。

メモリマップの手順:

  1. 仮想マッピングを作成するためのシステムコール-非常に高価
  2. プロセスは初めてメモリにアクセスし、ページ違反を引き起こします-高価です(ページアウトされた場合は繰り返す必要がある場合があります)
  3. プロセスが実際にメモリを読み取る

プロセスがデータの各ビットを読み取るためにステップ2と3を1回だけ実行する場合、またはデータがメモリプレッシャーのためにメモリから削除される場合、mmap()は遅くなります。

read()手順:

  1. システムコールは、ディスクからページキャッシュにデータをコピーします(ページフォールトの場合とそうでない場合があります。データは既にページキャッシュにあるため、スキップされます)
  2. ページキャッシュからプロセスメモリにコピーされたデータ(ページフォールトの有無にかかわらず)

メモリマッピングは、メモリを処理するためのページキャッシュからの余分なコピーのために、このパフォーマンスを上回ります。ただし、メモリのページ(またはそれ以下)の単なるコピーを複数回実行して、マッピングのセットアップのコストを抑える必要があります。回数はシステムによって異なります。メモリ帯域幅、システム全体の使用方法、すべて。たとえば、マッピングを設定するためにカーネルのメモリ管理で使用された時間が他のプロセスで使用されなかった場合、マッピングを作成するコストはそれほど高くありません。逆に、システムに多くの仮想メモリマッピングの作成/破棄を伴う多くの処理がある場合(つまり、短期間のプロセスが多数ある場合)、メモリマップの影響IO重要です。

次に、ダイレクトIOを使用するread()があります。

  1. ディスクからプロセスメモリ空間に読み込むシステムコール。 (ページフォールトが発生する場合としない場合があります)

直接IO読み取りは、パフォーマンスを向上させることはほとんど不可能ですが、パフォーマンスを最大化するには、ハードウェアにIOパターンを実際に調整する必要があります。

データの読み取りにより、プロセスが読み取りに使用しているバッファーにページ違反が発生した場合、プロセスはほとんど制御できることに注意してください。

では、メモリマップファイルへのアクセスは高速ですか?たぶんそうかもしれませんし、そうでないかもしれません。

それはあなたのアクセスパターンに依存します。あなたのハードウェアとあなたの他のすべてと一緒にIOパス)。

4 GBのRAMが搭載されたマシンで30 GBのビデオファイルをストリーミングしているときに、データを戻して再度読み取ることがない場合、ファイルのメモリマッピングはおそらく最悪ですそれを読む方法。

逆に、処理中に数十億回、数十億回ランダムにアクセスするデータの100 MBルックアップテーブルと、ファイルがページアウトされないほどの十分なメモリがある場合、メモリマッピングは他のすべてのアクセス方法を破壊します。

メモリマップファイルの1つの大きな利点

メモリマッピングファイルには、他の形式のIOに比べて大きな利点があります。それは、コードの単純さです。メモリにあるかのようにファイルにアクセスするという単純さを打ち負かすのは本当に難しいです。ほとんどの場合、ファイルのメモリマッピングと個別のIO操作を実行することのパフォーマンスの違いは、とにかくそれほど多くはありません。

9
Andrew Henle