web-dev-qa-db-ja.com

私のすべてのメモリを何が使用していますか?

解決策:このスレッドには読むべきものがたくさんあるので、ここで要約して支援します。

問題は、OSにキャッシュをダンプさせてワーキングセットのサイズを減らすために、OSが認識する「使用中」のメモリ量を「膨らませる」VMWareESXバルーンドライバです。これにより、プロセスを確認しても説明できない「使用中」の物理RAMが大量に作成されます。 VMのVMWareコンソールのパフォーマンスグラフを見て、使用中のバルーンドライバーを確認できます。

パフォーマンスの解決策は、サーバー用に予約されているメモリの量を増やすことでした。これにより、バルーンドライバーが盗むことができるメモリの量が制限されます。

SQL Serverのローカルコピー(フルバージョン、エクスプレスではない)を実行し、複数の開発者向けにVisual Studio2008開発環境をホストする32ビットのWindows2003ターミナルサーバーがあります。マシンは、4GBのメモリが割り当てられたvSphere4で実行されている仮想マシンです。

2人または3人のユーザーがログインしている場合、4 GBを超えるコミットされたメモリを使用していますが、このメモリのほとんどがどこで使用されているかがわかりません。すべてのユーザーのタスクマネージャーですべてのメモリを合計すると、最大で約2GBしか使用できません。残りは何を使っているの?

SQLサーバーを循環させてみましたが、SQLサーバーに割り当てられていると思われるメモリのみが削除されます。 Visual Studioについても同じことが言えます。シャットダウンすると、タスクマネージャーで割り当てられた量だけがコミットされたメモリプールから取り出されます。また、SQLServerのメモリオプションを最大512MBのみを使用するように設定しました。

Windowsはコミットされた統計AFAIKにそのメモリを含まないため、これがシステムまたはファイルキャッシュの問題であるとは思わない。

それは私を狂わせています。使用していると思われる量に基づいて、これらすべてに十分なメモリが必要です。この余分なメモリが使用されている場所を特定するにはどうすればよいですか?

更新

私が見ているメモリ統計に関しては、どれも合計されていません。

たとえば、現在1人のユーザーがログオンし、Visual StudioとWebDevサーバーのみを実行し、SQLServerとIISをバックグラウンドで実行しています。プライベートバイトを合計すると、約1049740Kが取得されます。メモリですが、タスクマネージャによると、コミット料金は1146Mであり、約150Mbは考慮されていません。

3人のユーザーがログインしている場合、それは約2GBのプライベートバイトです(ユーザーはVisual Studioを実行しているだけなので、多くのメモリが共有されます)。

VMサイズも合計されません。これは、通常、プライベートバイトとそれほど変わらないためです。奇妙なことに、仮想メモリのProcess Explorerの数は、タスクマネージャーの数とは大きく異なります。 PEは、SQLServerの仮想メモリをSQLServerの場合は1,791,444K、Visual Studioの場合は1,251,432Kと示していますが、コミット料金はマシンの合計でわずか1146Mです。

タスクマネージャーにはWSサイズの列はありませんが、PEではWSがプライベートと共有可能の両方としてリストされており、これらの数値は合計してもコミット料金よりも大幅に少なくなっています。

更新:

この質問には多くの詳細があることを私は知っているので、おそらく質問は明確ではありません。

システム内のすべてのコミットされたメモリを使用しているプロセスを見つけるにはどうすればよいですか? TaskManagerとProcessExplorerによって提供されたメモリは正しく合計されず、4GBがコミットされていても約2GBのコミットされたメモリしか表示されません。

4

sQLサーバーとVMウェアツールは、VMのメモリスペースを求めて戦います。これはおそらく、ターミナルサービスとvsを実行することによって悪化します。

まだ行っていない場合は、vmの設定に移動し、[リソース]タブで完全な4Gbメモリ予約を作成します。これにより、バルーンドライバーがVM内のメモリを再利用しようとするのを防ぐことができます。

また、SQLサーバー内でオプションを構成して、システムのRAMの一部のみが割り当てられるようにすることもできます。多分最大2GB.

1
Chris Thorpe

おそらくSQLサーバーです。デフォルトでは(私が間違っていない場合)、SQLサーバーは、特定の量のメモリを消費するように特別に構成されていない限り、できるだけ多くのメモリを割り当てます(SQLサーバーのプロパティでアクセスされます)。この割り当てられたメモリは、タスクマネージャに表示されません。あなたがする必要があるのは、perfmonを起動し、「SQL Server:Memory Manager:TargetServerMemory」と「SQLServer:Memory Manager:Total ServerMemory」カウンターを追加して、SQLServerが消費するメモリの量と方法を確認することです。それが実際に消費している多くのメモリ。

0
joeqwerty