背景の 1 行: 私はNoSQL データベースである Redisの開発者です。私が実装している新機能の 1 つは仮想メモリです。これは、Redis がメモリ内のすべてのデータを取得するためです。VM のおかげで、Redis はめったに使用されないオブジェクトをメモリからディスクに転送できます。OS にスワッピングの作業を任せるよりも、これがうまく機能する理由はいくつかあります (redis オブジェクトは、不連続に割り当てられた多くの小さなオブジェクトで構築されています)。 Redis によってディスクにシリアル化されると、それらが存在するメモリ ページと比較して 10 分の 1 のスペースしか必要としません)。
現在、Linux では完全に動作するアルファ版の実装がありますが、Mac OS X Snow Leopard ではうまく動作しません。Redis がメモリからディスクにページを移動しようとしている間、redis プロセスは数分間、中断できない待機状態になることがあります。これをデバッグできませんでしたが、これはfseeko()
またはの呼び出しで発生しますfwrite()
。数分後、呼び出しは最終的に戻り、redis はまったく問題なく動作し続けます: クラッシュはありません。
転送されるデータ量は非常に少なく、256 バイト程度です。したがって、非常に大量の I/O が実行される問題ではありません。
しかし、書き込み操作のターゲットであるスワップ ファイルに関する興味深い詳細があります。fopen()
でファイルを開き、 で拡大して作成した大きなファイル (26 ギガバイト) ですftruncate()
。最後に、unlink()
Redis が参照を取得し続けるようにファイルが編集されますが、Redis プロセスが終了するときに、OS が実際にスワップ ファイルを解放することは確実です。
これですべてですが、詳細についてはここにいます。ところで、Redis git で実際のコードを見つけることもできますが、かなり複雑なシステムであることを考えると、5 分で理解するのは簡単なことではありません。
助けてくれてありがとう。