2

Linux で msync(MS_ASYNC) を使用したページ フラッシュの順序は、ページが書き込まれた順序と同じであることが保証されていますか?

状況に依存する場合、それらが同じ順序であることを確認する方法 (サーバーへのフル アクセス) はありますか?

バックグラウンド

私は現在、OpenLDAP Symas MDBを永続的なキー/値のストレージとしてMDB_MAPASYNC使用していますが、使用していmsync(MS_ASYNC)ないため (ソースコードを調べました)、書き込みが非常に遅く、データを処理している間でも、単一のコアが IO を永続的に待機しています。 1MB/s 未満の場合もあります。分析した結果、問題は多くの小さな IO Ops にあるようです。使用するMDB_MAPASYNCディスクの最大速度に簡単に到達できますが、MDB のドキュメントには、その場合データベースが破損する可能性があると記載されています。残念ながら、私にはコードが複雑すぎます/現在、コードベース全体を段階的に調べて、なぜそうなるのかを調べる時間はありません。また、MDB が提供する機能 (トランザクション) の多くは必要ありません。 、カーソル、ACID 準拠)、そのため、mmap に裏打ちされた独自の KV ストアをmsync(MS_ASYNC)作成することを考えていました。フラッシュされていないページが最後に触れたデータのみを失い、データベースが破損したりしないように、確実に作成するようにします。他のデータを失います。

しかし、そのためには私の質問への回答が必要です。残念ながら、グーグルやLinuxメーリングリストを調べてもまったく見つけることができません(msyncパッチに関するメールをいくつか見つけましたが、他には何もありません)。

ちなみに、私は他にも利用可能な永続的な KV ストアを何十も調べましたが、自分に適したもの (書き込みが速く、使いやすく、組み込み (http サービスなどはありません)、決定論的な速度) を見つけることができませんでした。 (したがって、ガベージ コレクションや、leveldb のようなランダムに実行される圧縮はありません)、適切なスペース要件 (追加のみのデータベースはありません)、可変キー長、バイナリ キーとデータ)、しかし、ここで私を助けることができるものを知っていれば、私は' d も非常に感謝しています。

4

2 に答える 2

1

msync(MS_ASYNC)バックグラウンドで動作する IO エレベータ アルゴは、デバイスへのスループットを最大化するために書き込みをマージおよび順序付けすることにより、効率を最大化しようとするため、ストアの順序付けは保証されません。

于 2015-01-17T21:37:59.783 に答える
1

からman 2 msync:

Linux 2.6.19 以降でMS_ASYNCは、カーネルがダーティ ページを適切に追跡し、必要に応じてそれらをストレージにフラッシュするため、実際にはノーオペレーションです。

残念ながら、マッピングをそのバッキング ストレージと同期する唯一のメカニズムはブロッキングMS_SYNCです。これには順序の保証もありません (1 MiB 領域を同期する場合、256 4 KiB ページは任意の順序でドライブに伝播できます。すべてmsync返された場合、1 MiB のすべてが同期されていることがわかります)。

于 2016-01-16T21:26:26.517 に答える