【オリジナル】なぜRedis再起動後にメモリデータが正しく復元されなかったのか


Redisをインストールすると、デフォルトの構成で起動すると次のログが表示されます.
[3077] 05 Sep 10:01:54.181 # 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.

この出力情報の大まかな意味は、
overcommit_memory値は現在0に設定されています!使用可能なメモリが少ない場合、バックグラウンドで実行されるsaveコマンドが失敗する可能性があります.この問題を修復するには'vmを追加する必要がある.overcommit_memory=1′から/etc/sysctl.confファイルで、
に合格
システムを再起動するか、'cysctl vmを実行します.overcommit_memory=1'コマンドは、構成を有効にします.
システムの構成を表示するには、次の手順に従います.
[root@Betty ~]# sysctl vm.overcommit_memory
vm.overcommit_memory = 0

はい、確かにシステム構成は0です.ではovercommit_memoryの値の意味は何ですか?どのような値を設定できますか?
ネット上の関連記事では、このパラメータについて次のように説明しています.

CommitLimitとCommitted_As
[root@Betty ~]# grep -i commit /proc/meminfo
CommitLimit:     5856624 kB
Committed_AS:     863300 kB
[root@Betty ~]#

メモリ情報にCommitLimitとCommitted_が表示されます.Asの2つのパラメータ.内
  • CommitLimitはメモリ割り当ての上限です.CommitLimit=物理メモリ*overcommit_ratio/100 + swap
  • Committed_Asは割り当てられたメモリサイズです.


  • overcommit_memory

    言い方1:
    overcommit_memoryパラメータは、メモリ割り当てがCommitLimit値を超えるかどうかを制御し、カーネルがメモリ割り当てに対するポリシーを指定します.デフォルトは0です.
  • 0はswapの使用をできるだけ減らすことを示している.
  • 1はCommitLimitを超えることを許可することを示す.
  • 2はCommitLimitを超えてはいけないことを示しています.

  • 言い方2:
  • 0は、カーネルが十分なメモリ供給用プロセスが使用可能かどうかを確認することを示す.十分なメモリがある場合は、メモリ申請を許可します.そうでない場合、メモリ申請に失敗し、エラーを適用プロセスに返します.
  • 1は、現在のメモリステータスにかかわらず、カーネルがすべての物理メモリを割り当てることを許可していることを示します.
  • 2は、カーネルがすべての物理メモリと交換空間の合計を超えるメモリ
  • を割り当てることを許可することを示す.
    言い方3:
    vm.overcommit_memoryは、カーネルがメモリを割り当てるときにチェックする方法を示します.
    この変数は0、1、2の3つの値をとることができます.異なる値をとる場合の処理方式について、カーネルソースmm/mmapに定義.cの_vm_enough_memory関数です.
    1を取る時:
    このときマクロはOVERCOMMIT_ALWAYS,関数直接return 0,割り当て成功.
    2を取る時:
    このときマクロはOVERCOMMIT_NEVER、カーネル計算:
        *vm.overcommit_ratio/100 + SWAP    

    購買依頼領域がこの値を超えると、割当てに失敗します.vm.overcommit_ratioのデフォルト値は50です.
    0の場合:
    このときマクロはOVERCOMMIT_GUESS、カーネル計算:
    NR_FILE_PAGES    + SWAP   + slab           

    応募領域がこの値を超える場合は、この値と空きメモリの合計をtotal reserve_に減らします.pages(?) を選択します.申請スペースがこの値を超えている場合は、割り当てに失敗します.
    以上は大まかな説明であるが、実際の計算では、
    rootプロセス以外の場合、計算時に3%のスペースが保持されますが、rootプロセスにはこの制限はありません.
    .
    言い方四:
    vm.overcommit_memory 
    既定値は0です.
    カーネルドキュメントから、このパラメータには次の3つの値があります.
  • 0:ユーザ空間がより多くのメモリを要求すると、カーネルは残りの使用可能なメモリを推定しようとする.
  • 1:このパラメータ値を1とすると、カーネルはメモリを使い切るまで過剰に使用することができ、主に科学計算に用いられる.
  • 2:このパラメータ値を2に設定すると、カーネルはメモリを決して過剰に使用しないアルゴリズムを使用します.すなわち、システム全体のメモリアドレス空間はswap+50%のRAM値を超えてはいけません.50%のパラメータの設定はovercommit_です.ratioで設定します.

  • vm.overcommit_ratio 
    既定値は50です.
    このパラメータ値はvmのみです.overcommit_memory=2の場合、このパラメータは有効になります.
    言い方5:
    Controls overcommit of system memory, possibly allowing processes to allocate (but not use) more memory than is actually available.
  • 0 - Heuristic overcommit handling. Obvious overcommits of address space are refused. Used for a typical system. It ensures a seriously wild allocation fails while allowing overcommit to reduce swap usage. root is allowed to allocate slighly more memory in this mode. This is the default.
  • 1 - Always overcommit. Appropriate for some scientific applications.
  • 2 - Don't overcommit. The total address space commit for the system is not permitted to exceed swap plus a configurable percentage (default is 50) of physical RAM. Depending on the percentage you use, in most situations this means a process will not be killed while attempting to use already-allocated memory but will receive errors on memory allocation as appropriate.

  • 言い方六(上の英語の比較的正確な翻訳と考えられる):
  • 0:デフォルト値は、Linuxカーネルによっていくつかの啓発アルゴリズムによって超過販売と超過販売のサイズを決定し、一般的には軽微な超過販売を許可し、明らかに提供できない要求を拒否すると同時に、異なるユーザーovercommitのサイズも異なるなどのルール制限を行う. 
  • 1:許可、制限しない超販売、もちろんこれも無限大ではなく、アドレス空間の制限を受けており、32ビットシステムは最大4 G、64ビットシステムは16 T程度しかない可能性があります. 
  • 2:禁止、超過販売禁止、システムが割り当てるメモリはswap+実際の物理メモリ*overcommit_を超えないratio、/proc/sys/vm/overcommit_ratio設定、デフォルト50%.

  • 長いこと話していましたが、これはRedisで与えられた出力情報と何の関係がありますか?
          
    現在のところ、Redisはbgsaveを実行する際にforkがサブプロセスを出す必要があると考えられています.一般的には、サブプロセスに必要なメモリ領域の量は親プロセスのメモリ領域の使用量に等しいと考えられていますが、LinuxでのCOWのため、サブプロセスは実行したばかりのときに親プロセスと同等のメモリ量を必要としない可能性があります.それでも、システムが現在使用可能なメモリ量が少なく、overcommit_memory=0の場合、メモリ不足の判定により割り当てに失敗する場合があります(実際にはそれほどメモリが必要ではないかもしれませんが).したがってovercommit=1という設定はRedisというキャッシュシステムにとってより有意義である.
    について
    overcommit自体は、実はまだ研究できるところがたくさんあります.以上は本人の粗浅な理解にすぎません.その後、関連知識を勉強し続けます.
    ==私は華やかな区切り線です==
    overcommitとは?overcommit中国語翻訳は「超販売」です.
    Solarisなどのオペレーティングシステムでは、malloc関数がnullに戻ると、システムに割り当て可能なメモリ領域がないことを示します.しかしLinuxのメモリ割り当てはより積極的な割り当て戦略を採用しており、アプリケーションがメモリ空間を申請した後、すぐに使用しないと仮定しているので、一定量の超過販売を許可しています.アプリケーションが本当にそれを使用する必要がある場合、オペレーティングシステムは他のアプリケーションのメモリ空間を回収することによって、このアプリケーションのニーズを満たす能力がある可能性があります.簡単に言えば、アプリケーション申請が実際の割り当て可能な空間(物理メモリとSwapを含む)よりも多くのメモリを許可することをOverCommitと呼ぶ.