Na naszych serwerach mamy zwyczaj upuszczania skrytek o północy.
sync; echo 3 > /proc/sys/vm/drop_caches
Kiedy uruchamiam kod, wydaje się, że zwalnia dużo pamięci RAM, ale czy naprawdę muszę to zrobić. Czy wolna pamięć RAM nie jest marnotrawstwem?
Odpowiedzi:
Masz 100% racji. To nie to dobra praktyka, aby zwolnić pamięć RAM. Jest to prawdopodobnie przykład administracji systemem kultu.
źródło
Tak, wyczyszczenie pamięci podręcznej zwolni pamięć RAM, ale powoduje, że jądro szuka plików na dysku zamiast w pamięci podręcznej, co może powodować problemy z wydajnością.
Zwykle jądro wyczyści pamięć podręczną, gdy dostępna pamięć RAM zostanie wyczerpana. Często zapisuje zabrudzoną zawartość na dysku przy pomocy pdflush.
źródło
Powodem upuszczenia takich pamięci podręcznych jest testowanie wydajności dysku i jest to jedyny powód, dla którego istnieje.
Podczas przeprowadzania testu porównawczego intensywnego we / wy chcesz mieć pewność, że różne ustawienia, które próbujesz, faktycznie wykonują operacje we / wy na dysku, więc Linux pozwala na upuszczenie pamięci podręcznej zamiast pełnego restartu.
Cytat z dokumentacji :
źródło
Podstawowa idea tutaj prawdopodobnie nie jest taka zła (po prostu bardzo naiwna i wprowadzająca w błąd): mogą być buforowane pliki, do których uzyskanie dostępu w najbliższej przyszłości jest mało prawdopodobne, na przykład pliki logów. Te „zjadają” barana, które później będą musiały zostać uwolnione w razie potrzeby przez system operacyjny w taki czy inny sposób.
W zależności od ustawień swapiness, schematu dostępu do pliku, schematu alokacji pamięci i wielu innych nieprzewidywalnych rzeczy, może się zdarzyć, że gdy nie zwolnisz tych buforów, będą one później zmuszone do ponownego użycia, co zajmuje trochę więcej czasu niż przydzielanie pamięci z puli nieużywanej pamięci. W najgorszym przypadku ustawienia zamiany linuksa spowodują zamianę pamięci programu, ponieważ Linux uważa, że pliki te mogą być używane w najbliższej przyszłości niż pamięć programu.
W moim środowisku Linux często zgaduje, a na początku większości giełd w Europie (około 0900 czasu lokalnego) serwery zaczną robić to, co robią tylko raz dziennie, potrzebując wymiany pamięci, która wcześniej została zamieniona, ponieważ pisanie logi, kompresowanie ich, kopiowanie itp. zapełniało pamięć podręczną do tego stopnia, że trzeba było wymieniać rzeczy.
Ale czy upuszczenie pamięci podręcznej rozwiązuje ten problem? zdecydowanie nie. Rozwiązaniem byłoby powiedzenie linuxowi tego, czego nie wie: że te pliki prawdopodobnie nie będą już używane. Można to zrobić za pomocą aplikacji do pisania, używając rzeczy takich jak
posix_fadvise()
lub używając narzędzia linii cmd, takiego jakvmtouch
(które może być również używane do przeglądania rzeczy, a także plików pamięci podręcznej).W ten sposób możesz usunąć niepotrzebne dane z pamięci podręcznych i zachować rzeczy, które powinny być buforowane, ponieważ po upuszczeniu wszystkich pamięci podręcznych wiele rzeczy musi zostać ponownie odczytanych z dysku. I to w najgorszym możliwym momencie: kiedy jest potrzebny; powodując zauważalne i często niedopuszczalne opóźnienia w aplikacji.
To, co powinieneś mieć na miejscu, to system, który monitoruje wzorce wykorzystania pamięci (np. Jeśli coś się zmienia), a następnie odpowiednio analizuje i odpowiednio działa. Rozwiązaniem może być eksmisja niektórych dużych plików na koniec dnia za pomocą vtouch; może być również dodawanie większej ilości pamięci RAM, ponieważ dzienne szczytowe użycie serwera jest właśnie takie.
źródło
cat /dev/null > path/nohup.out
co 15 minut, ponieważ nohup.out szybko rośnie. Może linuxnohup
, przekieruj je na adres/dev/null
. Wygląda na to, że w twoim systemie pracowali kiedyś niedoświadczeni administratorzy. Zobacz stackoverflow.com/questions/10408816/ ... jak przekierowaćnohup
wyjście do/dev/null
Widziałem zrzuty pamięci, które są przydatne podczas uruchamiania kilku maszyn wirtualnych. Lub cokolwiek innego, co korzysta z dużych stron, takich jak niektóre serwery baz danych.
Duże strony w systemie Linux często muszą defragmentować pamięć RAM, aby znaleźć 2 MB ciągłej fizycznej pamięci RAM do umieszczenia na stronie. Uwolnienie całej pamięci podręcznej plików czyni ten proces bardzo łatwym.
Ale zgadzam się z większością innych odpowiedzi, ponieważ nie ma generalnie dobrego powodu, aby co wieczór upuszczać pamięć podręczną plików.
źródło
sysctl -w vm.nr_hugepages=...
) odmawia nawet pracy, chyba że najpierw upuszczę pamięć podręczną (Arch Linux).Możliwe, że wprowadzono to jako sposób na ustabilizowanie systemu, gdy nie było nikogo z umiejętnościami lub doświadczeniem, aby faktycznie znaleźć problem.
Uwalnianie zasobów
Porzucenie pamięci podręcznej zasadniczo zwolni niektóre zasoby, ale ma to efekt uboczny, ponieważ system faktycznie ciężej pracuje, aby wykonać to, co próbuje. Jeśli system zamienia (próbuje czytać i zapisywać z partycji wymiany dysku szybciej, niż jest w rzeczywistości zdolny), to okresowe upuszczanie pamięci podręcznych może złagodzić symptomy , ale nic nie leczy przyczyny .
Co pochłania pamięć?
Powinieneś ustalić, co powoduje duże zużycie pamięci, które sprawia, że upuszczanie pamięci podręcznej wydaje się działać. Może to być spowodowane dowolną liczbą źle skonfigurowanych lub po prostu źle wykorzystanych procesów serwera. Na przykład na jednym serwerze byłem świadkiem maksymalnego wykorzystania pamięci, gdy witryna Magento osiągnęła określoną liczbę odwiedzających w ciągu 15 minut. Skończyło się to na tym, że Apache został skonfigurowany tak, aby umożliwić jednoczesne uruchamianie zbyt wielu procesów. Zbyt wiele procesów, użycie dużej ilości pamięci (Magento jest czasem bestią) = zamiana.
Dolna linia
Nie zakładaj tylko, że jest to konieczne. Bądź proaktywny, aby dowiedzieć się, dlaczego on jest, miej odwagę, aby go wyłączyć, jeśli inni sugerują, że jest źle, i obserwuj system - dowiedz się, jaki jest prawdziwy problem i napraw go.
źródło
Linux / m68k faktycznie ma błąd jądra, który powoduje, że kswapd zwariował i zjadł 100% procesora (50%, jeśli jest jakieś inne zadanie związane z procesorem, takie jak autobuilder pakietu binarnego Debiana - vulgo buildd - już działa), co może (większość czasu; nie zawsze) można złagodzić, uruchamiając to polecenie co kilka godzin.
To powiedziawszy… Twój serwer najprawdopodobniej nie jest systemem m68k (Atari, Amiga, Classic Macintosh, VME, Q40 / Q60, Sun3) ;-)
W tym przypadku osoba, która wstawiła się w wiersze, albo zastosowała się do niektórych wątpliwych lub w najlepszym razie przestarzałych rad, albo wpadła na pomysł, w jaki sposób pamięć RAM powinna być używana nieprawidłowo (współczesne myślenie rzeczywiście mówi „wolna pamięć RAM jest marnowana” i sugeruje buforowanie) lub „odkrył”, że to „naprawia” [sic!] inny problem w innym miejscu (i był zbyt leniwy, aby szukać właściwej poprawki).
źródło
Jednym z powodów może być to, że witryna prowadzi pewien rodzaj monitorowania, który sprawdza ilość wolnego ram i wysyła ostrzeżenie do administratorów, gdy wolny ram spadnie poniżej określonego procentu. Jeśli to narzędzie do monitorowania jest wystarczająco głupie, aby nie uwzględniać pamięci podręcznej w obliczeniach wolnej pamięci RAM, może wysyłać fałszywe ostrzeżenia; regularne opróżnianie pamięci podręcznej może pomijać te ostrzeżenia, jednocześnie pozwalając narzędziu na wykrycie, kiedy „prawdziwy” RAM obniży się.
Oczywiście w takiej sytuacji prawdziwym rozwiązaniem jest zmodyfikowanie narzędzia do monitorowania w celu uwzględnienia pamięci podręcznej w obliczeniach wolnej pamięci RAM; czyszczenie pamięci podręcznej to tylko obejście, a także złe, ponieważ pamięć podręczna szybko się zapełni, gdy procesy będą miały dostęp do dysku.
Więc nawet jeśli moje założenie jest prawdziwe, czyszczenie pamięci podręcznej nie ma sensu, jest raczej obejściem przez kogoś, kto nie jest wystarczająco kompetentny, aby naprawić główny problem.
źródło
Mogę wymyślić jeden prawdopodobny powód, aby to zrobić podczas nocnej pracy crona.
W dużym systemie przydatne może być okresowe upuszczanie pamięci podręcznej, aby można było usunąć fragmentację pamięci.
Obsługa przezroczystej strony hukowej jądra dokonuje okresowego przeszukiwania pamięci w celu scalenia małych stron w strony hug. W zdegenerowanych warunkach może to spowodować pauzę systemową trwającą minutę lub dwie (moje doświadczenie z tym było w RHEL6; mam nadzieję, że zostało poprawione). Upuszczenie pamięci podręcznej może pozwolić zamiataczowi stron internetowych na trochę miejsca do pracy.
Możesz argumentować, że jest to dobry powód do wyłączenia przezroczystych stronicowania; OTOH, możesz uważać, że ogólna poprawa wydajności dzięki przezroczystym stronom jest warta i warta zapłaty za utratę pamięci podręcznej raz dziennie.
Zastanawiałem się nad innym powodem, dla którego chciałbyś to zrobić, chociaż nie w pracy z cronem. Byłby to bardzo dobry moment, zanim system wirtualizacji przeprowadzi migrację maszyny wirtualnej na nowy sprzęt. Mniej zawartości pamięci do skopiowania na nowy host. Oczywiście w końcu będziesz musiał czytać z magazynu, ale prawdopodobnie skorzystam z tego kompromisu.
Nie wiem, czy którekolwiek oprogramowanie virt to robi.
źródło
Wystarczy dodać dwa centy: system bardzo dobrze wie, że te strony pamięci są buforami i spadną tyle, ile będzie potrzebne, gdy aplikacja poprosi o pamięć.
Odpowiednim ustawieniem jest to
/proc/sys/vm/swappiness
, które informuje jądro podczas nowego przydzielania pamięci, aby wolała upuszczać pamięć podręczną lub zamieniać „bezczynne” strony przydzielonej pamięci.źródło
Pytanie pochodzi z 2014 roku, ale ponieważ problem istnieje do dziś w niektórych ukrytych backendach centos 6.8, może być nadal przydatny dla kogoś.
https://github.com/zfsonlinux/zfs/issues/1548 opisuje problem z ZFS. Tam miejsce na dysku nie jest zwalniane dla usuniętych plików, ponieważ jeśli nfs jest używany na szczycie zfs, i-węzły pliku nie są usuwane z pamięci podręcznej i-węzłów jądra.
Aby cytować z wątku błędu, behlendorf, 6 stycznia 2015 napisał:
tzn. nocne echo 3> / proc / sys / vm / drop_caches jest najłatwiejszym rozwiązaniem tego błędu, jeśli nie chcesz mieć przestoju na restrukturyzację ZFS.
Może więc nie administrowanie kultowym ładunkiem, ale powodem było całkiem dobre debugowanie.
źródło
Może to mieć sens w systemach NUMA (nierównomierny dostęp do pamięci), w których zazwyczaj każdy procesor (gniazdo) może uzyskać dostęp do całej pamięci w sposób transparentny, ale dostęp do własnej pamięci jest szybszy niż w przypadku pamięci innego gniazda, w połączeniu z równoległymi aplikacjami HPC.
Wiele prostych aplikacji równoległych wykonuje operacje we / wy pliku z jednego procesu, pozostawiając przy wyjściu dużą część pamięci w jednym węźle NUMA przydzielonym do pamięci podręcznej dysku, podczas gdy w drugim węźle NUMA pamięć może być w większości wolna. W takich sytuacjach, ponieważ proces odzyskiwania pamięci podręcznej w jądrze Linuksa, o ile wiem, nadal nie obsługuje NUMA, procesy działające w węźle NUMA, który ma pamięć przydzieloną do pamięci podręcznej, są zmuszone do przydzielenia pamięci w innym węźle NUMA, pod warunkiem, że w drugim węźle jest wolna pamięć RAM, co zabija występy.
Jednak w systemie HPC rozsądniej byłoby wyczyścić pamięć podręczną przed rozpoczęciem nowego zadania użytkownika, a nie w określonym czasie z cronem.
W przypadku aplikacji nierównoległych problem ten prawdopodobnie nie wystąpi.
źródło
Kiedy pamięć podręczna strony jest dość duża (dużo większa niż obecne użycie wymiany), a zamiana i zamiana odbywa się na zmianę, wtedy musisz upuścić pamięć podręczną. Widziałem przypadki, w których zużycie pamięci wzrasta na jednym z moich serwerów bazy danych MariaDB z systemem Ubuntu 16.04LTS, a Linux po prostu postanowił zwiększyć użycie wymiany zamiast usuwać nieużywane pamięci podręczne stron. Przezroczyste strony próbne są już wyłączone w moim systemie, ponieważ TokuDB wymagało wyłączenia. W każdym razie może nie jest to błąd, ale linux nadal zachowując się tak, jest dla mnie dość zagadkowy. Różne źródła podają, że Linux usunie pamięć podręczną strony, gdy aplikacja zażąda:
Ale rzeczywistość nie jest taka prosta. Obejściem jest albo:
Przykład uruchomienia dd:
dd if=/var/log/apache2/access_log.1 iflag=nocache count=0
Przykładowy python-fadvise:
pyadvise -d /var/log/apache2/access_log.1
źródło
Mam komputer stacjonarny z 16 GB pamięci RAM działający na jądrze PAE. Po godzinie lub dwóch wydajność dysku dramatycznie spada, dopóki nie upuszczę pamięci podręcznej, więc po prostu wrzucę ją do crona. Nie wiem, czy jest to problem z jądrem PAE, czy też, że implementacja pamięci podręcznej działa tak wolno, jeśli jest dużo pamięci.
źródło