Czy w systemie Windows 8.1 istnieje sposób, aby proces nie został zabity jako pierwszy po wyczerpaniu pamięci RAM?


18

Napisałem aplikację .NET 4.5, która buforuje dane koloru, podczerwieni i głębokości z Kinect v2, wykonuje na nim pewne przetwarzanie, a następnie zrzuca je na dysk w nieskompresowanej formie; aplikacja .NET uruchamia także ffmpeg jako podproces i przesyła do niej kolorowe dane, które mają być zakodowane jako H.264.

Ponieważ nie używam dysku SSD, dane wideo docierają szybciej niż mogę zapisać na dysk. Ale to w porządku, dopuszczalne jest odrzucanie klatek wideo, gdy brakuje mi pamięci RAM. Moim jedynym wymaganiem jest to, aby cokolwiek trzymałem, to w większości ciągłe fragmenty wideo od 8 do 10 sekund. Dodałem więc trochę logiki do mojej aplikacji .NET 4.5, aby rozpocząć odrzucanie ramek wideo, gdy nie mam wystarczającej ilości pamięci RAM, aby buforować ciągłe 8 do 10 sekund wideo (około 1,5 do 2 GB).

Aby zapobiec przeładowaniu stron, całkowicie wyłączyłem pliki stronicowania. To daje mi 16 GB fizycznej pamięci RAM.

Mój problem polega na tym, że nawet przy takim mechanizmie czasami moja aplikacja .NET lub podproces ffmpeg wciąż giną, gdy Windows 8.1 obawia się o niską pamięć RAM, ponieważ oczywiście moja aplikacja używa najwięcej pamięci RAM, gdy ma ogromne zaległości danych wideo zapisywać na dysk. Czy istnieje sposób, aby powiedzieć systemowi Windows, że moje procesy są ważniejsze niż inne, aby system Windows najpierw zaczął zabijać inne mniej ważne procesy?


10
Nie myślałem, że Windows zabija procesy, myślałem, że to była funkcja tylko dla Linuksa.
Scott Chamberlain,

4
@ScottChamberlain: To dlatego, że wyłączenie pliku stronicowania w systemie Windows jest bardzo rzadkie. Zapewnia ci wszelkiego rodzaju nieoczekiwane i niezwykłe zachowania. Oczywista odpowiedź brzmi: „nie wyłączaj pliku stronicowania; to zmusza system Windows do przechowywania nieużywanych danych w pamięci RAM, aby twoja aplikacja nie mogła użyć tej pamięci RAM”
MSalters

1
Gdyby to było pytanie StackOverflow, mógłbym wskazać, CreateMemoryResourceNotificationktóre jest o wiele mniej hackerskie.
MSalters,

7
@Kal: Jeśli dostęp do dysku stanowi wąskie gardło, użyj silniejszej kompresji, jeśli procesor jest wąskim gardłem, użyj szybszej kompresji. Jeśli oba są wąskim gardłem, ponownie przemyśl cały projekt i zacznij od nowa lub uzyskaj lepszy sprzęt.
Mooing Duck,

1
@FactorMystic OMG co zrobił? Wyłączenie pliku strony znacznie zmniejszy użyteczną pamięć RAM.
Aron,

Odpowiedzi:


45

Windows nie zabija procesów, gdy cała pamięć RAM jest używana. W rzeczywistości procesy nie przydzielają pamięci i ulegają awarii.

Dzieje się tak, ponieważ cała twoja pamięć fizyczna jest używana i ponieważ plik stronicowania jest wyłączony, menedżer pamięci nie ma już możliwości zapisywania stron, które nie są używane. Dzięki temu fizyczna pamięć RAM jest pełna, a gdy proces lub cokolwiek innego uruchomionego w tym czasie próbuje przydzielić stronę, kończy się niepowodzeniem. Awaria niektórych aplikacji.

Ta prezentacja Technet wyjaśnia: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

Plik strony zapobiega awariom aplikacji po wykorzystaniu całej pamięci, działając jako zabezpieczenie przed nadmiernym zaangażowaniem.

Pamięć wirtualna jest właściwie podstawą tego, w jaki sposób nowoczesne systemy operacyjne przydzielają zasoby, więc chodzi o to, aby w pamięci RAM były używane rzeczy i przenosić je z dysku.

Tak naprawdę są tylko dwie odpowiedzi:

  1. Ponownie włącz plik stronicowania i zwiększ ilość pamięci RAM na komputerze, aby zmniejszyć liczbę przeładowań dysku.
  2. Zmniejsz wymagania dotyczące pamięci aplikacji.

Najważniejsze jest to, że pamięć RAM to tylko kolejny poziom pamięci podręcznej, a wszystkie rzeczy związane z pamięcią wirtualną, plikami stron, plikami mapowanymi w pamięci i wszystko to w zasadzie sprowadza się do tego: jeśli kończy się pamięć, musisz dodać więcej.


4
Lub użyj mniej ....
nhgrif

1
Pamiętaj, że zaległości się zwiększają, ponieważ danych nie można wystarczająco szybko zapisać na dysku. Nie sądzę, że włączenie pamięci wirtualnej na tym samym dysku może tam pomóc ...
Alexander

3
W rzeczywistości plik stronicowania znajdzie się gdzieś na dysku. A ponieważ wiemy, że nie jest to dysk SSD, oznacza to wyszukiwanie fizyczne, które jest najwolniejszą operacją dysku.
MSalters,

9
Wygląda na to, że potrzebujesz wtedy wyraźnego zarządzania pamięcią w swojej aplikacji ...
Joe

1
@ Joe dokładnie to. Śmieciarka sprawi, że zarządzanie pamięcią stanie się koszmarem w tego typu sytuacjach. Ten typ sytuacji jest dla mnie trywialny w C ++, ponieważ mam precyzyjną kontrolę nad zużyciem pamięci. Chociaż istnieją wzorce projektowe, które będą działać dobrze w tym przypadku również w języku C #, nie jest to tak proste, jak większość ludzi by próbowała.
Thebluefish,

0

Przejdź przez Panel narzędzi systemu Windows i ustawienia zaawansowane i wyłącz niepotrzebne rzeczy, takie jak efekty okien, jeśli jeszcze tego nie zrobiłeś, i uzyskaj Sysinternals Process Explorer i / lub Monitor systemu, aby znaleźć i wyłączyć wszystko, co marnuje procesor lub pamięć.

Co ważniejsze, użyj Process Explorer i / lub Monitora systemu, aby obserwować, jak program się uruchamia, i zobaczyć dokładnie, gdzie i jak się nie powiedzie. Który wątek zabraknie pamięci i najpierw umiera - główna część prgm czy ffmpeg? Czy istnieje konkretna biblioteka DLL lub inny udostępniony zasób, którego rozmiar nieoczekiwanie rośnie? A może wykonanie przebiega poprawnie, z wyjątkiem odgryzania większej ilości danych niż do żucia?

Dokładniejsze określenie natury problemu prawdopodobnie wskaże kierunek rozwiązania. Możesz na przykład bardziej agresywnie wdrożyć zasady pomijania klatek, optymalizując je lepiej pod kątem kryterium 8–10 sekund w celu uzyskania niższego całkowitego obciążenia pamięci RAM

Końcowe sugestie: Może warto rozważyć przejście na Linuksa, a tymczasem ponownie włączyć plik stronicowania (linux nazywa go przestrzenią wymiany, co sprawia, że ​​brzmi to bardziej zabawnie IMHO, jak wymiana spotkań czy coś takiego!) Powodzenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.