Czy pliki są zapisywane na dysku sekwencyjnie?

22

Jak zrozumiałem, „rzadki plik” oznacza, że ​​plik może mieć „luki”, więc rzeczywiste użyte dane mogą być mniejsze niż rozmiar pliku logicznego.

Jak systemy plików Linux zapisują pliki na dysku? Interesuje mnie głównie ext4. Ale:

  1. Czy plik nie może być zapisywany sekwencyjnie na dysku? Rozumiem przez to, że część pliku znajduje się pod adresem fizycznym X, a następna część pod adresem fizycznym Y, który nie jest zbliżony do przesunięcia X +).
  2. Czy mogę w jakiś sposób kontrolować sekwencję plików?
    Chcę przydzielić plik 10 GB. Chcę, aby była sekwencyjna na dysku i nie była podzielona między różne przesunięcia.
  3. Czy działa inaczej w różnych typach?
hudac
źródło
Możesz przeczytać ext4.wiki.kernel.org/index.php/Main_Page
roaima
1
Być może, jeśli dobrze rozumiem twoją intencję, byłbyś bardziej zainteresowany interfejsem API niższego poziomu, w którym pracujesz z urządzeniami pamięci masowej bez konieczności przechodzenia przez warstwę systemu plików. Punktem wejścia może być zatem dmsetupprogram, interfejs do urządzenia mapującego urządzenia. Może to być dobry wybór, jeśli planujesz magazyn podobny do bazy danych.
wvxvw
4
Jest to szczegół implementacji systemu plików. Prawie wszystkie systemy plików zrobić fragmentów plików domyślnie; tylko iso9660i romfsnie są w stanie tego zrobić i wymagają ciągłego przechowywania (z tych mogę wymienić osobno).
mirabilos
2
bez względu na to, czy plik jest ciągły na dysku, czy nie, odczyt / zapis danych zawsze będzie ciągły, chyba że przejdziesz do innej części pliku. Dlaczego więc się tym przejmujesz? Chyba że fragmentacja jest poważnym problemem, który wpływa na wydajność
phuclv
3
@ Hudac należy pamiętać o tym, że ciągły nie jest tak przydatny w praktyce. Prostym jest flash, w którym fragmentacja nie jest wielką sprawą, ale na obracającym się talerzu nadal możesz nie korzystać z ciągłych danych. Na obracającym się talerzu musisz pomyśleć o wzorcach dostępu i miejscu, w którym znajdują się dane. Jeśli potrzebujesz sektora, który właśnie przeszedł pod głową, musisz poczekać, aż ponownie się w pełni pojawi. Aby uzyskać najlepsze wyniki, należy przesunąć dane tak, aby były „zamknięte”, gdy trzeba je odczytać. Zwiększenie rozmiaru pamięci podręcznej jest łatwiejsze ;-)
Ukko

Odpowiedzi:

41

Czy plik nie może być zapisywany sekwencyjnie na dysku? Mam na myśli, że część pliku znajduje się pod fizycznym adresem X, a druga część pod fizycznym adresem Y, który nie jest zbliżony do przesunięcia X +).

Tak; jest to znane jako fragmentacja plików i nie jest rzadkie, szczególnie w przypadku większych plików. Większość systemów plików przydziela miejsce w miarę potrzeb, mniej więcej sekwencyjnie, ale nie mogą odgadnąć przyszłego zachowania - więc jeśli napiszesz 200 MB do pliku, a następnie dodasz kolejne 100 MB, istnieje niezerowa szansa, że ​​oba zestawy danych być przechowywane w różnych obszarach dysku (w zasadzie każdy inny zapis wymagający więcej miejsca na dysku, pojawiający się po pierwszym zapisie i przed drugim, może znajdować się między nimi). Jeśli system plików jest prawie pełny, sytuacja zwykle jest gorsza: może nie istnieć ciągły obszar wolnego miejsca wystarczająco duży, aby pomieścić nowy plik, więc będzie musiał zostać pofragmentowany.

Czy mogę w jakiś sposób kontrolować sekwencję plików? Chcę przydzielić duży plik 10 GB. Chcę, aby była sekwencyjna na dysku i nie była podzielona na różne przesunięcia.

Możesz powiedzieć systemowi plików o docelowym rozmiarze pliku podczas jego tworzenia; pomoże to systemowi plików optymalnie go przechowywać. Wiele współczesnych systemów plików wykorzystuje technikę zwaną opóźnioną alokacją, w której układ nowego pliku na dysku obliczany jest tak późno, jak to możliwe, aby zmaksymalizować informacje dostępne podczas wykonywania obliczeń. Możesz pomóc w tym procesie, korzystając z posix_fallocate(3)funkcji informującej system plików, ile miejsca na dysku powinno zostać w sumie przydzielone. Nowoczesne systemy plików będą próbowały wykonać tę alokację sekwencyjnie.

Czy działa inaczej w różnych typach?

Różne systemy plików zachowują się inaczej, tak. Systemy plików oparte na logach, takie jak NILFS2, nie przydzielają pamięci w taki sam sposób, jak systemy plików oparte na rozciągłości, takie jak Ext4, a to tylko jeden przykład zmiany.

Stephen Kitt
źródło
1
Czy użycie fallocate(3)zapewni sekwencję plików? czy po prostu podpowie system plików? Nie mogę tego w pełni zrozumieć na stronach podręcznika użytkownika.
hudac
6
Nie może zapewnić sekwencyjnego przydzielania, to tylko wskazówka. Ale zdecydowanie powinieneś go użyć, jeśli piszesz pliki 10GiB!
Stephen Kitt
6
Zasadniczo wszystkie systemy plików bardziej wyrafinowane niż FAT - to sięga aż do oryginalnego Berkeley UFS - celowo rozbije duże pliki i rozłoży je na wiele „grup alokacji”; pomaga im to zminimalizować ogólne rozdrobnienie dysku. Tam może być jakiś sposób, aby dostosować, jak to działa, ale jest dobre kursy trzeba odtworzyć system plików od podstaw, aby to zrobić, i zapewne nie jest to sposób, aby ją wyłączyć całkowicie wyłączyć.
zwolnienie
2
@hudac Niemożliwe jest zagwarantowanie sekwencyjności we wszystkich przypadkach (patrz sprawa z dyskiem, który jest prawie pełny), a szczerze mówiąc ze wzrostem liczby dysków SSD ma to mniejsze znaczenie niż kiedyś (dla tych, którzy mogą sobie na nie pozwolić ).
Muzer
1
Należy również pamiętać, że istnieją sytuacje, takie jak systemy RAID, w których ciągłe pliki są mniej wydajne, jeśli jest to możliwe. Myślę, że to właśnie jest celem kontrolera podsystemu dyskowego / pamięci masowej: odciążenie wszystkich zadań związanych z przechowywaniem plików tak optymalnie, jak można tego oczekiwać.
jamesqf
17

Polecenie filefragpowie ci, jak fizycznie plik jest przechowywany na twoim urządzeniu:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

Jeśli zapiszesz plik w jednym przebiegu, domyślam się, że plik nie zostanie podzielony.

Strona podręcznika fallocate(1) jest dość przejrzysta:

fallocate służy do wstępnego przydzielania bloków do pliku. W przypadku systemów plików, które obsługują fallocatewywołanie systemowe, odbywa się to szybko, przydzielając bloki i oznaczając je jako niezainicjowane, nie wymagając we / wy bloków danych. Jest to o wiele szybsze niż tworzenie pliku przez wypełnienie go zerami.

Począwszy od jądra Linux v2.6.31, fallocatewywołanie systemowe jest obsługiwane przez systemy plików btrfs, ext4, ocfs2 i xfs.

Czy to jest sekwencyjne? System najpierw spróbuje alokować bloki sekwencyjnie. Jeśli nie, nie ostrzeże Cię.

Vouze
źródło
Co to jest typ „ef53”. Widziałem to także w moich plikach. Ale mój typ FS to ext4.
hudac
2
EF53 to „SUPER_MAGIC” liczba ext2, ext3 i ext4. Szukaj „include / uapi / linux / magic.h” w źródłach jądra dla wszystkich magicznych liczb każdego systemu plików.
Vouze
Na Debianie filefragjest ukryty /usr/sbin. Ale wydaje się, że działa dla zwykłych użytkowników (przynajmniej na ext4). Może być pouczające dla stracejego działania, aby zobaczyć, jak zmierzyć fragmentację dla siebie, jeśli brak ostrzeżenia jest dla ciebie przeszkodą.
Toby Speight
6

Wspominasz o rzadkich plikach i żadna z pozostałych odpowiedzi o nich nie wspomniała.

Większość plików nie jest rzadka. Najczęstszym sposobem utworzenia pliku jest zapisanie go za jednym razem, od początku do końca. Brak dziur.

Możesz jednak powiedzieć „przejdź do pozycji 1 000 000 000 000 i wpisz tam bajt”. Spowoduje to utworzenie pliku, który wygląda jak duży etabajt, ale w rzeczywistości używa (prawdopodobnie) 4k na dysku. To jest rzadki plik.

Możesz to zrobić wiele razy dla tego samego pliku, pozostawiając niewielkie ilości danych rozrzuconych po ogromnej pustce.

Chociaż może to być przydatne, istnieją dwie wady.

Po pierwsze, plik zostanie pofragmentowany, o co się martwisz.

Po drugie, nie wszystkie programy dobrze radzą sobie z tymi plikami. Np. Niektóre oprogramowanie do tworzenia kopii zapasowych spróbuje wykonać kopię zapasową pustki, tworząc w ten sposób kopię zapasową znacznie większą niż to konieczne, być może zbyt dużą dla nośnika kopii zapasowej.

Stig Hemmer
źródło
Ale nawet nierzadki plik często nie jest ciągły na dysku.
Barmar
2

Czy mogę w jakiś sposób kontrolować sekwencję plików? Chcę przydzielić plik 10 GB. Chcę, aby była sekwencyjna na dysku i nie była podzielona między różne przesunięcia.

Istnieje co najmniej kilka sposobów na osiągnięcie tego.

  1. Użyj systemu plików z dużą ilością wolnego miejsca i wstępnie przydziel miejsce (np. Użyj specyficznego dla aplikacji znacznika końca danych i dołącz losowe dane, aż rozmiar pliku osiągnie 10 GB). Nie gwarantuje się, że spowoduje to niefragmentowane dane.

  2. Użyj surowego (niegotowanego) systemu plików zamiast ext4 itp. DBMS czasami robią to ze względu na wydajność. Kompromis polega na tym, że w razie potrzeby musisz wykonać własne buforowanie / dziennikowanie / odzyskiwanie itp.

Przypadki, w których wiele zyskujesz na tym, są stosunkowo rzadkie - najpierw szukałem gdzie indziej, aby zoptymalizować wydajność.


Zobacz też

Czy to prawda, że ​​systemy zarządzania bazami danych zwykle omijają systemy plików?

RedGrittyBrick
źródło
-1

Jeśli jest to jednorazowa sprawa i nie ma znaczenia, jak plik jest pierwotnie przechowywany, liczy się tylko wynik, możesz po prostu zapisać plik normalnie, a następnie uruchomić defragmentator systemu operacyjnego. Następnie możesz sprawdzić za pomocą tej odpowiedzi, czy plik jest w jednym kawałku, jeśli nie, powtórz. Jest to najłatwiejszy sposób na zrobienie tego bez użycia poleceń ani programów zewnętrznych, ale z pewnością nie jest to najszybsza metoda, ponieważ defragmentuje cały dysk.

Fabian Röling
źródło
1
„Uruchom defragmentator”? Czy istnieje taki program? Jedyną rzeczą, którą znaleziono przy Szukałem ze aptitude search ~ddefragbyli ddrescueviewi nidssegmentu TCP składanie biblioteka. Twoja odpowiedź nie jest zbyt pomocna, jeśli nie powiesz, jak program się nazywa lub jakie argumenty należy przekazać.
Toby Speight
1
@TobySpeight - tak, jest defragmentator; e4defrag.
pustkowie