web-dev-qa-db-ja.com

購入するメモリの量をどのように見積もりますか?

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

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

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

10
Martin Brown

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

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

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

  1. 記憶曲線はおそらく2つの異なるセグメントになります
    (フレームワーク/共有ライブラリがキャッシュされると最初の急激な上昇が見られ、その後、新しいアプリの共有不可能なコードがメモリに配置されると、少し緩やかな曲線になります)

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

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

  4. サーバーの存続期間中、負荷はおそらく増加します。 それに応じて計画します。
    (適切なキャパシティプランニングの数値がない場合は、今日のワークロードを2倍にして、それを処理するように計画してください)。

  5. 購入しすぎるRAM今日は、明日環境が崩壊するよりも安価です。

    • First Corollary:必要以上に大きなサーバーを購入した場合、あなたは会社を運営し続けた先見の明のある管理者です。あなたはほとんど無視され、評価されません。
    • Second Corollary:マシンのサイズが小さすぎて問題がある場合、あなたは500%の成長を期待できなかった無能なバフーンであり、誰もがあなたを嫌っています。
8
voretaq7

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

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

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

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

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

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

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

ページングを開始する前にテストを実行したときに、メモリの量と接続の数を示していただけますか?

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

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

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

0
Ian Murphy