Ogranicz rozmiar bufora pamięci podręcznej w systemie Linux


25

Czy istnieje sposób, aby poinformować jądro Linuksa, aby używało tylko określonego procentu pamięci dla bufora pamięci podręcznej? Wiem, że /proc/sys/vm/drop_cachesmożna go użyć do tymczasowego wyczyszczenia pamięci podręcznej, ale czy jest jakieś stałe ustawienie, które zapobiega powiększeniu pamięci do ponad 50% pamięci głównej?

Powodem, dla którego chcę to zrobić, jest to, że mam serwer z systemem Ceph OSD, który stale obsługuje dane z dysku i w ciągu kilku godzin potrafi zużyć całą pamięć fizyczną jako bufor bufora. Jednocześnie muszę uruchomić aplikacje, które przydzielą dużą ilość (kilka 10 GB) pamięci fizycznej. Wbrew powszechnemu przekonaniu (patrz rada na prawie wszystkie pytania dotyczące bufora pamięci podręcznej), automatyczne zwolnienie pamięci przez usunięcie czystych wpisów pamięci podręcznej nie jest natychmiastowe: uruchomienie mojej aplikacji może zająć nawet minutę, gdy pamięć podręczna bufora jest pełna ( *), a po wyczyszczeniu pamięci podręcznej (przy użyciu echo 3 > /proc/sys/vm/drop_caches) ta sama aplikacja uruchamia się niemal natychmiast.

(*) Podczas tej minuty uruchamiania aplikacja ma błąd w nowej pamięci, ale spędza 100% swojego czasu w jądrze, zgodnie z Vtune w funkcji o nazwie pageblock_pfn_to_page. Ta funkcja wydaje się być związana z zagęszczaniem pamięci potrzebnym do znalezienia ogromnych stron, co prowadzi mnie do wniosku, że problemem jest fragmentacja.


1
Istnieje coś takiego jak warstwowanie pamięci podręcznej. zestaw puli ceph osd {cachepool} hit_set_count 1 zestaw puli ceph osd {cachepool} hit_set_period 3600 zestaw puli ceph osd {cachepool} target_max_bytes 1000000000000 patrz przykład. docs.ceph.com/docs/master/rados/operations/cache-tiering
Michael D.

2
Ponieważ ten problem najwyraźniej wpływa tylko na uruchamianie aplikacji intensywnie korzystających z pamięci, być może możesz uruchomić aplikacje za pomocą skryptu, który wyczyści pamięć podręczną przed ich uruchomieniem. Może to uruchamia je szybciej, pozostawiając zarządzanie pamięcią podręczną w jądrze podczas ich działania.
Odwilż

Odpowiedzi:


14

Jeśli nie chcesz bezwzględnego limitu, ale po prostu naciskasz na jądro, aby szybciej wypłukiwało bufory, powinieneś spojrzeć vm.vfs_cache_pressure

Ta zmienna kontroluje tendencję jądra do odzyskiwania pamięci, która jest używana do buforowania pamięci podręcznej VFS, w przeciwieństwie do pagecache i swap. Zwiększenie tej wartości zwiększa szybkość odzyskiwania pamięci podręcznej VFS.

Zakres od 0 do 200. Przesuń go w kierunku 200, aby zwiększyć ciśnienie. Domyślna wartość to 100. Możesz również przeanalizować zużycie pamięci za pomocą slabtoppolecenia. W twoim przypadku wartości dentryi *_inode_cachemuszą być wysokie.

Jeśli chcesz mieć absolutny limit, powinieneś spojrzeć w górę cgroups. Umieść serwer Ceph OSD w grupie i ogranicz maksymalną pamięć, której może użyć, ustawiając memory.limit_in_bytesparametr dla grupy.

memory.memsw.limit_in_bytesustawia maksymalną sumę użycia pamięci i wymiany. Jeśli nie określono żadnych jednostek, wartość jest interpretowana jako bajty. Można jednak używać sufiksów do reprezentowania większych jednostek - k lub K dla kilobajtów, m lub M dla megabajtów oraz g lub G dla gigabajtów.

Referencje:

[1] - Strojenie jądra Linux GlusterFS

[2] - Przewodnik zarządzania zasobami RHEL 6


1
Grupa z limit_in_byteszestawem wydaje się to robić. Dzięki!
Wim,

4
Myślę, że vfs_cache_pressureczyści tylko pamięć podręczną dentysty i i-węzła i nie ma nic wspólnego z pamięcią podręczną bufora.
kawing-chiu

Zwiększenie vfs_cache_pressurepowyższej wartości 100może pomóc w przypadku braku wystarczającej ilości pamięci RAM do obciążenia. Zmniejszy to użycie pamięci RAM, ale ogólnie pogorszy wydajność we / wy.
Mikko Rantalainen,

3

Nie wiem o A%, ale możesz ustawić limit czasu, aby spadał po x ilości minut.

Najpierw w terminalu

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Aby wyczyścić bieżące pamięci podręczne.

Zrób to a cron-job Naciśnij Alt-F2, wpisz gksudo gedit /etc/crontab, a następnie Dodaj ten wiersz u dołu.

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

Sprząta co 15 minut. Możesz ustawić na 1 lub 5 minut, jeśli naprawdę chcesz, zmieniając pierwszy parametr na * lub * / 5 zamiast * / 15

Aby zobaczyć swoją wolną pamięć RAM, z wyjątkiem pamięci podręcznej:

free -m | sed -n -e '3p' | grep -Po "\d+$

Czuję się tutaj trochę redundancji. O ile mi wiadomo, 3 > drop_cachesobejmuje zachowaniesync
andras.tim

1
@ andras.tim no - sync zapisuje brudne strony na dysk, 3 do drop_caches tylko odzyskuje / zwalnia pamięć używaną przez czyste strony i inne pamięci podręczne. nie musisz uruchamiać synchronizacji, ale jeśli to zrobisz, więcej pamięci zostanie wyczyszczonych zamiast zabrudzonych, a więcej pamięci zostanie zwolnionych po upuszczeniu pamięci podręcznej
Daniel S. Sterling,

2

Myślę, że twoje przeczucie na samym końcu pytania jest na dobrej drodze. Podejrzewam, że albo A, NUMA świadczy przydział pamięci migrujące strony między procesorami, albo B, co bardziej prawdopodobne, kod defragmentacji przezroczystych stron próbujących znaleźć ciągłe, wyrównane regiony.

Zidentyfikowano częściowe i przezroczyste częściowe zarówno dla znacznej poprawy wydajności w przypadku niektórych obciążeń, jak i odpowiedzialne za pochłanianie ogromnej ilości czasu procesora bez znacznych korzyści.

Pomoże to dowiedzieć się, które jądro używasz, zawartość / proc / meminfo (lub przynajmniej wartości HugePages_ *.) I, jeśli to możliwe, więcej kalendarza kalendarza vtune odnoszącego się do pageblock_pfn_to_page ().

Ponadto, jeśli pozwolę sobie zgadnąć, spróbuj wyłączyć defragmentację strony przy użyciu:

echo „never”> / sys / kernel / mm / transparent_hugepage / defrag

(może być to zamiast tego, w zależności od twojego jądra :)

echo „never”> / sys / kernel / mm / redhat_transparent_hugepage / defrag

Wreszcie, czy ta aplikacja używa wielu dziesiątek koncertów pamięci RAM, co napisałeś? Jaki język?

Ponieważ użyłeś terminu „błąd na stronach pamięci”, domyślam się, że znasz się na projektowaniu i pamięci wirtualnej. Z trudem wyobrażam sobie sytuację / aplikację, która byłaby tak agresywna w działaniu, że nie odczytuje wielu wejść / wyjść - prawie zawsze z bufora bufora, który próbujesz ograniczyć.

(Jeśli jesteś ciekawy, sprawdź flagi mmap (2), takie jak MAP_ANONYMOUS i MAP_POPULATE i mincore (2), których można użyć, aby sprawdzić, które strony wirtualne faktycznie mają zmapowaną stronę fizyczną.)

Powodzenia!


2

Jeśli Ceph OSD jest jednym oddzielnym procesem, możesz użyć cgroups do kontrolowania zasobów wykorzystywanych przez proces:

Utwórz grupę o nazwie jak grupa 1 z limitem pamięci (50 GB, na przykład obsługiwane są inne limity, takie jak procesor, na przykład wspomniany jest również procesor):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Następnie, jeśli aplikacja jest już uruchomiona, przenieś ją do tej grupy:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

Lub uruchom aplikację w tej grupie:

cgexec -g memory,cpu:group1 your_app_name

0

tuned to dynamiczny adaptacyjny demon dostrajania systemu, który dynamicznie dostosowuje ustawienia systemowe w zależności od użycia.

 $ man tuned

Zobacz odpowiednią dokumentację i pliki konfiguracyjne.

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

Dodatkowe informacje

Polecenie synchronizacji opróżnia bufor, tzn. Wymusza zapisanie wszystkich niepisanych danych na dysku i może być użyte, gdy chcemy mieć pewność, że wszystko jest bezpiecznie zapisane. W tradycyjnych systemach UNIX w tle działa program o nazwie aktualizacja, który synchronizuje się co 30 sekund, więc zwykle nie jest konieczne korzystanie z synchronizacji. Linux ma dodatkowego demona, bdflush , który częściej dokonuje niedoskonałej synchronizacji, aby uniknąć nagłego zawieszenia z powodu ciężkich operacji we / wy dysku, które czasami powoduje synchronizacja .

W Linuksie bdflush jest uruchamiany przez aktualizację. Zwykle nie ma powodu, aby się tym martwić, ale jeśli z jakiegoś powodu bdflush umrze, jądro ostrzeże o tym i powinieneś uruchomić go ręcznie ( / sbin / update ).


1
Czy to nie dotyczy tylko brudnych wpisów? Nie sądzę, że to jest problem w moim systemie, ponieważ wszystkie są czyste - opóźnienie nie polega na zapisywaniu brudnych stron, ale na defragmentacji miejsca pozostałego po usunięciu czystych.
Wim

Tak, dotyczy to brudnych stron, myślę, że można również rozwiązać inne problemy z wydajnością, ustawiając tryb na dynamiczny.
Ijaz Ahmad Khan

„Od Linuksa 2.6 wywołanie systemowe [bdflush] jest przestarzałe i nic nie robi. Prawdopodobnie całkowicie zniknie w przyszłej wersji jądra. Obecnie zadanie wykonywane przez bdflush () jest obsługiwane przez wątek pdflush jądra.” man7.org/linux/man-pages/man2/bdflush.2.html
sourcejedi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.