Jeśli użyję następującego połączenia w C++, oczekiwałbym, że WorkingSet procesu nigdy nie spadnie poniżej 100 MB.Czy istnieje sposób zmusić WorkSet procesu do 1GB w C++?
Jednak system operacyjny nadal przycina zestaw roboczy z powrotem do 16 MB, nawet jeśli wykonam to połączenie.
Ustawienie zestawu roboczego na 100 MB doprowadziłoby do dramatycznego zwiększenia szybkości aplikacji, eliminując błędy stronicowania strony (zobacz poniższy diagram).
Co robię źle?
SIZE_T workingSetSizeMB = 100;
int errorCode = SetProcessWorkingSetSizeEx(
GetCurrentProcess(),
(workingSetSizeMB - 1) * 1024 * 1024), // dwMinimumWorkingSetSize
workingSetSizeMB * 1024 * 1024, // dwMaximumWorkingSetSize,
QUOTA_LIMITS_HARDWS_MIN_ENABLE | QUOTA_LIMITS_HARDWS_MAX_DISABLE
);
// errorCode returns 1, so the call worked.
(extra dla ekspertów)Experimental Metodologia
Napisałem testowy C++ projekt przeznaczyć 100MB danych w celu doprowadzenia WorkingSet ponad 100MB (patrząc w ciągu Process Explorer), a następnie zwalniane że pamięć. Jednak system operacyjny zdemontował WorkingSet z powrotem do 16 MB, gdy tylko zwolniłem tę pamięć. Mogę dostarczyć testowy projekt C++, którego użyłem, jeśli chcesz.
Dlaczego system Windows wywołuje funkcję SetProcessWorkingSetSizeEx(), jeśli nie działa? Muszę robić coś złego.
Poniższy diagram pokazuje dramatyczny wzrost liczby błędów stronicowania (czerwonych impulsów), gdy zielona linia (zestaw roboczy) spadła z 50 MB do 30 MB.
Aktualizacja
W końcu skończyło się na ignorowanie problemu, gdyż nie wpłynąć na wydajność, że dużo.
Co ważniejsze, SetProcessWorkingSetSizeEx robi nie kontrolę prądu WorkingSet i jest nie związanych w jakikolwiek sposób z miękkich błędów stron. Wszystko, co robi, to zapobieganie ciężkim awariom stron, uniemożliwiając przeniesienie bieżącego WorkSet na dysk twardy.
Innymi słowy, jeśli chcemy zmniejszyć błędy stronicowania, funkcja SetProcessWorkingSetSizeEx nie ma żadnego efektu, ponieważ odnosi się do poważnych błędów stronicowania.
Istnieje świetny zapis w "Windowsie przez C/C++" (Richter), który jak Windows zajmuje się pamięcią.
Jak można oczekiwać, że system operacyjny będzie przechowywać więcej stron w pamięci niż zostało przez Ciebie przydzielone? –
@James McNellis Jeśli system operacyjny mógłby zachować więcej stron w zestawie roboczym, liczba błędów stron zmniejszyłaby się, co znacznie przyspieszyłoby program. Na serwerze mamy 16 GB wolnej pamięci RAM i nie zaszkodzi mieć 1GB na stałe przypisanym do tego procesu (co zmniejszyłoby liczbę błędów stronicowania do 0). – Contango
@Gravitas: Jak alokować pamięć i uzyskiwać do niej dostęp? – ybungalobill