Gibt es in Windows 8.1 eine Möglichkeit, sicherzustellen, dass ein Prozess nicht der erste ist, der beendet wird, wenn der Arbeitsspeicher knapp wird?

18

Ich habe eine .NET 4.5-Anwendung geschrieben, die Farb-, Infrarot- und Tiefendaten von einem Kinect v2 puffert, einige Verarbeitungsschritte ausführt und diese dann in unkomprimierter Form auf die Festplatte kopiert. Die .NET-Anwendung startet ffmpeg auch als Unterprozess und leitet Farbdaten zur Kodierung als H.264 weiter.

Da ich keine SSD verwende, kommen die Videodaten schneller an, als ich auf die Festplatte schreiben kann. Aber das ist in Ordnung. Es ist für mich akzeptabel, Videobilder zu verwerfen, wenn der Arbeitsspeicher knapp ist. Meine einzige Anforderung ist, dass alles, was ich behalte, größtenteils zusammenhängende 8- bis 10-Sekunden-Videostücke sind. Daher habe ich in meiner .NET 4.5-Anwendung eine Logik hinzugefügt, mit der ich anfange, Videobilder zu verwerfen, wenn ich nicht genug RAM habe, um zusammenhängende 8 bis 10 Sekunden Video zu puffern (ungefähr 1,5 bis 2 GB).

Und um ein Überladen der Seiten zu verhindern, habe ich Auslagerungsdateien vollständig deaktiviert. Dadurch habe ich insgesamt 16 GB physischen Arbeitsspeicher.

Mein Problem ist, dass selbst mit diesem Mechanismus manchmal meine .NET-Anwendung oder der ffmpeg-Unterprozess immer noch abstürzen, wenn Windows 8.1 wegen des niedrigen Arbeitsspeichers ausfällt, da meine Anwendung offensichtlich den meisten Arbeitsspeicher verwendet, wenn es einen großen Rückstand an Videodaten gibt auf die Festplatte schreiben. Gibt es eine Möglichkeit, Windows mitzuteilen, dass meine Prozesse wichtiger sind als andere, sodass Windows andere weniger wichtige Prozesse zuerst beendet?

Kal
quelle
10
Ich dachte nicht, dass Windows Prozesse abbricht, ich dachte, dass dies nur eine Linux-Funktion ist.
Scott Chamberlain
4
@ScottChamberlain: Das liegt daran, dass das Ausschalten der Auslagerungsdatei unter Windows sehr selten ist. Es bringt Sie zu allen Arten von unerwartetem und ungewöhnlichem Verhalten. Die offensichtliche Antwort ist hier „nicht die Auslagerungsdatei deaktivieren, dass Kräfte von Windows nicht verwendeten Daten im RAM zu halten , damit Ihre App nicht , dass der RAM nutzen kann“
MSalters
1
Wenn dies eine StackOverflow-Frage wäre, könnte ich Sie darauf hinweisen, CreateMemoryResourceNotificationdie viel weniger hackig ist.
MSalters
7
@Kal: Wenn der Festplattenzugriff ein Engpass ist, verwenden Sie eine stärkere Komprimierung. Wenn die CPU ein Engpass ist, verwenden Sie eine schnellere Komprimierung. Wenn beides ein Engpass ist, überdenken Sie Ihr gesamtes Design und fangen Sie von vorne an oder holen Sie sich bessere Hardware.
Mooing Duck
1
@FactorMystic OMG hat er was gemacht? Durch Deaktivieren der Auslagerungsdatei wird der nutzbare Arbeitsspeicher erheblich reduziert.
Aron

Antworten:

45

Windows bricht keine Prozesse ab, wenn der gesamte Arbeitsspeicher verwendet wird. Was tatsächlich passiert, ist, dass Prozesse keinen Speicher zuweisen und abstürzen.

Dies geschieht, weil der gesamte physische Speicher verwendet wird und weil die Auslagerungsdatei deaktiviert ist, kann der Speichermanager keine Seiten mehr schreiben, die nicht verwendet werden. Dadurch bleibt der physische Arbeitsspeicher voll, und wenn Ihr Prozess oder eine andere gerade ausgeführte Komponente versucht, eine Seite zuzuweisen, schlägt dies fehl. Einige Anwendungen stürzen ab.

In dieser Präsentation von Technet wird Folgendes erläutert: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

Die Auslagerungsdatei verhindert, dass Anwendungen abstürzen, wenn Sie den gesamten Speicher ausnutzen, indem Sie als Rückstopp für die Überbeanspruchung fungieren.

Virtueller Speicher ist so ziemlich das Fundament dafür, wie moderne Betriebssysteme Ressourcen zuweisen. Es geht also darum, dass Dinge im RAM verwendet werden und dass Dinge auf die Festplatte verschoben werden.

Es gibt wirklich nur zwei Antworten:

  1. Aktivieren Sie die Auslagerungsdatei erneut, und erhöhen Sie den RAM-Speicher Ihres Computers, um die Auslastung der Festplatte zu verringern.
  2. Reduzieren Sie den Speicherbedarf Ihrer Anwendung.

Das Fazit ist, dass RAM nur eine weitere Cache-Ebene ist und all das, was mit virtuellem Speicher, Auslagerungsdateien, Speicherzuordnungsdateien zu tun hat, und alles, was im Grunde dazugehört: Wenn Ihnen der Speicher ausgeht, müssen Sie hinzufügen Mehr.

Dawn Benton
quelle
4
Oder verwenden Sie weniger ....
nhgrif
1
Beachten Sie, dass sich das Backlog aufbaut, da die Daten nicht schnell genug auf die Festplatte geschrieben werden können. Ich denke nicht, dass das Aktivieren des virtuellen Speichers auf derselben Festplatte dort helfen kann ...
Alexander
3
Tatsächlich befindet sich die Auslagerungsdatei an einer anderen Stelle auf der Festplatte. Und da wir wissen, dass es sich nicht um eine SSD handelt, bedeutet dies eine physische Suche, bei der es sich um die langsamste Festplattenoperation handelt.
MSalters
9
Klingt so, als ob Sie in Ihrer Anwendung eine explizite Speicherverwaltung benötigen ...
Joe
1
@ Joe genau das. Der Garbage Collector wird die Speicherverwaltung in solchen Situationen zu einem Albtraum machen. Diese Art von Situation ist für mich in C ++ trivial, da ich die Kontrolle über die gesamte Speichernutzung habe. Obwohl es Entwurfsmuster gibt, die auch für diesen Fall in C # gut funktionieren, ist dies nicht so einfach, wie es die meisten Leute versuchen würden.
Thebluefish
0

Durchsuchen Sie die Windows-Systemsteuerung und die erweiterten Einstellungen und deaktivieren Sie nicht benötigte Elemente, z. B. Fenstereffekte, sofern Sie dies noch nicht getan haben, und lassen Sie Sysinternals Process Explorer und / oder System Monitor nach fremden Elementen suchen und diese deaktivieren, die CPU oder Speicher verschwenden.

Noch wichtiger ist, dass Sie Process Explorer und / oder System Monitor verwenden, um zu beobachten, wie Ihr Programm ausgeführt wird, und genau zu sehen, wo und wie es fehlschlägt. Welcher Thread hat zu wenig Speicher und stirbt zuerst - das Hauptprogramm oder der ffmpeg-Teil? Gibt es eine bestimmte DLL oder eine andere freigegebene Ressource, deren Größe unerwartet steigt? Oder läuft die Ausführung korrekt ab, außer dass mehr abgebissen wird, als Daten eingekaut werden können?

Wenn Sie die Art Ihres Problems genauer herausfinden, werden Sie wahrscheinlich in die Richtung einer Lösung weisen. Sie können beispielsweise Ihre Richtlinie zum Löschen von Frames aggressiver implementieren und gleichzeitig die Optimierung für Ihr 8-10-Sekunden-Chunk-Kriterium optimieren, um insgesamt einen geringeren RAM-Overhead zu erzielen

Letzte Vorschläge: Vielleicht überlegen Sie, auf Linux umzusteigen, und aktivieren Sie in der Zwischenzeit die Auslagerungsdatei erneut (Linux nennt sie den Auslagerungsbereich, wodurch es meiner Meinung nach lustiger klingt, wie eine Auslagerungssitzung oder so!). Viel Glück.

NS-MoCompSvc
quelle