Wiem, że mogę usunąć wszystko z pamięci podręcznej systemu plików Linux , ale czy istnieje sposób na usunięcie tylko jednego określonego pliku? Lub zapobiec buforowaniu pliku? Lub powiedzieć procesowi, aby nie buforował żadnych zapisywanych plików?
Mam proces, który odczytuje wiele małych plików i zapisuje duży plik. Chcę przechowywać małe pliki w pamięci podręcznej, aby uniknąć przeszukiwania dysku, i nie dbam o buforowanie dużego pliku.
linux
files
filesystems
cache
Jay Hacker
źródło
źródło
Odpowiedzi:
Potencjalna metoda nr 1 - F_DROP_CACHES
Znalazłem metodę z 2012 roku, która omawia proponowaną poprawkę do jądra Linuksa w tym wątku pocztowym zatytułowaną: Re: [Poprawka RFC] fs: zaimplementuj pamięci podręczne dla poszczególnych plików .
fragmentWątek zawiera zarówno walizkę testową, jak i aktualną poprawkę do kilku plików w jądrze Linuksa, co dodaje dodatkową funkcję do
fs/drop_caches.c
wywołanejdrop_pagecache_file(struct file *filp)
. Ta funkcja jest następnie dostępna za pomocą narzędzia interfejsu użytkownika,fnctl.c
za pomocą poleceniaF_DROP_CACHES
. Ten przypadek wywołuje tę funkcję:Który obsługuje usuwanie wszystkich pamięci podręcznych powiązanych z danym plikiem. Z pliku
Więc można to wykorzystać?include/linux/mm.h
:Nie znalazłem żadnych dowodów na to, że łatka ta kiedykolwiek trafiła do głównego repozytorium kodu jądra systemu Linux, więc ta opcja wydaje się być dostępna, tylko jeśli sam zechcesz ponownie skompilować jądro systemu Linux.
Potencjalna metoda nr 2 - Korzystanie z dd
W tym samym wątku inny użytkownik wspomina o zupełnie innej metodologii, z której korzysta
Oto fragment tego e-maila Testuję todd
.Nie byłem w 100% pozytywny, jak to sprawdzić, ale wpadłem na następujące podejście.
zrób plik 100 MB
dostęp do pliku śledzenia za pomocą
fatrace
uruchom
top
, abyśmy mogli monitorować wykorzystanie pamięci, bez dodatkowych informacji.otwórz plik, zanotuj teraz ilość wolnej pamięci. Zanotuj
fatrace
pliksample.txt
.upuść plik z pamięci, zauważ teraz ilość wolnej pamięci. Zwróć uwagę na wynik
fatrace
.Przykład
W terminalu 1: W terminalu 2: W terminalu 3: Teraz otwórz pliksample.txt
i zanotuj ilość pamięci RAM. W terminalu 1. W terminalu 2: Zwróć uwagę na wynikfatrace
w terminalu 3: Teraz usuń plik z pamięci RAM w terminalu 4: Zwróć uwagę na wynikfatrace
w terminalu 2: Zwróć uwagę na pamięć RAM w terminalu 3:Wygląda więc na to, że wszystkie zużyte przez plik w pamięci RAM są zwolnione.
Potencjalna metoda # 3 - python-fadvise
Dzięki komentarzowi @frostchutz istnieje inne narzędzie, skrypt w języku Python, o nazwie,
Przykład[pyadvise][4]
który zapewnia znacznie prostszy interfejs niż powyższedd
metody. Ten skrypt korzysta z tego samegoposix_fadvise(2)
interfejsu.A jeśli powtórzymy powyższy test i użyjemy
pyadvise
zamiastdd
:Zauważyłem identyczny spadek zużycia pamięci RAM, jak poprzednio, kiedy korzystałem
dd
.źródło
dd
pracuje dla mnie. Skończyłem z chris-lamb.co.uk/projects/python-fadvise, co jest tym samym w bardziej oczywistym poleceniu.python-fadvise
jest o wiele łatwiejsze, dodałem przykład pokazującydd
.os.posix_fadvise()
teraz w standardowym libray Pythona.Rozszerzając odpowiedź @ geekozaura, możesz wymusić użycie
O_DIRECT
za pomocą LD_PRELOAD i programu tutaj: http://arighi.blogspot.com/2007/04/how-to-bypass-buffer-cache-in-linux.htmlTen kod wymusza
O_DIRECT
dla wszystkich plików. Jednak po prostu dodając trochę więcej logiki strncmp__do_wrap_open
możesz selektywnie zastosować O_DIRECT.Oświadczenie: Nie testowałem tego.
źródło
Możesz otwierać pojedyncze pliki z
O_DIRECT
flagą (patrzman 2 open
) - przeczytaj uważnie sekcję UWAGI tej strony podręcznika i zastanów się, czy też chcesz / potrzebujeszO_SYNC
.źródło
cat
i wolałbym go nie przepisywać. :) Miałem nadzieję na narzędzie wiersza polecenia lub/proc/sys
pokrętło.open
flagą; naprawdę musisz napisać program, aby to zrobić. (cat -u
wyłącza tylkostdio
buforowanie, a nie buforowanie systemu operacyjnego).Jeśli chcesz zmusić plik do używania zawsze O_SYNC, możesz oznaczyć go jako taki w atrybutach rozszerzonych za pomocą
chattr +S $file
:człowiek chattr:
O_SYNC wymusza zapis danych + metadanych w buforach dyskowych, ale nadal przechodzi przez pamięć podręczną strony. O_DIRECT omija pamięć podręczną strony.
Ale pamiętaj, że otwarcie go za pomocą O_DIRECT byłoby szkodliwe dla wydajności, jeśli duży plik, który jest tylko dołączany, różnica może być niewielka. Ale jeśli duży plik zostanie przepisany w przypadkowych miejscach, O_DIRECT będzie bardzo dużym spadkiem wydajności, nawet biorąc pod uwagę, że posiadanie go w pamięci podręcznej może eksmitować z pamięci podręcznej niektóre małe odczytane pliki.
Jeśli masz ram, aby zatrzymać wszystkie małe pliki, możesz podejść do problemu w drugą stronę. Upewnij się, że małe pliki są zawsze w pamięci RAM, a następnie sugeruję skopiowanie ich do tmpfs :
źródło
chattr +S
to nie to samo, coO_DIRECT
toO_SYNC
.O_DIRECT
powoduje, że odczyty nie są buforowane (o to chodzi w tym pytaniu) i zapisuje, że nie jest buforowane bez żadnej gwarancji.O_SYNC
powoduje, że tylko zapisy nie są buforowane.O_DIRECT
naO_SYNC
sprawiłaby, że Twoja odpowiedź byłaby wewnętrznie spójna, ale nadal błędna, biorąc pod uwagę pytanie.