ホームページ  >  記事  >  データベース  >  MySQL OOM シリーズ 1 Linux のメモリ割り当て_MySQL

MySQL OOM シリーズ 1 Linux のメモリ割り当て_MySQL

WBOY
WBOYオリジナル
2016-08-20 08:48:15862ブラウズ

RDS (NetEase Cloud Relational Database Service) はしばらくの間オンラインになっており、オンラインの運用とメンテナンスのプロセス中に、私たちが考慮していなかった、または十分に考慮していなかったいくつかの事柄にも遭遇しました。後で時間があるときに共有できます。

今日お話したいのは、オンラインの 4G RDS インスタンスで OOM (メモリ不足) 問題が発生し、MySQL プロセスが直接強制終了されたことです。この問題を説明するときは、まず Linux システムのメモリ割り当て戦略から始める必要があります。
一般に、C 言語プログラムを作成するときは、malloc を使用してメモリ領域を動的に適用することに慣れています (Java は、JVM によるメモリ管理を担当します)。malloc 関数は、オペレーティング システムに連続メモリ ユニットを適用し、その結果を返します。このスペースの開始アドレス。 malloc 関数が null を返した場合は、システムに割り当てるメモリ領域がないことを意味します。これは私たちの一般的な考え方であり、もちろん、一部のオペレーティング システム (Solaris) ではこれは実際に正しいです。
しかし、Linux のメモリ割り当ては、より積極的な割り当て戦略を採用しており、アプリケーションがメモリ空間を申請した直後には使用しないことを前提としているため、アプリケーションが実際に必要とする場合には、ある程度のオーバーブッキングが許可されます。これを使用すると、オペレーティング システムは他のアプリケーションのメモリ領域を再利用することで、このアプリケーションのニーズを満たすことができるようになります。簡単に言うと、アプリケーションは実際の割り当て可能な領域 (物理メモリとスワップを含む) よりも多くの領域を申請できるようになります。メモリを増やす場合、この機能はオーバーコミットと呼ばれます。
この機能は、Linux オペレーティング システムでも構成できます。/proc/sys/overcommit_memory を別の値に設定することで、OverCommit ポリシーを調整できます。
Overcommit_memory は 3 つの値を取ることができます:
0: デフォルト値。Linux カーネルは、オーバーブッキングするかどうかとオーバーブッキングのサイズを決定するためにいくつかのヒューリスティック アルゴリズムを使用します。一般に、わずかなオーバーブッキングは許可され、明らかに提供できないリクエストは拒否され、いくつかのルール制限が課されます。異なるユーザーによるオーバーコミットとして、サイズも異なります。
1: オーバーブッキングの制限なしで許可されます。もちろん、これは無限ではなく、32 ビット システムでは最大 4G しかなく、64 ビット システムでは約 16T になる可能性があります。 。
2: オーバーブッキングは禁止されています。システムが割り当てることができるメモリは、スワップ + 実際の物理メモリ * overcommit_ratio を超えません。この値は /proc/sys/vm/overcommit_ratio で設定できます。デフォルトは 50% です。

Linux のメモリ割り当てを確認するために、小さなプログラムを使用してテストします。

リーリー

前者は malloc() を通じてメモリ空間を申請した後、すぐには使用しませんでしたが、後者は逆に、申請するたびにすぐに 1 を埋めてしまいました。 2 つのプログラムを実行した結果を見てみましょう。

これは、1G RAM と 400M スワップを備えた仮想マシンで実行した結果です。前者は実際のメモリよりもはるかに多くの領域に適用されますが、後者は実際に使用可能なメモリ領域を超えません。これにより、前述の Linux メモリ割り当て戦略が検証されます。
これ自体は体系的な最適化であり、理解できます。しかし、「オーバーブッキング」は、リソースを同時に使用する多数のプログラムが存在しないという前提に基づいていることはわかっており、これには明らかにリスクがあります。したがって、Linux は OOM Killer (Out Of Memory Killer) メカニズムを使用して、システムの利用可能なメモリ (スワップを含む) が使い果たされそうになる前に、一部のプロセスを選択的に強制終了してメモリの一部を解放します。次の章では、Linux OOM Killer のメカニズムに焦点を当てます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。