Zdarza mi się to dość często, kiedy kompiluję oprogramowanie w tle i nagle wszystko zaczyna zwalniać i ostatecznie zamarzać [jeśli nic nie robię], ponieważ skończyły mi się zarówno pamięć RAM, jak i przestrzeń wymiany.
To pytanie zakłada, że mam wystarczająco dużo czasu i zasobów, aby otworzyć Terminal Gnome, przeszukać moją historię i wykonać jedno sudo
polecenie.
Jakie polecenie może mnie uratować przed koniecznością ponownego uruchomienia komputera lub jakiegokolwiek ponownego uruchomienia?
command-line
ram
freeze
swap
Akiva
źródło
źródło
make
spróbuj-j4
na przykład dla 4 równoległych wersji na raz.Odpowiedzi:
Z mojego doświadczenia wynika, że Firefox i Chrome zużywają więcej pamięci RAM niż moje pierwsze 7 komputerów łącznie. Prawdopodobnie więcej niż to, ale uciekam od mojego punktu. Pierwszą rzeczą, którą powinieneś zrobić, to zamknąć przeglądarkę . Komenda?
Połączyłem tam najpopularniejsze przeglądarki w jedno polecenie, ale oczywiście jeśli używasz czegoś innego (lub wiesz, że nie używasz jednego z nich), po prostu zmodyfikuj to polecenie. To
killall -9 ...
jest ważny kawałek. Ludziom nie podoba sięSIGKILL
(sygnał numer 9), ale przeglądarki są wyjątkowo odporne. Co więcej, powolne zakończenie przezSIGTERM
oznacza, że przeglądarka robi mnóstwo śmieci po czyszczeniu - co wymaga dużej ilości dodatkowej pamięci RAM - i na to nie możesz sobie pozwolić w tej sytuacji.Jeśli nie możesz dostać się do już działającego terminala lub dialogu Alt+ F2, rozważ zmianę na TTY. Control+ Alt+ F2przeniesie Cię do TTY2, który powinien pozwolić ci się zalogować (choć może być powolny), a nawet pozwolić ci użyć czegoś takiego jak
htop
debugowanie problemu. Nie sądzę, że kiedykolwiek zabrakło mi pamięci RAM do tego stopnia, że nie mogłem wstaćhtop
.Długoterminowe rozwiązanie polega albo na zakupie większej ilości pamięci RAM, wypożyczeniu jej za pośrednictwem zdalnego komputera lub na niewykonaniu tego, co obecnie robisz. Pozostawię ci skomplikowane argumenty ekonomiczne, ale ogólnie rzecz biorąc, RAM jest tani w zakupie, ale jeśli potrzebujesz tylko ilości seryjnej, serwer VPS naliczany za minutę lub godzinę jest dobrym wyborem.
źródło
lazygit
od czasu do czasu kilka poleceń powiązanych z własnym poleceniem, może coś takiego można zastosować tutaj? Całykillall ...
skrypt można sprowadzić do prostegoemptyram
lub czegoś takiegoemptyram
scenariusz, niż po prostu wbić gokillall -9 firefox
.W systemie z włączonym klawiszem żądania magicznego systemu naciśnięcie Alt + System Request+ f(jeśli nie jest zaznaczone na klawiaturze, System Requestczęsto znajduje się na Print Screenklawiszu) spowoduje ręczne wywołanie zabójcy pamięci poza jądrem (oomkiller), który próbuje wybrać najgorszy proces obrażania dla użycie pamięci i zabij to. Możesz to zrobić, jeśli masz mniej czasu, niż opisałeś, a system właśnie zaczyna (lub może już zaczął) thrashowanie - w takim przypadku prawdopodobnie nie obchodzi Cię dokładnie, co zostanie zabite, tylko to, że skończysz z użytecznym systemem. Czasami może to doprowadzić do zabicia X, ale w dzisiejszych czasach dużo lepiej jest wybrać zły proces niż kiedyś.
źródło
kernel.sysrq
na1
lub liczbę zawierającą właściwy bit w twoim/etc/sysctl.d/10-magic-sysrq.conf
.W przeciwieństwie do innych odpowiedzi, sugeruję wyłączenie wymiany podczas wykonywania tej czynności. Podczas gdy zamiana utrzymuje system w przewidywalny sposób i jest często używana do zwiększenia przepustowości aplikacji uzyskujących dostęp do dysku (poprzez eksmisję nieużywanych stron, aby zapewnić miejsce na pamięć podręczną dysku), w tym przypadku wygląda na to, że system jest spowolniony do poziomów bezużytecznych, ponieważ zbyt aktywnie wykorzystywana pamięć jest zmuszana do eksmisji.
Zalecałbym całkowite wyłączenie wymiany podczas wykonywania tego zadania, aby zabójca braku pamięci zadziałał, gdy tylko pamięć RAM się zapełni.
Alternatywne rozwiązania:
zswap
w jądrze. Spowoduje to kompresowanie stron przed wysłaniem ich do zamiany, co może zapewnić wystarczającą ilość miejsca na poruszanie się, aby przyspieszyć maszynę. Z drugiej strony może to po prostu stanowić przeszkodę przy dodatkowej kompresji / dekompresji.tcc
) Kosztem niewielkiego spadku wydajności w czasie wykonywania skompilowanego produktu. (Jest to zazwyczaj dopuszczalne, jeśli robisz to w celach programistycznych / debugowania).źródło
sudo swapoff -a
może cię uratować, gdy jesteś już w powiązaniu: natychmiast przerwie to dodatkowe wykorzystanie przestrzeni wymiany, tj. Zabójca OOM powinien zostać wywołany w następnej chwili i przywrócić maszynę do stanu gotowości.sudo swapoff -a
jest również doskonałym środkiem ostrożności podczas debugowania wycieków pamięci lub kompilacji, powiedzmy, firefox. Zwykle zamiana jest nieco przydatna (np. Do hibernacji lub zamiany naprawdę niepotrzebnych rzeczy), ale kiedy faktycznie używasz pamięci, zawieszanie się jest gorsze.Możesz użyć następującego polecenia (w razie potrzeby wielokrotnie), aby zabić proces przy użyciu największej ilości pamięci RAM w systemie:
Z:
ps -eo pid --no-headers --sort=-%mem
: wyświetla identyfikatory wszystkich uruchomionych procesów posortowane według zużycia pamięcihead -1
: zachowaj tylko pierwszą linię (proces z największą ilością pamięci)xargs kill -9
: zabić procesEdytuj po dokładnym komentarzu Dmitry'ego:
Jest to szybkie i brudne rozwiązanie, które należy wykonać, gdy nie są uruchomione wrażliwe zadania (zadania, których nie chcesz
kill -9
).źródło
Przed uruchomieniem poleceń zużywających zasoby można również użyć wywołania systemowego setrlimit (2) , prawdopodobnie z
ulimit
wbudowaną powłoką bash (lublimit
wbudowanym w Zsh), szczególnie z-v
forRLIMIT_AS
. Wtedy zbyt duże zużycie wirtualnej przestrzeni adresowej (np. Z mmap (2) lub sbrk (2) używanym przez malloc (3) ) zakończy się niepowodzeniem (przy czym errno (3) jestENOMEM
).Wtedy one (tj. Głodne procesy w twojej powłoce, po wpisaniu
ulimit
) zostaną zakończone przed zamrożeniem twojego systemu.Przeczytaj także Linux Ate My RAM i rozważ wyłączenie nadmiernej ilości pamięci (uruchamiając komendę
echo 0 > /proc/sys/vm/overcommit_memory
jako root, zobacz proc (5) ...).źródło
W takim przypadku coś takiego jak „killall -9 make” (lub cokolwiek, czego używasz do zarządzania kompilacją, jeśli nie make). Zapobiegnie to dalszemu kompilowaniu, ZATRZYMUJE wszystkie uruchomione z niego procesy kompilatora (mam nadzieję, że również je zatrzymają) i jako bonus nie potrzebuje sudo, zakładając, że kompilujesz jako ten sam użytkownik, którego jesteś zalogowany. w as. A ponieważ zabija rzeczywistą przyczynę problemu zamiast przeglądarki internetowej, sesji X lub jakiegoś procesu losowo, nie będzie zakłócać tego, co robiłeś w tym czasie w systemie.
źródło
Stwórz więcej swapów dla siebie.
Następujące doda 8G swapu:
Nadal będzie wolno (wymieniasz), ale tak naprawdę nie powinieneś kończyć. Nowoczesne wersje systemu Linux mogą zamieniać się na pliki. Jedynym obecnie zastosowaniem partycji wymiany jest hibernacja laptopa.
źródło
fallocate -l 8G /root/moreswap
zamiastdd
unikać 8 GB operacji we / wy, gdy system jest wstrząsający. Nie działa to jednak z żadnym innym systemem plików. Zdecydowanie nie XFS, gdzie swapon widzi niepisane zakresy jako dziury. ( Wydaje mi się, że dyskusja na liście mailingowej xfs się nie potoczyła). Zobacz takżeswapd
demon, który tworzy / usuwa pliki wymiany w locie, aby zaoszczędzić miejsce na dysku. Również askubuntu.com/questions/905668/…xul.dll
) ma około 50 MB, więc jest około 10 razy cięższy niż jądro Linuksa.Jednym ze sposobów na uzyskanie części wolnej pamięci RAM w krótkim czasie jest użycie zram , który tworzy skompresowany dysk RAM i zamienia tam. Z każdym pół przyzwoitym procesorem jest to znacznie szybsze niż zwykła zamiana, a wskaźniki kompresji są dość wysokie w przypadku wielu współczesnych pamięci RAM, takich jak przeglądarki internetowe.
Zakładając, że masz zram zainstalowany i skonfigurowany, wszystko co musisz zrobić, to uruchomić
źródło
sudo swapoff -a
wyłączy swap, dzięki czemu jądro automatycznie zabije proces z najwyższym wynikiem, jeśli w systemie zabraknie pamięci. Używam tego, jeśli wiem, że będę miał coś z pamięcią RAM, którą wolałbym zabić, jeśli wymknie się spod kontroli, niż pozwolić, aby zmienił się i utknął na zawsze. Użyj,sudo swapon -a
aby ponownie włączyć go później.Później możesz rzucić okiem na ustawienia wymiany. Wygląda na to, że twoja zamiana znajduje się na tym samym dysku, co partycja root, co spowolniłoby twój system po uruchomieniu swap, więc unikaj tego, jeśli możesz. Ponadto, moim zdaniem, nowoczesne systemy często konfigurowane są ze zbyt dużą wymianą. 32GiB RAM zwykle oznacza, że zamiana 32GiB jest przydzielana domyślnie, tak jakbyś naprawdę chciał umieścić 32GiB w swoim obszarze wymiany.
źródło
Inną rzeczą, którą można zrobić, to zwolnić pamięć podręczną strony pamięci za pomocą tego polecenia:
Z dokumentacji kernel.org (wyróżnienie dodane):
źródło
/proc/sys/vm/swappiness
. Przy swappiness ustawionym na 0 masz rację. Przy ustawieniu domyślnym 60 jesteś blisko. Przy ustawieniu na 200 będą to jednak ostatnio używane strony działających procesów, które zostaną upuszczone jako pierwsze ... w tym konkretnym przypadku to polecenie może być przydatne. Jednak ustawienie swapiness na 0 (lub jakąś niską wartość, może 20 lub 30) byłoby lepszym podejściem ogólnym.kswapd
błędem (niektórzy nawet stworzyli z nim cronjobs). Ale masz rację, wątpię, że to pomoże w tym pytaniu.Powiedziałeś „kompilowanie w tle”. Co robisz na pierwszym planie? Jeśli programujesz w środowisku Eclipse lub innym zasobnym środowisku IDE, sprawdź, czy wszystko jest poprawnie zakończone w konsoli.
Środowiska programistyczne często pozwalają na uruchamianie wielu procesów w fazie rozwoju, mogą one również zawieszać się, gdy nie będziesz już nimi zainteresowany (w debuggerze lub po prostu nieprawidłowo ukończony). Jeśli deweloper nie zwraca uwagi, w ciągu dnia mogą gromadzić się dziesiątki zapomnianych procesów, wykorzystując jednocześnie wiele gigabajtów.
Sprawdź, czy wszystko, co powinno zostać zakończone w IDE, zostało zakończone.
źródło