Cent OS:メモリーのオーバーコミットメントをオフまたは削減するにはどうすればよいですか?


20

メモリとスワップスペースの両方が不足するため、「マイ」サーバーが停止することがあります。(pingに応答し続けますが、それ以上のものはなく、sshでも応答します)。

私は、Linuxがメモリオーバーコミットを行うと言われていますが、私が理解している限り、銀行がお金で行うのと同じです:実際に利用可能なメモリよりも多くのメモリをプロセスに付与します。ほとんどのプロセスは実際に要求するすべてのメモリを使用しないと仮定しています少なくともすべてが同時にではありません。

(参照のは、これが事実であるかどうかをここで議論しないようにしましょう、これは実際に、なぜ私のシステムは時折ハング原因であると仮定してください、まだ、まだpingに応答し?と方法を理解するには、サーバー上のすべてのサービスがダウンする可能性がありますどのような) 。

そう、

  1. CentOSでメモリのオーバーコミットメントを大幅に無効化または削減するにはどうすればよいですか?vm.overcommit_memory(値0、1、または2)とvm.overcommit_ratiomと呼ばれる2つの設定があることを読みましたが、どこでそれらを見つけて変更する必要があるのか​​わかりません(いくつかの構成ファイル)。 、および変更を有効にするためにサーバーを再起動する必要があるかどうか。

  2. そしてそれは安全ですか?どのような副作用が予想されますか?overcommit_memoryをグーグルで検索すると、サーバーが起動できなくなったという人のような恐ろしいことがわかりました。...

メモリ使用量の突然の増加を引き起こすのは、httpリクエストの処理中に呼び出されるphpによって行われるクエリのためのmysqlであるため、一部のphpスクリプトが完了できず、そのため時々500の応答が発生することが予想されるためです。サーバーがビジー状態であり、これは私が取ることができるリスクです(サーバー全体にアクセスできなくなり、ハードリブートする必要があることは確かに良いことです)。

または、間違った設定を選択すると、サーバーが本当に再起動できなくなる可能性がありますか?


1
オーバーコミットを無効にしても、実際にメモリ不足しているときは役に立ちません。ただし、サーバーにRAMを追加すると役立つ場合があります。
マイケルハンプトン

2
オーバーコミットを無効にすることは最終的な解決策ではありませんが、サーバーがメモリ不足になる場合(長い間一度だけ数秒間)に拒否されるHTTPリクエストはわずかしかありません(またはひどく役立った)、私のサーバーを完全に永久にDIEする代わりに(再起動するまで)
-matteo

回答:


30

メモリのオーバーコミットは次の方法で無効にできます vm.overcommit_memory=2

0はデフォルトモードで、カーネルは、行われている割り当て要求と比較して空きメモリを計算することにより、割り当てをヒューリスティックに決定します。1に設定すると、ウィザードモードが有効になります。このモードでは、割り当てに十分な空きメモリがあることをカーネルが常に通知します。2に設定すると、プロセスovercommit_ratioはRAMの構成可能な量()までしか割り当てることができず、その量を超えると、割り当てエラーまたはOOMメッセージの取得を開始します。

そうしても安全ですか?ワークロードとハードウェアの容量が100%確実でない限り、メモリオーバーコミットを無効にすることが実際に役立つ適切な使用例を見たことはありません。興味がある場合は、kernel-docsパッケージをインストールし/Documentation/sysctl/vm.txtて詳細を読むか、オンラインで読んでください。

設定vm.overcommit_memory=2すると、設定されている物理RAMの割合までオーバーコミットされますvm.overcommit_ratio(デフォルトは50%)。

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

これは再起動後は残りません。永続化するために、これを/etc/sysctl.confファイルに入れます:

vm.overcommit_memory=X

実行しsysctl -pます。再起動する必要はありません。


あなたが答えなかった部分は、どのファイルでそのvm.memory_overcommit設定を変更し、特にそれを有効にするために再起動する必要があるかどうか(または他に何を)
-matteo

2
echo 0/1/2> / proc / sys / vm / overcommit_memoryこれは再起動後は存続しません。永続化するには、これを/etc/sysctl.confファイルvm.overcommit_memory = Xに配置し、sysctl -pを実行します。再起動する必要はありません
Soham Chakraborty

どうもありがとう。これを回答本文に追加して、正式に「受け入れる」ようにしてください。
マッテオ

1
新しい部分を追加しました。
ソハムチャクラボルティ

4
「overcommit_ratio」は、overcommit_memory = 2を使用する場合に重要な効果があります。割り当てられる物理RAMの割合を決定します。したがって、比率<100の場合、ディスクキャッシュなどのために、RAMの一部を未割り当てのままにします。デフォルトの比率は50%なので、これを変更しない限り、物理RAMの50%のみを使用します。
デビッドガードナー

6

完全に修飾されていないステートメント:メモリのオーバーコミットを無効にすることは、有効にするよりも間違いなく「安全」です。

$ customerは数百のWebサーバーに設定しており、安定性の問題を大いに助けました。それが無効にされていない場合、Nagiosのチェックで大声で火を呼びます。

一方で、少しのRAMをオーバーコミットしたいだけで、実際にそれを使用したくない場合、プロセスをメモリから解放することを「安全」とはみなさないかもしれません。(つまり、SAPは非常に良い例です)

だから、あなたはそれがあなたのために物事を改善するかどうかを確認することに戻っています。あなたはすでに関連する問題を取り除くためにそれを調べているので、あなたに役立つかもしれないと思います。

(私は不機嫌な人によるダウン投票のリスクがあることを知っています)


3

オーバーコミットを無効にすると、特定の状況で有効にするよりも安全であることに同意します。サーバーが少数の大きなメモリジョブのみを実行している場合(私の場合の回路シミュレーションのように)、OOMイベントを待つよりも、メモリ要求を前もって拒否する方がはるかに安全です(間もなく続くはずです) OOMキラーが作業を行った後に問題が発生した。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.