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_caches
moż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.
źródło
Odpowiedzi:
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
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ą
slabtop
polecenia. W twoim przypadku wartościdentry
i*_inode_cache
muszą 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ącmemory.limit_in_bytes
parametr dla grupy.Referencje:
[1] - Strojenie jądra Linux GlusterFS
[2] - Przewodnik zarządzania zasobami RHEL 6
źródło
limit_in_bytes
zestawem wydaje się to robić. Dzięki!vfs_cache_pressure
czyści tylko pamięć podręczną dentysty i i-węzła i nie ma nic wspólnego z pamięcią podręczną bufora.vfs_cache_pressure
powyższej wartości100
moż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.Nie wiem o A%, ale możesz ustawić limit czasu, aby spadał po x ilości minut.
Najpierw w terminalu
Aby wyczyścić bieżące pamięci podręczne.
Zrób to a
cron-job
Naciśnij Alt-F2, wpiszgksudo gedit /etc/crontab
, a następnie Dodaj ten wiersz u dołu.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:
źródło
3 > drop_caches
obejmuje zachowaniesync
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:
(może być to zamiast tego, w zależności od twojego jądra :)
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!
źródło
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):
Następnie, jeśli aplikacja jest już uruchomiona, przenieś ją do tej grupy:
Lub uruchom aplikację w tej grupie:
źródło
tuned to dynamiczny adaptacyjny demon dostrajania systemu, który dynamicznie dostosowuje ustawienia systemowe w zależności od użycia.
Zobacz odpowiednią dokumentację i pliki konfiguracyjne.
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 ).
źródło