RAM mysqlのバックエンドでphpのWebサイトを実行する予定の16GBのデュアルクアッドコアXEONにCentOSをどのくらいのSWAPでインストールしますか?中/高負荷?
1つか2つ以下のギグ-万が一のために少しだけスワップを利用できるようにしたいのですが、それは物事が少しうまく機能するのに役立ちますが、頻繁にスワップするポイントに到達した場合、マシンは動いています役に立たない-実際の壊滅的な状況では、実際には、スワップスペースを小さくしたほうがよいでしょう。それは、OOMキラーを後でなくトリガーするためです。
長い回答をお詫び申し上げます。私はこれをしばらくの間アクセス可能な場所に置きたいと思っていました!
TLDR;理論的に言えば、答えは「おそらく、すべてのアプリケーションが使用したい常駐メモリの総量以上」です。
あなたが私と一緒にいるかどうかを説明しようと思います。
仮想メモリについて少し
最近、スワップの価値とは何か、その目的は何かについて、よくある誤解があるように思います。多くの場合、メモリ不足が発生した場合、スワップはメモリの「予約バンク」として意図されていると考えられています。はい、これは部分的に当てはまりますが、カーネルはスワップをリザーブバンクとして使用したくありません。さらに、カーネルはディスクを呼び出して、目的のデータを取得することを望みません!
アプリケーション空間では、カーネルがメモリに保持するものはたくさんあります。
メモリ管理の目的で、メモリ割り当ては、サポートデバイスによって何らかの形で backed されます。
File backed メモリは、ファイルから取得されたメモリであり、一般的なO/Sでは、システム上のメモリ割り当ての大部分を占めます。これには、ロードされた共有ライブラリ、ディスクから読み取られてページキャッシュに保存されたファイル、ディスクからmmapされたファイルなどのファイルが含まれます(実際、カーネルは、ページキャッシュ内のファイルと本質的にmmmapされたファイルのページを区別しません。同じこと)。
カーネルの観点から見たこのメモリの優れた点は、その使い捨てです。つまり、何か他のメモリが必要な場合はこれらのページをダンプできるはずです。これは、メモリが突然必要になった場合にページキャッシュが行うこととまったく同じです。
匿名でバックアップされたメモリは別の問題です。この領域のメモリは匿名です。なぜなら、このデータを実際に含むファイルがディスク上にないからです。これは通常、アプリケーションスタック、ヒープ、tmpfs内のすべて、およびプライベートで変更されたmmappedデータで構成されます(この内容をディスクに同期できないため)。これらのページが変更された場合に書き戻すための有効なファイルがファイルシステム上にないため、匿名でバックアップされたメモリはスワップメディアによってサポートされます。
現在、カーネルはメモリが不足している場合、ファイルにバックアップされたメモリを匿名でマップされたメモリに捨てる方がはるかに安価であることを知っています。これは、匿名のデータがファイルにバックアップされたデータよりも「ダーティ」である可能性が非常に高いためです。匿名でバックアップされたメモリをファイルバックアップされたメモリの80倍の価値があると評価し、これは実際にLinuxでswappiness修飾子が行うことです(swappinessパラメータが正確に何を変更しているかを知りたい場合は、この投稿 here を参照してください)。 。
最悪のシナリオ
サーバーが制御不能になり、OOMingが発生するという最悪のシナリオは、メモリ割り当て要求よりもI/O要求の処理に多くの時間を費やしているという事実に基づいています。この基準を呼び出すことができる2つの条件があります。
最初の問題は、一般的に考えられている問題です。つまり、メモリの多くはswap内に存在するため、匿名メモリをRAMからスワップし、スワップに戻し、スワップから何かを取り出して、実際のRAMに入れる必要があります。この操作は非常に負荷が高く、マシンの速度が低下して回復不能な状況になる可能性があります(I/Oから提供できるものよりも多くのものがページ要求のキューに入れられるため)。
2つ目はあまり考慮されていませんが、同様に重要です。ほとんどすべてのメモリを実際のアプリケーションデータに割り当てると、長続きしません。ほぼすべてのアプリケーションは、ファイルシステムからのファイルの読み取りに依存して動作します。これは、一部の命令が共有ライブラリに存在するため、またはライブラリの呼び出しやその他の目的で/etc/resolv.confを読み取る必要があるためです。オペレーティングシステムを停止するのは完全にもっともらしいことですが、すべてのアプリケーションに対応できるだけの十分なメモリがありますが、大量のI/O要求をキューに入れると、正常に完了する可能性はありません。
カーネルがスワップで何をしたいか
カーネルは、メモリを浪費しているページを取り除くためにスワップを使用して、他の何かのためにそのメモリを使用したいと考えています。
基本的に、通常の操作では、カーネルはディスクから読み取られたデータでページキャッシュを積極的にいっぱいにします。これは、同じデータでディスクを読み取らないことを意味します。これは優れた設計であり、I/Oを大幅に削減できます。さて、3日間スリープし、目を覚まし、一連の作業を行ってから、さらに3日間スリープするアプリケーションがメモリに置かれている可能性があります。
カーネルがこのデータを処理したいのは、アプリケーションに使用するページよりも実際にこれらのページを使用する可能性がはるかに高いため、代わりにファイルシステムアクティビティ用のスペースを確保するためにデータをスワップアウトすることです。スワッピングは、この意味で、ほとんど感じないはずのスワップメディアへの16kbのトランザクションである可能性がありますが、その代わりに、4つのファイルを保存するために使用できる16kbのメモリを解放しましたデータ。
カーネルがswapを使用したくないもの
カーネルは、他の匿名メモリをスワップアウトすることによって、より多くの匿名メモリを割り当てるために、スワップを使用したくありません。これは、人々が最も適切に心配している状況です。
ただし、カーネルがこれを行うしかないほど多くのメモリを割り当てた場合、これはシステム管理者の設定の問題であり、カーネル自体ではありません。あなたがそれを与えたオプション!
スワップが大量にある場合、それを使用する可能性を高めますか?
番号! 1GのRAMと4Gのスワップがある場合、データがスワップされる可能性は80%ありません!カーネルは、メモリ内のページが他のことを実行することでより良いサービスを提供できる場合にのみ、スワップを使用したいと考えています!
スワップをまったく使用しないことが有利ですか
私はこれをするつもりはありません。スワッピングにより、O/Sは必要なメモリを取り除くことができますが、使用されていません。スワップがない場合は、メモリを飲み込むだけでは元に戻せません。たとえば、ページキャッシュに代わりにメモリを割り当てると、パフォーマンスが大幅に向上する可能性があります。
最高のスワップは何ですか
理論的に言えば、ヒープからメモリを割り当てる必要のあるリエントラントライブラリ呼び出しなどの安全性のために、常駐メモリ+ 20%を調べてから、スワップをその量に設定します。これにより、(理論的にはとにかく)オペレーティングシステムがより有用なものに道を譲らなければならない場合に、すべての匿名メモリをスワップアウトできるようになります。
カーネルが危険なものすべてを交換する機会を得たら?
カーネルは、ここでより匿名のメモリ割り当てのためにスワップすることを望んでいないことを覚えておいてください。代わりに、使用されていないページだけをスワップアウトして、代わりにスペースをより有効に利用できる他のものを優先します。
より多くの匿名メモリから割り当てるためだけにanonメモリをスワップアウトする場合、何かがおかしくなり、さらにRAMまたはアプリケーションスタックを再調整する必要があります。
どのくらいRAM必要になりますか
もちろん、すべてのアプリケーションを実行するのに十分なRAMを許可する必要がありますが、ページキャッシュがいっぱいになるように、おそらく2Gの追加のRAMを許可する必要があります-多分ページキャッシュを使用すると、コンピュータがはるかに高速になり、ディスクが長持ちします。Webサーバーを実行する場合、ページキャッシュから取得して再利用できる静的コンテンツの量が非常に多いため、ページキャッシュをさらに増やすことをお勧めします。 (サーバーのスループットが5mb/sの場合、結局、ディスクから生成した5mb/sのコンテンツを取得したくないはずです!)。
適切にスワップするためにlinuxを本当に信頼しない場合の対処法
もし本当に心配なら、あなたが持っているよりも多くのメモリを割り当てることができます:
アプリケーション用にメモリを調整する最良の方法は何ですか
ベンダーは別の構成を推奨しています。
代わりにそれを聞いてください。一部のアプリケーションは、意図的にカーネルを呼び出して他のすべてのページよりもページをアクティブにするように作成されています。これは正直に言えば厄介なトリックですが、カーネルが発生したときにシームレスにメモリを管理するカーネル機能を壊します。あなたのベンダーがあなたに詳細を提供しているなら、彼らはおそらくこのカテゴリーに分類され、代わりに彼らが言うことを聞きます。
要約すると
カーネルは通常、仮想メモリを適切に管理する上で非常に優れています。これは、ほとんどの場合、アプリケーションが作業する可能性のあるメモリよりも多くのメモリを割り当てる場合であり、それがOOMの原因です。
スワップは以前は「スペアメモリ」として使用されていましたが、その主な目的ではなくなったため、そのように使用することは考えないでください。代わりに、カーネルがメモリの使用目的を最もよく知っていることを認めてください。それらの決定を行うためのスペースを与えてください。そうすれば、全体的なパフォーマンスの向上から利益を得ることができます。
ドキュメント「RedHat®EnterpriseLinux®5でのOracle 10gサーバーの導入に関する推奨事項」。
Oracleは、MetaLink Note 169706.1でスワップのサイズに関する一般的な推奨事項を提供しています。これらの推奨事項により、大量のメモリを搭載したシステムで非常に大きなスワップ領域が作成される可能性があります。非常に大きなスワップは、システムのパフォーマンスを大幅に低下させる可能性があり、スワップ領域を減らすことで解決できます。 Red Hatは、Red Hat Enterprise Linux 5でのスワップに4GBを超える割り当てを推奨していません。
したがって、16GBの場合、4GB以下のスワップが必要です。
PS。また、呼び出されたoom
は、ほとんどの場合、I/O帯域幅全体を使用する使用できないスワップアウトプロセスよりも優れていることに注意してください。
現在の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 を参照してください