1

FreeBSD と大きな mmap で問題が発生しています。Linux では同じ問題は発生しません。

プログラムの起動時に、常に 1 GB のマップを取得できます。ただし、ファイルが置き換えられて再マップされるリロード操作があります。通常、新しいマップは毎回少しだけ大きくなるため、古い mmap の場所にはうまく収まりません。このリマップは、FreeBSD ではしばしば失敗しますが、Linux ではほとんど失敗しません。(ASLR を使用する Linux ではより頻繁に失敗します。FreeBSD はASLRを使用しますか?)

これは、ライブラリが他のライブラリをロードし、プログラムの実行中に仮想メモリ空​​間を断片化するメモリ割り当てが行われたためだと思います。おそらく、これを引き起こす FreeBSD の malloc 実装またはライブラリのロードの特殊性があります。

私はそれが機能する可能性を高めるためにできることを探しています。

私が考えていることの 1 つは、ファイル サイズが実際には 890 MB であっても、常に 1 GB のスペース全体を mmap することです。私がそれを機能させることができれば、新しい 895 MB ファイルを再マップするための 1 GB スロットを常に確保できます。

4

1 に答える 1

3

この問題は、アドレス空間の十分な大きさの連続ブロックがないことが原因である可能性があります。1Gb mmap を使用する 32 ビット システムで発生する可能性が非常に高いです。

64 ビット システムのみを使用するか (現在、ほとんどの企業が運用サーバーで使用しています)、代わりにいくつかの小さな領域を mmap() することを検討してください。

あなたはこれを回避するつもりはありません。

于 2010-09-09T16:11:26.697 に答える