linuxでredisがbgsaveを実行するとovercommit_と報告されます.memoryエラー問題


げんしょう
1台のマシンでメモリが切れた場合、bgsaveを行うとエラーが発生する可能性があります.エラーメッセージは次のようになります.

[1946] 23 Mar 15:21:02.308 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

の原因となる
redisのbgsaveコマンドを実行すると、redisは、redisのメモリデータをディスクに書き込むプロセスをforkします.このような利点は、copy on writeが、メモリの消費量を効果的に節約することです.ただし、bgsaveの場合、データ変更がある場合は、同様にメモリを申請する必要があります.メモリを申請するとき、メモリが足りないことに気づいたら、上記のエラーを報告する可能性があります.
カーネルパラメータovercommit_memory
パラメータvm.overcommit_memoryはlinuxのメモリ割り当てポリシーを制御します.このパラメータには3つの値があります.0 1 2 0は啓発的な処理を表します.swapの使用を最小限に抑え、rootは一般ユーザーよりもわずかに多くのメモリを割り当てることができます.既定値.1はovercommitを常に許可していることを示します.一般ユーザ科学計算.2はCommitLimit値を超えてはいけないことを示します.vmによる.overcommit_ratioで定義された値は、物理メモリに加えてメモリを交換する要求を割り当てることができます.vm.overcommit_ratioパラメータはパーセンテージであり、メモリ量に加えてメモリがどれだけのメモリを過剰に割り当てることができるかを決定します.例えばvm.overcommit_ratio値が50で、メモリが1 GBある場合、メモリ割り当て要求が失敗する前に、スワップメモリを加えると、メモリは1.5 GBまでのメモリ割り当て要求を許可することを意味します.
メモリより大きいmallocの申請が許可されているのは、malloc後、必ずしもすぐに使用されるとは限らないからです.
関連英語ドキュメントovercommit_を読むmemory Overcommit and OOM
設定方法
カーネルパラメータを変更するには3つの方法がありますが、root権限:(1)編集/etc/sysctl.conf,vmを変更する.overcommit_memory=1、sysctl-pはプロファイルを有効にする(2)sysctl vm.overcommit_memory=1 (3)echo 1 >/proc/sys/vm/overcommit_memoryの設定が完了するとsysctl-n vmを通過する.overcommit_memory設定が有効であることを確認します.
拡張読書

OOM


linuxがメモリ不足を発見すると、OOM killer(OOM=out-of-memory)が発生します.メモリを解放するために、カーネルスレッドではなくユーザー・ステータス・プロセスを殺すことを選択します.oom-killerが発生した場合、linuxはどのプロセスを殺すかを選択しますか?プロセスを選択する関数はoom_です.badness関数(mm/oom_kill.c)は、プロセスごとの点数(0~1000)を計算します.点数が高いほど、このプロセスは殺される可能性があります.各プロセスの点数とoom_score_adj関係、そしてoom_score_adjは、(−1000が最も低く、1000が最も高い)設定することができる.

合計メモリと使用済みメモリの表示


grep-i commit/proc/meminfo CommitLimitとCommitted_を見るAsパラメータ.CommitLimitは、メモリ割り当ての上限です.CommitLimit=物理メモリ*overcommit_ratio(デフォルト50、すなわち50%)+swapサイズCommitted_Asは割り当てられたメモリサイズです.