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:
- 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 +).
- 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. - Czy działa inaczej w różnych typach?
linux
filesystems
hard-disk
io
hudac
źródło
źródło
dmsetup
program, interfejs do urządzenia mapującego urządzenia. Może to być dobry wybór, jeśli planujesz magazyn podobny do bazy danych.iso9660
iromfs
nie są w stanie tego zrobić i wymagają ciągłego przechowywania (z tych mogę wymienić osobno).Odpowiedzi:
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.
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.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.
źródło
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.Polecenie
filefrag
powie ci, jak fizycznie plik jest przechowywany na twoim urządzeniu:Jeśli zapiszesz plik w jednym przebiegu, domyślam się, że plik nie zostanie podzielony.
Strona podręcznika
fallocate
(1) jest dość przejrzysta:Czy to jest sekwencyjne? System najpierw spróbuje alokować bloki sekwencyjnie. Jeśli nie, nie ostrzeże Cię.
źródło
ext4
.filefrag
jest ukryty/usr/sbin
. Ale wydaje się, że działa dla zwykłych użytkowników (przynajmniej na ext4). Może być pouczające dlastrace
jego działania, aby zobaczyć, jak zmierzyć fragmentację dla siebie, jeśli brak ostrzeżenia jest dla ciebie przeszkodą.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.
źródło
Istnieje co najmniej kilka sposobów na osiągnięcie tego.
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.
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?
źródło
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.
źródło
aptitude search ~ddefrag
byliddrescueview
inids
segmentu TCP składanie biblioteka. Twoja odpowiedź nie jest zbyt pomocna, jeśli nie powiesz, jak program się nazywa lub jakie argumenty należy przekazać.