54

すべて:これが「free-m」を使用したサーバーメモリ情報です

              total       used       free     shared    buffers     cached
 Mem:         64433       49259      15174          0          3         31
 -/+ buffers/cache:      49224      15209
 Swap:         8197        184       8012

私のredisサーバーは46Gメモリを使用しましたが、ほぼ15Gメモリが空いています

私の知る限り、フォークはコピーオンライトであるため、必要なカーネル構造をmallocするのに十分な15Gの空きメモリがある場合でも失敗することはありません。

さらに、redis-serverが42Gメモリを使用した場合、bgsaveは問題なく、forkも問題ありません。

フォークリターンを成功させるために調整できるvmパラメーターはありますか?

4

3 に答える 3

93

具体的には、RedisFAQから

Redisのバックグラウンド保存スキーマは、最新のオペレーティングシステムでのforkのコピーオンライトセマンティクスに依存しています。Redisforks(子プロセスを作成)は、親の正確なコピーです。子プロセスはDBをディスクにダンプし、最後に終了します。理論的には、子は親がコピーであるのと同じ量のメモリを使用する必要がありますが、実際には、ほとんどの最新のオペレーティングシステムによって実装されたコピーオンライトセマンティクスのおかげで、親と子のプロセスは共通のメモリページを共有します。ページは、子または親で変更された場合にのみ複製されます。理論的には、子プロセスの保存中にすべてのページが変更される可能性があるため、Linuxは子が使用するメモリの量を事前に知ることができません。したがって、overcommit_memory設定がゼロに設定されている場合、RAMの空き容量がない限り、フォークは失敗します。すべての親メモリページを実際に複製する必要があります。

overcommit_memoryを1に設定すると、Linuxはリラックスして、より楽観的な割り当て方法でフォークを実行するようになります。これは、Redisに必要なことです。

Redisは、OSがディスクへの書き込みに必要と考えるほど多くのメモリを必要としないため、フォークに先制的に失敗する可能性があります。

于 2015-04-23T21:11:58.283 に答える
75

変更/etc/sysctl.confおよび追加:

vm.overcommit_memory=1

次に、次のコマンドでsysctlを再起動します。

FreeBSDの場合:

sudo /etc/rc.d/sysctl reload

Linuxの場合:

sudo sysctl -p /etc/sysctl.conf
于 2016-06-08T00:03:27.447 に答える
32

proc(5)のマニュアルページから:

/ proc / sys / vm / overcommit_memory

このファイルには、カーネル仮想メモリアカウンティングモードが含まれています。値は次のとおりです。

0:ヒューリスティックなオーバーコミット(これがデフォルトです)

1:常にオーバーコミットし、チェックしない

2:常にチェックし、オーバーコミットしない

モード0では、MAP_NORESERVEが設定されたmmap(2)の呼び出しはチェックされず、デフォルトのチェックは非常に弱く、プロセスが「OOM-killed」になるリスクがあります。Linux 2.4では、ゼロ以外の値はモード1を意味します。モード2(Linux 2.6以降で使用可能)では、システム上の仮想アドレス空間の合計は(SS + RAM *(r / 100))に制限されます。ここで、SSはサイズです。 RAMは物理メモリのサイズであり、rはファイル/ proc / sys / vm/overcommit_ratioの内容です。

于 2012-08-01T05:02:42.133 に答える