Czy pliki krótkotrwałe są opróżniane na dysk?

9

Mój program tworzy wiele małych, krótkotrwałych plików. Zazwyczaj są one usuwane w ciągu sekundy po utworzeniu. Pliki znajdują się w systemie plików ext4 wspieranym przez prawdziwy dysk twardy. Wiem, że Linux okresowo opróżnia ( pdflush) brudne strony na dysk. Ponieważ moje pliki są krótkotrwałe, najprawdopodobniej nie są one buforowane pdflush. Moje pytanie brzmi: czy mój program powoduje wiele zapisów na dysku? Moje obawy dotyczą życia mojego dysku twardego.

Ponieważ pliki są małe, załóżmy, że suma ich wielkości jest mniejsza niż dirty_bytesi dirty_background_bytes.

Ext4 ma włączony domyślny dziennik, tj. Dziennik metadanych. Chcę również wiedzieć, czy metadane lub dane są zapisywane na dysku.

Wu Yongzheng
źródło
> Mój program tworzy wiele małych, krótkotrwałych plików, ile to „dużo”? Czy usuwasz te pliki lub przepisujesz je? > Chcę również wiedzieć, czy metadane lub dane są zapisywane na dysku. Uważam, że domyślny tryb metadanych jest uporządkowany, co oznacza, że ​​metadane są zatwierdzane przed zapisaniem danych na dysku. Oczywiście istnieją opcje montowania, które możesz dodać, aby to zmienić. > Moje pytanie brzmi: czy mój program powoduje wiele zapisów na dysku? trudno jest odpowiedzieć na rozważenie podanych przez ciebie informacji. Czy za pomocą narzędzi takich jak iotop i sysstat na dysku Monitor IO?
AngryWombat
ReiserFS jest lepszy dla małych plików, jeśli naprawdę chcesz, aby trafiały na dysk kiedykolwiek tmpfs jest w porządku, jeśli nie przejmujesz się
xenoterracide
Kilka wyjaśnień: (1). system plików ext4 nie jest zamontowany z syncopcją. Możesz rozważyć zainstalowanie domyślnie fedory, debiana lub ubuntu. Ty wybierasz jeden. (2). Każdy plik ma około 60 KB. (3). Około 1000 plików jest tworzonych i usuwanych na sekundę, ale w danym momencie nie istnieje więcej niż 10 plików. Innymi słowy, przepustowość we / wy jest duża, ale zajmowana przestrzeń jest niewielka.
Wu Yongzheng,

Odpowiedzi:

5

Prosty eksperyment z użyciem ext4:

Utwórz obraz 100 MB ...

# dd if=/dev/zero of=image bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0533049 s, 2.0 GB/s

Zrób to z pętli ...

# losetup -f --show image
/dev/loop0

Utwórz system plików i zamontuj ...

# mkfs.ext4 /dev/loop0
# mount /dev/loop0 /mnt/tmp

Uruchom jakiś rodzaj plików z plikami krótkotrwałymi. (Zmień to na dowolną preferowaną metodę).

for ((x=0; x<1000; x++))
do
    (echo short-lived-content-$x > /mnt/tmp/short-lived-file-$x
     sleep 1
     rm /mnt/tmp/short-lived-file-$x ) &
done

Umount, synchronizacja, odpięcie.

# umount /mnt/tmp
# sync
# losetup -d /dev/loop0

Sprawdź zawartość obrazu.

# strings image | grep short-lived-file | tail -n 3
short-lived-file-266
short-lived-file-895
short-lived-file-909
# strings image | grep short-lived-content | tail -n 3

W moim przypadku wymieniono wszystkie nazwy plików, ale nie zawierała żadnej zawartości pliku. Więc tylko treść nie została napisana.

frostschutz
źródło
Niezła próba. Teraz jestem przekonany. Próbowałem także ext2 i uzyskałem taki sam wynik jak ty. Zmieniłem twoje równoległe obciążenie we / wy na sekwencyjne i dostałem jeden plik krótkotrwały 999 i 8 plików krótkotrwały- *. Czy ktoś ma jakieś wytłumaczenie?
Wu Yongzheng,
@msw: edytowane na wypadek, gdyby było niejasne. W przeciwnym razie prosimy o rozwinięcie.
frostschutz
To po prostu głupie. Pliki istnieją jednocześnie, nie było co nadpisywać, a systemy plików nie nadpisują usuniętej zawartości pliku, ponieważ mogłoby to obniżyć wydajność. Ale za wszelką cenę używaj nbdi rejestruj ruch (lub podobną metodę śledzenia wszystkich zapisów).
frostschutz
7

O ile nie mówimy o napędzie półprzewodnikowym, duża liczba zapisów na dysku nie będzie dominującym czynnikiem długowieczności dysku.

Jeśli naprawdę chcesz w ogóle uniknąć zapisu na dysku, zajrzyj do tmpfs ,

msw
źródło
2
tmpfs rzeczywiście pasuje w tym przypadku, ale nadal chcę wiedzieć, jako ogólne pytanie systemu operacyjnego, czy dane są zapisywane na dysk (niepotrzebnie)?
Wu Yongzheng,
Twoje pytanie musiałoby być o wiele bardziej szczegółowe, niż prawdopodobnie możesz sformułować, aby otrzymać ostateczną odpowiedź. Pamięć podręczna bufora pośredniczy w skomplikowanym kompromisie między wydajnością a trwałością, na który nie można odpowiedzieć w sposób abstrakcyjny. Korzystając z wymienionych narzędzi @AngryWombat, możesz zmierzyć rzeczywiste zapisy pod konkretną aplikacją, ale istnieje tak wiele czynników, które mogą różnić się w zależności od uruchomienia.
msw
Cóż, jeśli pdflush pojawi się po usunięciu pliku. Pisanie tego byłoby niepotrzebne.
Wu Yongzheng,
1

Zasadniczo nie, nie zostaną napisane. Wynika to z faktu, że pamięć podręczna opróżnia brudne strony, gdy spełniony jest jeden z dwóch warunków:

  1. Dane są przedawniane /proc/sys/vm/dirty_writeback_centisecs, co domyślnie wynosi 5 sekund.

  2. Jest za mało pamięci, aby pamięć podręczna mogła pomieścić dane, więcej niż dirty_ratiobrudne strony w pamięci podręcznej (domyślnie 20%).

Tak więc w systemie z dużą ilością wolnej pamięci i małym ruchem zapisu poza małymi plikami, które są usuwane w mniej niż 5 sekund, dane nie zostaną usunięte.

psusi
źródło
0

To, czy pliki krótkotrwałe zostaną zapisane na dysk, zależy nie tylko od domyślnego zachowania pamięci podręcznej plików jądra, ale także od szczegółów implementacji sterownika systemu plików i opcji montowania wspomnianego systemu plików. Możliwe jest skonfigurowanie systemu w taki sposób, aby wszystko zawsze było natychmiast zapisywane na dysk (w zasadzie zachowanie DOS).

Jednym z systemów plików, z wyraźnym zachowaniem, które Cię interesuje (tzw. „Opóźniony przydział”), jest XFS. Dzięki niemu możesz być mniej lub bardziej pewien (pod żadnym pozorem żadnych śmiesznych opcji konfiguracji), że bloki należące do właśnie usuniętych plików zostaną ponownie wykorzystane w pamięci bez pośredniego dostępu do dysku. XFS może nadal chcieć aktualizować swój dziennik metadanych (który będzie zapisywany dość często na dysku; jednak biorąc pod uwagę, że dziennik XFS to tylko metadane, jest wystarczająco mały, aby ustawić go na innym, szybkim urządzeniu, takim jak znaleziona pamięć RAM podtrzymywana bateryjnie na wielu kontrolerach RAID).

Z powodu tego zachowania nierzadko zdarza się, aby znaleźć całkowicie wyzerowane, ale poza tym prawnie wyglądające pliki (rozmiar i inne nienaruszone metadane) w systemie plików XFS po nagłej przerwie w zasilaniu. Taki jest koszt obsługi szybkich „pół-tymczasowych” operacji na plikach.

Trochę teorii

Zasadniczo wywołanie systemowe uzyskujące dostęp do systemu plików kończy się dość szybko w metodzie zdefiniowanej przez sterownik systemu plików (dołączonej do „struct inode_operations” i „struct file_operations” po zarejestrowaniu sterownika VFS). To, co dzieje się później, zależy wyłącznie od implementacji systemu plików. Zazwyczaj stosuje się coś podobnego do następującego podejścia (ten prosty przykład pochodzi ze sterownika FAT dla Linuksa):

if (IS_DIRSYNC(dir))
    (void)fat_sync_inode(dir);
else
    mark_inode_dirty(dir);

Jeśli system plików jest zamontowany w trybie „synchronizacji”, wszystkie zmiany są natychmiast przenoszone na dysk (w tym przypadku przez fat_sync_inode ()). W przeciwnym razie blok jest oznaczony jako „brudny” i pozostaje w pamięci podręcznej pamięci, dopóki nie zostanie opróżniony przy rozsądnej okazji.

Dlatego nie można przewidzieć zachowania systemu w odniesieniu do plików przejściowych bez uwzględnienia opcji montowania systemu plików i sprawdzenia kodu źródłowego jego implementacji (dotyczy to oczywiście wszystkich rodzajów egzotycznych systemów plików najczęściej znajdujących się w przestrzeni osadzonej) .

dąb
źródło
Dzięki za odpowiedź. Wygląda na to, że ext4 ma również opóźniony przydział. Czy to oznacza, że ​​moja odpowiedź brzmi NIE? (nie podano żadnych śmiesznych opcji konfiguracji w innym miejscu). Czy to również oznacza, że ​​moja odpowiedź brzmi TAK, jeśli używany jest ext2?
Wu Yongzheng,
Myślę, że nawet przy ext2 na nowoczesnym jądrze odpowiedź będzie NIE. Ten konkretny problem był często omawiany, a krótkie spojrzenie na źródło jądra pokazuje, że sterownik ext2 opiera się głównie na „domyślnych” operacjach jądra (dlatego wszystko jest opóźnione przez pamięć podręczną bloków). Przypuszczam, że powinienem zaktualizować swoją odpowiedź, aby zawierała dodatkowe informacje.
Oakad
Moje ext4 oczywiście nie jest montowane z syncopcją. Nigdy bym tego nie zrobił.
Wu Yongzheng,
Podczas oznaczania i-węzła jako brudnego zakładam, że system plików jest odpowiedzialny za oznaczenie odpowiedniej strony jako brudnej. Czy po usunięciu i-węzła system plików czyści brudną stronę? Jeśli nie, dane zostaną niepotrzebnie usunięte na dysk.
Wu Yongzheng,
2
Nieużywane bloki danych są „zwalniane”, przez co przestają się brudzić. Jeśli napisałeś jakieś rzeczy do pliku, a następnie obciąłeś je przed opróżnieniem, śmieci po EOF po prostu zniknęły (w pewnym sensie). W przypadku metadanych może to nie być takie proste, ponieważ mogą istnieć różne kompromisy dotyczące integralności struktur danych systemu plików. Nawiasem mówiąc, z twojego pytania nie wynika, że ​​zawsze oczekujesz pełnej kontroli nad swoją platformą - większość aplikacji zazwyczaj kończy się na komputerach o nieznanej konfiguracji, z dala od programisty.
Oakad