Jeśli na moim komputerze zabraknie pamięci i dużo się zamienia, to zwalniam lub zabijam aplikację marnującą pamięć RAM. Ale potem wszystkie moje pulpity / aplikacje zostały zamienione i są strasznie wolne, czy znasz sposób na „rozpakowanie” (przeładowanie z przestrzeni wymiany do pamięci RAM) na mój pulpit / aplikacje?
20
swapon
/swapoff
(jak sugeruje obecnie zaakceptowana odpowiedź), możesz chcieć rozpakować menedżera ekranu i wszystkie jego dzieci poprzez zrzucenie pamięci procesowych (co wymusza rozpakowanie). Zobacz także „Jak zmusić zamieniony proces zsh do zamiany?” Przy przepełnieniu stosu.Odpowiedzi:
Jeśli naprawdę masz wystarczająco dużo pamięci RAM, możesz użyć tej sekwencji (jako root):
(aby wymusić jawną zamianę wszystkich aplikacji)
(przy założeniu, że używasz Linuksa)
źródło
Poniższy szybki i brudny skrypt Pythona zrzuca pamięć procesu na standardowe wyjście. Ma to efekt uboczny ładowania dowolnej zamienionej strony lub zmapowanego pliku. Nazwij to tak, jakby
cat_proc_mem 123 456 789
argumentami były identyfikatory procesów.Ten skrypt jest całkowicie specyficzny dla Linuksa. Można go dostosować do innych systemów o podobnej
/proc
strukturze (Solaris?), Ale zapomnij o uruchomieniu go np. Na * BSD. Nawet w systemie Linux może być konieczna zmiana definicjic_pid_t
oraz wartościPTRACE_ATTACH
iPTRACE_DETACH
. Jest to skrypt sprawdzający zasadę, a nie jako przykład dobrych praktyk programistycznych. Używaj na własne ryzyko.Linux udostępnia pamięć procesu jako
/proc/$pid/mem
. Tylko niektóre zakresy adresów są czytelne. Te zakresy można znaleźć, odczytując informacje o mapowaniu pamięci z pliku tekstowego/proc/$pid/maps
. Pseudo-plik/proc/$pid/mem
nie może zostać odczytany przez wszystkie procesy, które mają uprawnienia do jego odczytu: proces czytający musiał go wywołaćptrace(PTRACE_ATTACH, $pid)
.Zobacz także więcej informacji na temat
/proc/$pid/mem
.źródło
kill -CONT 1234
gdzie 1234 to PID), aby go wznowić.Dla kompletności GDB może zrzucić obraz procesu. Nie sprawdziłem, czy to rozpakowuje, ale musi --- nie ma innego sposobu na odczytanie całej pamięci procesu:
gdb -p $mypid
a potem
(gdb) gcore /tmp/myprocess-core
Saved corefile /tmp/myprocess-core
źródło
gcore $pid
jest również dostępny poza gdb (jako mały skrypt opakowujący)gdb --batch -p $pid -ex "gcore /dev/null" 2>/dev/null
swapon / swapoff całkowicie wyczyści przestrzeń wymiany, ale możesz ją zwolnić również przez system plików / proc. Chcesz pierwszy:
przez http://linux-mm.org/Drop_Caches
źródło
sysctl vm.drop_caches=X
. Również sysctl jest łatwiejszy do sudo.