2017-02-28 6 views
4

私は同じマシン上で2つの赤いサーバを稼働させています。 2番目のログファイルには、次のような通知を含むいくつかのインスタンスがあります。バックグラウンドで保存できません(redis-server)

[50818] 19 Feb 06:41:05.007 * 10 changes in 300 seconds. Saving... 
[50818] 19 Feb 06:41:05.007 # Can't save in background: fork: Cannot allocate memory 

対照的に、最初のログファイルには正常なDBセーブが含まれています。私が記憶に残っていれば、私は両方のログが似ていると思います。私にはこの問題が1つしかないのに対して、もう1つは問題があると私は困惑します。すべてのリード?

さらに、私はthis blog postに私を誘導しました。これは、コマンドラインでsysctl vm.overcommit_memory=1を実行すると問題が改善されると主張しています。これがどのように役立つかについての説明はありません。赤ちゃんの文脈でここで何が起こっているのか誰かが説明できますか?パーRedis FAQsとして

+4

可能な複製(http://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory)[フォークがメモリを割り当てることができませんので、Redisのをbgsaveに失敗しました] – kennytm

答えて

14

背景省は、私は自由な多くのRAMをした場合でも、Linuxでのフォーク()エラーで失敗しています!

短い答え:echo 1 > /proc/sys/vm/overcommit_memory :)

そして今、長い1:

Redisの背景保存スキーマは、コピー・オン・ライト現代のオペレーティングシステムで フォークの意味に依存している:Redisのフォークは、(作成されます子の のプロセス)が、親の正確なコピーです。子プロセスはディスク上の のDBをダンプし、最後に終了します。理論的には、子はコピーとして親として多くのメモリを として使用する必要がありますが、実際には最新のオペレーティングシステムで実装されている copy-on-writeセマンティクスのおかげで 親プロセスと子プロセスが共有メモリページを共有します。 ページは、子で変更された場合、または 親で変更された場合にのみ複製されます。理論的には、子どもが プロセスを保存している間にすべてのページが変更される可能性があるので、Linuxは の子供がどれくらいのメモリを使用するかを先に伝えることができないので、の設定が0に設定されていると、実際に のすべての親メモリページを複製する必要があります。その結果、 にRedisデータセットが3 GB、空きメモリが2 GBの場合、 は失敗します。 overcommit_memoryを1に設定すると、Linuxはリラックスして というフォークをより楽観的な割り当て方法で実行します。これは実際にはRedisのために欲しいものです 。

Linuxの仮想メモリの仕事とovercommit_memoryovercommit_ratioのための他の 代替案では、Red Hatマガジンからこの 古典的であるかを理解するための良いソース、「仮想メモリを理解します」。注意: overcommit_memory の1と2の設定値がありました。正しい意味は の利用可能な値についてはproc(5)のマニュアルページを参照してください。

関連する問題