マルチコア4ウェイサーバーで実行されている大規模なマルチスレッドC#アプリケーションがあります。現在、「サーバーモード」のガベージコレクションを使用しています。ただし、テストの結果、ワークステーションモードのGCの方が高速であることがわかっています。
MSDNによると :
サーバーAPIを使用するマネージコードアプリケーションは、デフォルトのワークステーションGCの代わりにサーバー最適化ガベージコレクター(GC)を使用することで大きなメリットが得られます。
ワークステーションはデフォルトのGCモードであり、シングルプロセッサコンピュータで使用できる唯一のモードです。ワークステーションGCは、コンソールおよびWindowsフォームアプリケーションでホストされます。実行中のプログラムと同時に完全な(第2世代)コレクションを実行するため、待ち時間が最小限に抑えられます。このモードは、通常、生のスループットよりも知覚されるパフォーマンスの方が重要であるクライアントアプリケーションに役立ちます。
サーバーGCは、マルチプロセッサコンピューターでのみ使用できます。プロセッサごとに個別のマネージヒープとスレッドを作成し、コレクションを並行して実行します。収集中、すべての管理対象スレッドが一時停止されます(ネイティブコードを実行しているスレッドは、ネイティブ呼び出しが戻ったときにのみ一時停止されます)。このように、サーバーGCモードはスループット(1秒あたりの要求数)を最大化し、プロセッサーの数が増えるにつれてパフォーマンスを向上させます。パフォーマンスは、4つ以上のプロセッサを搭載したコンピュータで特に際立っています。
しかし、私たちはパフォーマンスが輝いているのを見ていません!!!!誰かアドバイスはありますか?
あまりよく説明されていませんが、私が知る限り、サーバーモードはコアごとに同期していますが、ワークステーションモードは非同期です。
言い換えると、ワークステーションモードは、一貫したパフォーマンスを必要とする少数の長時間実行アプリケーションを対象としています。ガベージコレクションは「邪魔にならないように」しようとしますが、その結果、平均して効率が低下します。
サーバーモードは、各「ジョブ」が比較的短命で、単一のコアによって処理されるアプリケーションを対象としています(編集:マルチスレッドWebサーバーを考えてください)。アイデアは、各「ジョブ」がすべてのCPUパワーを取得し、迅速に実行されるというものですが、コアが要求の処理を停止してメモリをクリーンアップする場合があります。したがって、この場合、GCが平均してより効率的であることが期待されますが、実行中はコアが使用できないため、アプリケーションはそれに適応できる必要があります。
あなたの場合、スレッドが比較的結合されている単一のアプリケーションがあるため、2番目のモードではなく最初のモードで期待されるモデルによりよく適合しているように聞こえます。
しかし、それはすべて事後の正当化です。システムのパフォーマンスを測定し(ammoQが言ったように、GCのパフォーマンスではなく、アプリケーションの動作の良さ)、測定したものを使用して最適なものにします。
.NET 4.5では、同時サーバーガベージコレクションが導入されています。
http://msdn.Microsoft.com/en-us/library/ee787088.aspx
specify <gcServer enabled="true"/>
specify <gcConcurrent enabled="true"/> (this is the default so can be omitted)
そして、新しいSustainedLowLatencyModeがあります。
.NET Framework 4.5では、SustainedLowLatencyモードはワークステーションとサーバーGCの両方で使用できます。オンにするには、GCSettings.LatencyModeプロパティをGCLatencyMode.SustainedLowLatencyに設定します。
サーバー:プログラムはマシン上で唯一の重要なアプリケーションであり、GCのレイテンシを可能な限り低くする必要があります。
ワークステーション:UIがあるか、マシンを他の重要なプロセスと共有しています