16 GBのRAMを搭載したデュアルクアッドコアXEONにCentOSをインストールすると、mysqlバックエンド(中/高負荷)を使用してphp Webサイトを実行しますか?
16 GBのRAMを搭載したデュアルクアッドコアXEONにCentOSをインストールすると、mysqlバックエンド(中/高負荷)を使用してphp Webサイトを実行しますか?
回答:
1ギガまたは2ギガ以下-念のために、そしてそれが物事を少し良くするのを助けるので、少しのスワップを利用可能にしたいが、あなたがひどくスワッピングしているポイントに到達するなら、マシンは行く役に立たないために-そして実際の壊滅的な状況では、OOMキラーを遅らせるよりも早くトリガーするため、実際には小さなスワップスペースを使用する方がよいでしょう。
非常に長い答えをおforびします。私はしばらくの間、このようなものをアクセス可能な場所に置きたいと思っていました!
TLDR; 理論的に言えば、答えは「おそらく、すべてのアプリケーションが使用したい常駐メモリの総量以上です」
あなたが私と一緒にいるなら説明しようと思います。
仮想メモリについて少し
最近、スワップの価値とその目的についてよくある誤解があると感じています。スワップは、メモリが不足している場合のメモリの「予備バンク」と見なされることがよくあります。はい、これは部分的には正しいですが、カーネルはスワップをリザーブバンクとして使用することを望みません。さらに、カーネルはディスクを呼び出して、必要なデータを取得することを望みません。
アプリケーション空間では、カーネルがメモリに保持するものがいくつかあります。
メモリ管理の目的のために、メモリ割り当てがされている担保支持装置によって何らかの形または別の。
ファイルバックアップメモリは、ファイルから取得されたメモリであり、一般的なO / Sではシステム上のメモリ割り当ての大部分を占めています。ロードされた共有ライブラリなどのファイル、ディスクから読み取られてページキャッシュに格納されたファイル、およびディスクからmmapされたファイルが含まれます(実際、カーネルはページキャッシュ内のファイルとmmapされたファイルを本質的に区別しません同じこと)。
カーネルの観点から見たこのメモリの素晴らしい点は、その使い捨てです。つまり、他の何かのためにメモリが必要な場合、これらのページをダンプすることが可能であるべきであり、これはメモリが突然要件である場合にまさにページキャッシュが行うことです。
匿名でバックアップされたメモリは別の問題です。この領域からのメモリは匿名です。なぜなら、実際にはこのデータを含むファイルがディスク上にないからです。これは通常、アプリケーションスタック、ヒープ、tmpfs内のすべて、およびプライベートで変更された(マップされたデータをディスクに同期できないため)マッピングされたデータで構成されます。これらのページが変更された場合にそれらを書き戻すための有効なファイルがファイルシステム上に存在しないため、匿名でバックアップされたメモリはスワップメディアによってバックアップされます。
現在、カーネルは、メモリが不足している場合、ファイルでバックアップされたメモリを捨てるのがはるかに安価であり、匿名でマッピングされたメモリをはるかに安価であると認識しています料金には匿名で(この記事を参照してくださいファイルがメモリを担保し、これはswappinessの修飾子は、Linux上で何を実際よりも80倍以上の価値があるものとしてメモリを裏打ちされ、ここであなたはswappinessのパラメータが変更された内容を正確に把握したい場合)。
最悪のシナリオ
サーバーが制御不能になり、OOMが発生する最悪のシナリオは、メモリ割り当て要求を尊重するよりもI / O要求の処理に時間がかかりすぎるという事実に基づいています。この基準を呼び出すことができる2つの条件があります。
最初の問題は、一般的に考えられている問題です。つまり、メモリの多くはスワップ内に存在するため、匿名メモリをRAMからスワップし、スワップに戻し、スワップから何かを取り出して実際のRAMに入れる必要があります。この操作は非常に高価であり、回復不能な状況になるまでマシンを遅くします(I / Oから提供できるものよりも多くの要素がページ要求のためにキューに入れられるため)。
2番目のものはあまり考慮されていませんが、同様に重要です。ほとんどすべてのメモリを実際のアプリケーションデータに割り当てると、長続きしません。ほぼすべてのアプリケーションは、ファイルシステムからのファイルの読み取りに依存して動作します。これは、一部の命令が共有ライブラリに存在するか、ライブラリ呼び出しまたはその他の目的で/etc/resolv.confを読み取る必要があるためです。オペレーティングシステムを停止することは完全に妥当です-ただし、すべてのアプリケーションに対応するのに十分なメモリがありますが、大量のI / O要求をキューに入れるため、適切に完了するチャンスはありません。
カーネルがスワップで何をしたいのか
カーネルは、スワップを使用してメモリを浪費しているページを取り除き、そのメモリを他の目的に使用できるようにします。
基本的に、通常の操作では、カーネルはディスクから読み取ったデータでページキャッシュを積極的にいっぱいにすることを好みます。これは、同じデータのディスクを読み取らないことを意味します。これは優れた設計であり、I / Oを大幅に削減できます。さて、3日間スリープし、ウェイクアップし、大量の作業を行ってからさらに3日間スリープするアプリケーションがメモリにある場合があります。
カーネルがこのデータを使用してやりたいことは、代わりにファイルシステムのアクティビティ用のスペースを作るためにスワップアウトすることです。これらのページは、アプリケーションで使用するページよりも実際に頻繁に使用される可能性が高いからです。この意味でのスワップは、スワップメディアへの16 kbのトランザクションであり、ほとんど感じることはありませんが、4つのファイルに相当するデータを保存するために使用できる 16 kbのメモリを解放しました。
カーネルがスワップを使用したくないもの
カーネルは間違いなく、スワップを使用して他の匿名メモリをスワップアウトすることで、より多くの匿名メモリを割り当てたくありません。これは、人々が最も心配する状況です。
ただし、カーネルがこれを行う以外に選択肢がないほど多くのメモリを割り当てた場合、これはカーネル自体ではなくシステム管理者の設定の問題であることに注意する必要があります-あなたが与えたオプション!
大量のスワップがある場合、それを使用する可能性は高くなりますか?
番号!1GのRAMと4Gのスワップがある場合、データがスワップされる可能性は80%ありません!カーネルは、メモリ内のページが他の何かをすることでより適切に提供できる場合にのみ、スワップを使用したいと考えています!
スワップをまったく使用しないほうが有利ですか
私はこれを決してしません。スワップにより、O / Sは必要なメモリを取り除くことができますが、使用されることはありません。スワップがない場合、メモリを飲み込むだけでは戻れません。そのため、たとえばページキャッシュにメモリを持たせることで、パフォーマンスが大幅に向上することがあります。
最適なスワップは何ですか
理論的には、ヒープからメモリを割り当てなければならない再入可能なライブラリ呼び出しなどの安全のために、常駐メモリの量+ 20%を見つけて、スワップをその量に設定します。これにより(理論的には)、オペレーティングシステムがより有用なものに道を譲る必要がある場合、すべての匿名メモリをスワップアウトできます。
カーネルの機会を利用して、危険なものすべてを交換することができたら?
カーネルは、ここでより多くの匿名メモリ割り当てのためにスワップすることを望んでいないことを忘れないでください。使用していないページをスワップアウトして、代わりにスペースをより有効に使用する何かを優先します。
より多くの匿名メモリから割り当てるためだけに非メモリをスワップアウトする場合、何か間違ったことをして、より多くのRAMを必要とするか、アプリケーションスタックを再調整するために。
どのくらいのRAMが必要ですか
もちろん、すべてのアプリケーションを実行するために十分なRAMを許可する必要がありますが、おそらくページキャッシュがいっぱいになるために、おそらく2Gの追加のRAMを許可する必要があります。ページキャッシュを使用すると、コンピューターがはるかに高速になり、ディスクの寿命が長くなります。Webサーバーを実行することを考えている場合、ページキャッシュのためにさらに多くの静的コンテンツを取得して再利用できるため、ページキャッシュのためにさらに多くのことをお勧めします(Webサーバーのスループットが5mb / sの場合、あなたは本当にいけません結局のところ、ディスクから生成した5mb / sのコンテンツを取得したいのです!)。
Linuxが適切にスワップすることを本当に信用していない場合の対処方法
本当に心配なら、あなたが持っているよりも多くのメモリを割り当てることができます:
アプリケーションの記憶を調整する最良の方法は何ですか
ベンダーは別の構成を推奨しています。
代わりにそれを聞いてください。一部のアプリケーションは、意図的にカーネルを呼び出して、他のすべてのアプリケーションよりもページをアクティブにするように作成されています。これは正直に言うと厄介なトリックですが、カーネルが発生したときにシームレスにメモリを管理する能力を損ないます。ベンダーがあなたに詳細を提供している場合、彼らはおそらくこのカテゴリーに分類され、代わりに彼らが言うことに耳を傾けます。
要約すれば
カーネルは通常、仮想メモリを適切に管理する非常に良い仕事をします。そのほとんどの場合、アプリケーションが、おそらく作業を期待できる以上のメモリを割り当てており、それがOOMの原因です。
スワップは「予備メモリ」として使用されていましたが、その主な目的ではなくなったため、そのように使用することを考えないでください。代わりに、カーネルがおそらくメモリの使用目的を最もよく知っていることを理解してください。これらの決定を行うためのスペースを確保すると、全体的なパフォーマンスの改善から利益を得ることができます。
ドキュメント「RedHat®EnterpriseLinux®5上のOracle 10g Server 5の導入に関する推奨事項」から。
Oracleは、MetaLink Note 169706.1でスワップのサイズに関する一般的な推奨事項を提供しています。これらの推奨事項により、大量のメモリを搭載したシステムで非常に大きなスワップ領域が作成される場合があります。スワップが非常に大きいと、システムのパフォーマンスが大幅に低下する可能性があり、スワップスペースを減らすことで解決できます。Red Hatは、Red Hat Enterprise Linux 5のスワップ用に4GBを超える容量を割り当てることを推奨していません。
したがって、16GBの場合、4GBを超えるスワップは必要ありません。
PS。また、oom
I / O帯域幅全体を使用する使用不可のスワップアウトプロセスよりも、invokeの方がほぼ常に優れていることに注意してください。
現在のCentOSスワップの推奨事項では、次の式を使用しています。
M = Amount of RAM in GB, and S = Amount of swap in GB, then
If M < 2
S = M *2
Else
S = M + 2
16Gの場合、スワップの量は18Gになります。
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.htmlを参照してください
私がLinuxのドキュメントから思い出したことから:あなたのRAMが2ギガバイトよりも大きい場合、あなたはスワップ=(ramSize + 2)を行います。少ない場合は、swap =(ramSize * 2)を実行します
私はこのドキュメントを見つけました。それはあなたがその決定を下すのに役立つはずです、ここにあります: スワップスペースとは?、しかし上記の答えはどちらも正しい
dd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file