Ausführen einer .NET-Anwendung unter Windows Server 2008 x64 mit 16 GB RAM. Diese Anwendung muss eine sehr große Datenmenge (etwa 64 GB) abrufen und analysieren und sie alle gleichzeitig im Speicher behalten..NET Garbage Collector und x64 virtueller Speicher
Was ich zu sehen erwarte: Die Prozessgröße wird von 16 GB auf 64 GB erweitert. Windows verwendet virtuellen Speicher, um die zusätzlichen Daten je nach Bedarf auf die/von der Festplatte zu übertragen. Dies ist der klassische Anwendungsfall für virtuellen Speicher.
Was ich tatsächlich sehe: Die Prozessgröße ist auf die Größe des physischen Speichers (16 GB) begrenzt. Die Anwendung verbringt 99,8% ihrer Zeit im Garbage Collector.
Warum verwendet unsere Anwendung keinen virtuellen Speicher? Ist dies ein Problem bei der Konfiguration des .NET-Garbage Collectors oder im virtuellen Windows x64-Speichermanager selbst? Was kann ich tun, damit unsere Anwendung virtuellen Speicher verwendet und nicht auf physischen Speicher beschränkt ist?
Danke.
- Brian
Update: Ich habe ein sehr kleines Programm geschrieben, das das gleiche Verhalten zeigt:
using System;
namespace GCTest
{
class Program
{
static void Main()
{
byte[][] arrays = new byte[100000000][];
for (int i = 0; i < arrays.Length; ++i)
{
arrays[i] = new byte[320];
if (i % 100000 == 0)
{
Console.WriteLine("{0} arrays allocated", i);
System.Threading.Thread.Sleep(100);
}
}
}
}
}
Wenn Sie wollen, es versuchen, stellen Sie sicher, für x64 zu bauen. Möglicherweise müssen Sie die Konstanten etwas ändern, um Ihr System zu belasten. Das Verhalten, das ich sehe, ist, dass der Prozess abstürzt, wenn er sich einer Größe von 16 GB nähert. Es wird keine Fehlermeldung oder Ausnahme ausgelöst. Der Leistungsmonitor meldet, dass sich der Prozentsatz der CPU-Zeit in GC 100% nähert.
Ist das nicht inakzeptabel? Wo ist das virtuelle Speichersystem?
Was verwenden Sie, um die Größe des Prozesses zu bestimmen? (Lassen Sie uns zuerst die einfachen Optionen beseitigen :)) – Paolo
"Commit Größe" vom Windows Task-Manager. Außerdem verwenden Sie "# Gesamtzahl festgeschriebene Bytes" im Systemmonitor. Ich bin mir ziemlich sicher, dass ich die Größe des virtuellen Speichers des Prozesses und nicht seine physische Arbeitsmenge messe. – brianberns
Kann ich das Offensichtliche fragen? Müssen Sie _really_ alle auf einmal in den Speicher laden? Ist es möglich, einen anderen Ansatz zu wählen und eine Art manuelles Paging durchzuführen? – CodingGorilla