プログラム設定で何も変更せずに、VPSのメモリ消費を2倍減らすにはどうすればよいですか

OpenVZ上に構築されたVPSを取得しました。 私はそこにDebian Lennyとあらゆる種類のプログラムを配置しました(実際には通常のLAMP)。 リソース消費の観点から、私はほとんど何も設定しませんでした、それはおよそ200Mの占有RAMのどこかに判明しました(開始直後)。

/etc/init.d/rcのulimit -s 1024



を一番上に書いた。 再起動しました。 VPSのメモリ消費量は2倍以上になり、約100Mになりました。



XenなどでVPSを使用している場合、ここで戦ったレーキはありません。 OpenVZ(Virtuozzo)に同志がいる場合-あなたは、おそらくVPSで同じレーキを持っています。



記事では-なぜ、どのように機能するのか。





OpenVZとXen



ここで興味深いのは、OpenVZとXenの違いです。OpenVZでは、仮想メモリが制限されています。 つまり、たとえば、「256M + 256Mバースト可能」という形式の関税は、最大 256M仮想メモリ(および休日には512M仮想)。



多くのプログラムが仮想メモリを「予約済み」で割り当てます。 通常の操作(またはXenと同志による仮想化)では、何の影響もなしに(Wh>物理的にアクセス可能)好きなだけ割り当てることができます。 これは、XenのVPSがOpenVZのVPSよりも特性が類似している理由の1つです。実際、より多くのリソースを提供します。



しかし、それだけではありません



仮想メモリで実行中の各スレッドには、スタックの下のスペースが割り当てられます 。 したがって、たとえば、debian lennyでは、デフォルトでこの場所は10Mです。 mpm_worker(多数のスレッドを作成)でApacheを使用し、OpenVZで実行します-数百メガバイトのメモリが無駄になります。



スタックあたり10メガバイトが大量です。 そして、多くがインストールされています、なぜなら Linuxが正常に動作している場合、このメモリは「無料」です。マイナスの影響なしで少なくとも100Mをインストールできた可能性があります(再帰のバグがあるプログラムが苦労する時間が長くならない限り)。 通常、プログラムは、「予備」を考慮に入れても、数倍少なくなります。



デフォルトのスタックサイズを小さくする



サーバーは公共のコンピューターではなく、そこで実行されるプログラムは事前に知られています。 これらのプログラムは通常、常に同じことを行います。 どういうわけか、スタックに必要なメモリのサイズが大幅に変更された理由がわかりません。



デフォルトのスタックサイズを小さくするには、 ulimit -s < >



コマンドを使用します。 パラメーターは、現在のシェルから起動されたプログラムに対して変更されます(階層的にもessno)。 システムの起動時にこのことを開始します(デーモンを起動するスクリプト内)-それだけです。



明らかな警告があります-制限を低く設定しすぎると、複雑なもの(大量の再帰コードまたはスタックの理解できない、なぜ厄介な作業)が落ち始める可能性があります。 注意を傷つけることはありません。 警告されます。 バックアップを作成します。 しかし、スタックの下の10Mは、ほとんどの場合、大量です)



私には2Mの最適なサイズのように思えました。 極端なスポーツマンと実験者はさらに減らすことができます(32Kで試しましたが、すべてうまくいきました)。しかし、ゲインはすでに小さくなっていますが、リスクは増大し、意味はまったく十分ではありません。 しかし-それを試してください。



基本的に、すべてのプロセスでulimitを実行するのはかなり無礼です。 微調整を行うには、個々のデーモンを起動するためのスクリプトを編集する(スタックする)ことができます。 また、一部のプログラムでは、mpm_workerのThreadStackSizeディレクティブであるapacheなど、スレッドスタックに割り当てる構成内のメモリを変更できます。 実際には、Apacheがあり、ワーカーモードで設定されていて(php-fastcgiを介して)、ulimitなしでThreadStackSizeを使用してスタックのメモリが制限されました(InnoDB、fastcgi phpプロセスでmysqlが原因で2回減少しました、メールサーバーとあらゆる種類のささいなこと)。



このすべてをテストするために、/ etc / init.d / rcに直接移動することを恐れている場合は、次のことができます。

1)プロセスがメモリにどれだけかかるかを確認し、

2)シェルでulimit -s <-, >



入力ulimit -s <-, >





3)プロセスを再起動します( /etc/init.d/mysql restart



ようなもの)

4)現在の所要量をもう一度確認し、すべてが機能することを確認します



考え



その結果、OpenVZユーザーは、まれなトリッキーなプログラムをいつか(地獄で)起動する可能性のために大量のRAMを支払っていますが、他の人には無料です。 したがって、私たちは行動しているように思えますが、論理的には、OpenVZを仮想化するときに最大値を減らします。 最大1〜2Mのスタック深度。 64Kなど、あらゆる種類のHP-UX(私は実際には目にしませんでした)では、泣きません。 そして、最大の減少から。 スタックの深さは、より重要な部分のためにRAMの束を解放しました。



批判やコメントを歓迎します。



All Articles