Używam msync w mojej aplikacji na Linux 2.6, aby zapewnić spójność w przypadku awarii. Muszę dokładnie przetestować moje użycie msync, ale implementacja wydaje się spłukiwać wszystkie odpowiednie strony dla mnie. Czy istnieje sposób, aby zapobiec automatycznemu płukaniu stron mmap'd na dysk, aby odsłonić błędne użycie msync z mojej strony?Jaki jest dobry sposób na przetestowanie używania msync na ostatnich jądrach systemu Linux?
Odpowiedz
Z przeprosinami @samold, "swappiness" nie ma z tym nic wspólnego. Swappiness wpływa tylko na to, jak kernel wymienia się zamianą brudnych stron anonimowych w porównaniu do eksmisji stron pamięci podręcznej stron, gdy pamięć jest niska.
Musisz grać z Linux VM tunables controlling the pdflush task. Na początek proponuję:
sysctl -w vm.dirty_writeback_centisecs=360000
Domyślnie vm.dirty_writeback_centisecs
wynosi 3000, co oznacza, że jądro rozważy każdy brudna strona starsze niż 30 sekund, aby być „zbyt stary” i spróbować przepłukać go na dysku. Przekręcając go do 1 godziny, powinieneś być w stanie uniknąć w ogóle płukania brudnych stron na dysku, przynajmniej podczas krótkiego testu. Z wyjątkiem ...
sysctl -w vm.dirty_background_ratio=80
Domyślnie vm.dirty_background_ratio
ma 10, jak w 10 procentach. Oznacza to, że gdy więcej niż 10 procent fizycznej pamięci jest zajmowane przez brudne strony, jądro będzie uważało, że musi zająć się spłukiwaniem czegoś na dysk, nawet jeśli jest ono młodsze niż dirty_writeback_centisecs
. Zakręć tym do 80 lub 90, a jądro powinno tolerować większość pamięci RAM zajmowanej przez brudne strony. (I nie byłoby ustawić to zbyt wysoki, choć od Założę nikt nie robi i może wywołać dziwne zachowanie). Z wyjątkiem ...
sysctl -w vm.dirty_ratio=90
Domyślnie vm.dirty_ratio
wynosi 40, co oznacza, że po raz 40 % pamięci RAM to brudne strony, procesy próbujące utworzyć bardziej brudne strony będą blokowane, dopóki coś nie zostanie eksmitowane. Zawsze rób ten większy niż dirty_background_ratio
. Hm, pomyśl o tym, ustaw to przed tym, żeby się upewnić, że ten jest zawsze większy.
To wszystko za moje wstępne sugestie. Możliwe, że twoje jądro i tak zacznie wyrzucać strony; VM Linuksa jest tajemniczą bestią i wydaje się być podkręcany w każdym wydaniu. Mam nadzieję, że stanowi to punkt wyjścia.
Zapoznaj się z Documentation/sysctl/vm.txt w źródłach jądra, aby uzyskać pełną listę ustawień tuningu maszyn wirtualnych. (Zaleca się zapoznać się z dokumentacją wersji jądra, której faktycznie używasz.)
Wreszcie, użyj /proc/PID/pagemap interface, aby zobaczyć, które strony są rzeczywiście brudne w dowolnym momencie.
Kilka domysły:
Można pobawić się swappiness systemu poprzez /proc/sys/vm/swappiness
regulowanej: (.. Wow proc(5)
musi być prowadzony przez sprawdzania pisowni)
/proc/sys/vm/swappiness
The value in this file controls how aggressively the
kernel will swap memory pages. Higher values increase
agressiveness, lower values descrease aggressiveness.
The default value is 60.
Jeśli ustawienie swappiness
na 0
nie wystarczy, dostępnych jest więcej dostrajalnych pokręteł; plik Documentation/laptops/laptop-mode.txt
zawiera dobry opis zachowań w laptop_mode
skryptu:
To increase the effectiveness of the laptop_mode strategy, the laptop_mode
control script increases dirty_expire_centisecs and dirty_writeback_centisecs in
/proc/sys/vm to about 10 minutes (by default), which means that pages that are
dirtied are not forced to be written to disk as often. The control script also
changes the dirty background ratio, so that background writeback of dirty pages
is not done anymore. Combined with a higher commit value (also 10 minutes) for
ext3 or ReiserFS filesystems (also done automatically by the control script),
this results in concentration of disk activity in a small time interval which
occurs only once every 10 minutes, or whenever the disk is forced to spin up by
a cache miss. The disk can then be spun down in the periods of inactivity.
może chcesz wziąć te numery do swoich skrajnych; Jeśli jesteś bardzo ciekawy zachowania aplikacji, rozsądnie jest ustawić te wartości całkiem wysoko i zobaczyć, jak długo trwa wykonanie polecenia sync(1)
. Są to jednak systemowe ustawienia - inne aplikacje mogą nie być tak szczęśliwe.
- 1. jaki jest dobry sposób na połączenie zestawu?
- 2. Najlepszy sposób na przetestowanie skryptu poczty wsadowej
- 3. Najlepszy sposób na przetestowanie pełnoekranowej tekstury
- 4. Najlepszy sposób na przetestowanie narzędzi wiersza poleceń?
- 5. Czy istnieje sposób na przetestowanie połączenia SQLAlchemy?
- 6. Jaki jest dobry sposób na * tymczasowe * sortowanie wektora?
- 7. Jaki jest dobry sposób na rozdzielanie ciągów tutaj?
- 8. Jaki jest dobry sposób na uzyskanie rozmiaru pliku?
- 9. Dobry, mały kompilator Haskell dla systemu Linux?
- 10. Jaki jest dobry sposób renderowania zakreślonych czcionek?
- 11. Jaki jest dobry sposób debugowania kodu haskell?
- 12. Jaki jest najlepszy sposób na przetestowanie kontrolera w Laravel bez testowania trasy zbyt
- 13. Jaki jest skuteczny sposób na stworzenie systemu uprawnień?
- 14. Najlepszy sposób na przetestowanie interfejsu REST XML API Rails?
- 15. Dobry sposób na uniknięcie "udostępniania"?
- 16. Jaki jest najlepszy sposób na zdiagnozowanie i profilowanie MySQL na serwerze produkcji na żywo?
- 17. Jaki jest najlepszy sposób na seed srand()?
- 18. Szukasz wdrożenie systemu wywołuje na jądrze Linux
- 19. Jaki jest najlepszy sposób na równoczesny test kodu jednostki Erlang?
- 20. Jaki jest rozsądny sposób używania wzorców kodowania MVVM z HTML5
- 21. Jaki jest dobry sposób na wykorzystanie cmdlet PowerShell w systemie kompilacji NAnt?
- 22. Dobry sposób na generowanie identyfikatorów GUID na silniku aplikacji?
- 23. Jaki jest dobry sposób na określenie, co jest w moim widoku?
- 24. Jaki jest najlepszy sposób na uzyskanie ostatnich elementów N z tablicy Perla?
- 25. Jaki jest cel używania?
- 26. DLL systemu Windows na Linux System
- 27. Dobry sposób na wstępne ładowanie .NET assembly
- 28. zmienić na dobry pomysł mysqli?
- 29. Scala: dobry sposób na utrzymanie par łańcuchów
- 30. Jaki jest dobry sposób synchronizacji plików kodu między komputerem?
To wydaje się być odpowiedzią na zadane pytanie, ale myślę, że zadałem niewłaściwe pytanie. Naprawdę chciałbym zobaczyć, jak będzie wyglądała zawartość pliku po wyłączeniu/włączeniu zasilania, jeśli nie było automatycznego płukania (co jest moim założeniem w najgorszym przypadku). Jednak z mojego zrozumienia, nawet jeśli strony nie zostaną przepłukane, zmiany mogą zostać odzwierciedlone w innych procesach. Pytanie brzmi, w jaki sposób uzyskać migawkę pliku z wyłączeniem niezamkniętych zmian? Cieszę się, że mogę napisać fałszywe opakowanie mmap, jeśli to jest potrzebne, ale nie chcę wymyślać koła. – user836336
Cóż, O_DIRECT umożliwia odczytanie pliku z pominięciem pamięci podręcznej strony, ale nie jestem pewien, jaki wpływ może mieć _na_ pamięć podręczna strony ... I pamiętaj, że wszystkie takie odczyty będą musiały być wyrównane do 512 bajtów (lub jest to 4096 ? Zapominam). Tak więc pomiędzy tymi ustawieniami (aby brudne strony nie były przepłukiwane),/proc/PID/pagemap (aby określić, które strony są brudne), i O_DIRECT (aby odczytać dane pliku bezpośrednio z dysku), możesz być w stanie uzyskać to, co chcesz . – Nemo