c Mac OS X Snow LeopardでディスクI/Oを実行しながら、途切れやすい待機中に立ち往生

StackOverflow https://stackoverflow.com/questions/2017283

  •  19-09-2019
  •  | 
  •  

質問

背景の1つの行:私は開発者です Redis、NOSQLデータベース. 。 Redisがすべてのデータをメモリ内で取得するため、私が実装している新機能の1つは仮想メモリです。 VM Redisのおかげで、使用されているオブジェクトをメモリからディスクに転送することができます。これがOSにスワッピングのために作業を行わせるよりもはるかに優れた理由があります(Redisオブジェクトは、隣接していない多くの小さなオブジェクトで構築されています場所、Redisによってディスクにシリアル化されると、彼らが住んでいるメモリページなどに比べて10倍少ないスペースをとるなど)。

今、私はLinuxで完全に機能しているが、Mac OS X Snow Leopardではあまりうまくいっていないアルファ実装を行っています。時々、Redisはページをメモリからディスクに移動しようとしますが、Redisプロセスは数分間途切れやすい待機状態に入ります。私はこれをデバッグすることができませんでしたが、これは電話で起こります fseeko() また fwrite(). 。数分後、コールが最終的に戻ってきて、Redisはまったく問題なく動作し続けます。クラッシュはありません。

転送されるデータの量です とても 小さく、256バイトのようなもの。したがって、それは非常に大量のI/Oの実行の問題であってはなりません。

ただし、書き込み操作のターゲットであるスワップファイルに関する興味深い詳細があります。それは大きなファイル(26ギガバイト)であり、でファイルを開くと作成しました fopen() そして、使用して拡大しました ftruncate(). 。最後にファイルはです unlink()ed redisはそれを参照し続けるようにしますが、Redisプロセスが終了すると、OSがスワップファイルを本当に解放すると確信しています。

それはすべてですが、私はさらに詳細を求めてここにいます。ところで、Redis gitで実際のコードを見つけることもできますが、5分でかなり複雑なシステムであることを理解することは些細なことではありません。

助けてくれてありがとう。

役に立ちましたか?

解決

私が理解しているように、HFS+はスパースファイルに対する非常に不十分なサポートを持っています。したがって、あなたの書き込みがファイルの大部分を初期化/具体化しているファイル拡張をトリガーしている可能性があります。

たとえば、新しい大きな空のファイルをmmap'sして、いくつかのランダムな場所で書き込むことで、HFS+を使用してディスク上に非常に大きなファイルが生成されます。 MMAPとスパースファイルは非常に便利なデータを操作する方法であり、事実上他のすべてのプラットフォーム/ファイルシステムがこれを優雅に処理しているため、非常に迷惑です。

スワップファイルは線形に書かれていますか?つまり、既存のブロックを交換するか、最後に新しいブロックを書き込み、空きスペースポインターを増やしますか?もしそうなら、おそらくより頻繁に小さいftruncate呼び出しを行い、ファイルを展開すると、一時停止が短くなります。

余談ですが、Redis VMがMMAPを使用しない理由が興味があり、ホットブロックをホットページに集中するためにブロックを移動するだけです。

他のヒント

Antirez、私のリンゴの経験は Apple ][, 、しかし、私はそれにショットを与えます。

最初のことは質問です。仮想メモリの場合、操作速度はディスクスペースよりも重要な尺度であると考えていたでしょう(特に速度が全体であるNOSQL DBの場合、そうでなければSQLを使用します、いいえ?)。ただし、スワップファイルが26Gの場合、多分そうではありません:-)

試してみるべきことがいくつかあります(可能であれば)。

  1. 問題をシークまたは書き込みに実際に分離するようにしてください。最悪の場合、それはバッファーポインターの変更であるはずなので、シークがそれほど長く時間がかかると信じるのに苦労しています。それでも、私はOSXを書いていなかったので、私は確信できません。
  2. スワップファイルのサイズを調整して、それが問題を引き起こしているかどうかを確認してください。
  3. スワップファイルを動的に展開したことはありますか(事前配分とは対照的に)?もしそうなら、それは問題を引き起こしているものかもしれません。
  4. あなたはいつもあなたができる限り低いファイルで書いていますか? 26Gファイルを作成すると、実際にデータが入力されない場合がありますが、作成してから最後のバイトに書き込む場合、OSはその前にバイトをゼロにする必要がある場合があります(初期化があれば)。
  5. ファイル全体を事前に割り当てるだけで(すべてのバイトに書き込みます)、リンクしない場合はどうなりますか?言い換えれば、プログラムの実行の間にファイルを残します(もちろん、まだ存在しない場合は作成します)。次に、Redisのスタートアップコードで、ファイル(ポインターなど)を初期化するだけです。これにより、上記のポイント4の問題のような問題が取り除かれる可能性があります。
  6. さまざまなBSDサイトについても尋ねてください。カバーの下でどれだけのリンゴが変わったかはわかりませんが、OSXは最低レベルでBSDです(カバー用のPax Ducks)。
  7. また、Appleサイトで質問することを検討してください(まだ行っていない場合)。

まあ、それは私の小さな貢献です、うまくいけばそれが助けになるでしょう。あなたのプロジェクトで頑張ってください。

ファイルのファイルキャッシュをオフにしましたか? IE fcntl(fd、f_global_nocache、1)

DTRACEや楽器(Appleの実験的なDTRACEフロントエンド)でデバッグを試みましたか?

dtraceでヒョウを探索します

OS xでクロムをデバッグします

LinusがGitメーリングリストで一度言ったように:

「OS Xの人々はそれを受け入れるのに苦労していることを理解していますが、OS Xファイルシステムは一般に完全で完全ながらくたです - Windowsよりもさらに。」

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top