2011-07-09 11 views

Odpowiedz

7

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.

+0

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

+1

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

0

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.

Powiązane problemy