購入するメモリの量をどのように推定しますか?


10

Windows 2008 R2で実行されるカスタムサーバーアプリケーションがあります。これは、.Netで記述された独自のWindowsサービスであり、多数のカスタム端末をサポートしています。ライブサーバーと同様の仕様を持つテストマシンがあり、実際のシステムの妥当な近似である負荷を生成するために使用できるクライアントシミュレータのセットがあります。これらのうち12,000をサポートできる必要がありますが、現在サーバーのメモリが不足しています(ページングが屋上を通り過ぎています)。

私の計画は、100個のシミュレータのみを開始し、メモリ使用量を測定し、さらに100個のメモリ測定を開始し、ページングが開始するまで繰り返します(実際には、3つ以上のデータポイントを取得します)。これにより、 100個のシミュレータに必要な追加メモリの量。これにより、必要なメモリ量を予測できます。サーバーにかかる2Tb($ 150,000相当)の購入を避けるために、おおよその目安+/- 30Gbだけが必要です。私の質問は、これが使用するのに妥当な方法であるかどうか、そして実際に使用されているメモリの量を示すためにどのパフォーマンスカウンターを監視するかです。

ワーキングセット、プライベートバイト、コミット済み、共有、仮想、その他すべてのメモリ用語の違いで混乱するため、ここでは特にメモリについて話しています。CPU、IO、ネットワークを自分で監視できると思います。私が気づいたもう1つのことは、.Netキャッシュが使用可能なものに応じてメモリ使用量を調整するため、傾向を特定するのが困難になることです。


私は、2つのデータポイントが非常に接近していることに基づいて、メモリ使用量を予測することに本当に注意を払います。メモリ使用量(およびその点ではI / O)が線形にスケーリングするかどうか、私は深刻な疑問を抱くでしょう。可能性はありますが、数値が大きくなるにつれて非線形になる傾向があると思います。パフォーマンスが問題になるまで(ページング、I / O飽和など)小さなものから大きなものまで、いくつかのデータポイントでテストし、そこから投影します。マシンを段階的にアップグレードして、より大きなクライアント数でシミュレーションを続けることが可能な場合は、曲線の形状がよくわかるまで、そうします。
エヴァンアンダーソン

また、これが何であるかを少しよく理解する必要もあります。それはウェブですか?aspx?php?自家製のもの?バッチジョブ?asp.netの動作は、ボックスで実行されているexeのロードとは異なります。システムがユーザーごとに使用する基本的な考え方が必要です-約。数字-そして古い封筒。これらの数値を取得する方法は、システムの動作方法によって異なります。
Ian Murphy

@エヴァン。私は常に3つ以上のデータポイントを取るつもりでした。
マーティンブラウン

@Ian:「システムがユーザーごとに何を使用するかの基本的な考え方」は、まさに私が見つけようとしているものです。これがわかっていれば、質問する必要はありません。他のポイントをカバーするように質問を更新しました。
マーティンブラウン

回答:


8

正直なところ?私はしません
あらゆる種類の実際のワークロードを処理するサーバーを指定するとき、私は合理的に余裕のあるできるだけ多くのRAMに詰め込みます(システムは、CPUやディスクの制約よりもRAMの制約が大きくなる可能性が高くなります-他の唯一の保証されたボトルネックはフロントサイドですバス)。

あなたが提案したようなあなたのアプリケーションが基本的な負荷テストを使用するかもしれないRAMの量を把握したいなら良いスタートですが、すでにあなたこのシステムを本番に持って(あなたがそうするように聞こえます)そして本番システムがあなたを入れ替えているならタスクはより簡単です:使用しているスワップスペースの量を計算します -> 少なくとも2倍のRAMを追加します(システムのDIMMサイズの制約に合うように切り上げます)。

負荷テストを実行して大まかな数値を取得し、そこから推定する場合は、いくつかのことを考慮に入れてください。

  1. メモリ曲線はおそらく2つの異なるセグメントになります
    (フレームワーク/共有ライブラリがキャッシュされると最初は急激に増加し、次に、新しいアプリの共有できないコードがメモリに配置されると、少し急な曲線になります)。

  2. ディスクと共有ライブラリのキャッシュ、およびOSには、まだ空きRAMが必要です。
    (これはあなたのアプリが必要とするものより少なくとも数ギグあるはずです)

  3. すべてのソフトウェアがメモリをリークします(少なくともすべての実用的なソフトウェアがメモリをリークします)。したがって、テストでそれを監視し、リークに対処する余地があることを確認してください。

  4. 負荷はサーバーの存続期間中におそらく増加します。 それに応じて計画します。
    (適切な容量計画の数値がない場合は、今日のワークロードを2倍にして、それを処理することを計画してください)。

  5. 今日、RAMを購入しすぎると、環境が明日倒れるよりも安くなります。

    • 最初の結果:必要以上に少し大きいサーバーを購入する場合は、会社を運営し続けた先駆者です。あなたはほとんど無視され、感謝されません。
    • 第2の当然の結果:マシンのサイズが小さすぎて問題が発生した場合、500%の成長を期待することができず、誰もがあなたを嫌っています。

当然の結果を承認します。
mfinni 2012


それをありがとう。このシステムは稼働していますが、現在は非常に小規模な試験をサポートしているため、十分な数値を得ることができません。
マーティンブラウン

0

おかげで、更新は少なくとも誰もが手がかりを与える。2Tbのメモリを検討しているということは、通常のセットアップとは異なる球場でプレーしていることを意味します。大きなシステム。どれだけの熱が出るか考えたくない。

その内部サーバープロセスとメモリが不足している(ページングを開始するレベルを言っていない)ことを考えると、サーバープロセスが実行する前に、サーバープロセスがこれまでより多くのメモリを消費している可能性を排除したいと思います。さらに。これが発生している場合、何を行っても違いはありません。システムはある時点で停止します。

何が起こっているのかという基本的な概要以上のものを提供するために使用できる汎用ツールについては知りません。サービスプロセス自体はブラックボックスであり、開発チームは監視ツールを提供する必要があります。

エンベロープ計算のクイックバック:

2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session

これは、通常の.net exeのワーキングセットの範囲外ではありません。

サービスには複数のスレッドがありますか?接続ごとにスレッドを起動している場合は、これをどのように行っているかを確認する価値があります。MicrosoftのProcExp.exeは、複数のスレッドがあるかどうか、およびそれらのスレッドが消費しているものを確認する簡単な方法です。.netについては認識していませんが、win32カウンターを提供します。

ページングが始まる前にテストを行ったときのメモリと接続の数を教えてください。

では、サーバープロセスにメモリリークの問題があるかどうかを確認するにはどうすればよいでしょうか。セッションが接続されるたびにメモリが蓄積される可能性があります。または、メモリが蓄積されて解放されない可能性があります。

あなたができることは-ページングを引き起こさないセッションの数を選び、その数の接続をシミュレートすることです。-シミュレーションを数時間実行し、perfmonを使用して基本的なメモリカウンターを監視します。-短時間接続して切断するセッションでこれらのテストを繰り返します。

サービスが各セッションでますます多くのメモリを消費しているかどうか、または開いているセッションがメモリ使用量を増加させているかどうかを確認するという考えです。

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