Kerath skrev:
Du råkar inte tycka att motiveringar är värre än pesten, månne?
Jag gillar inte motiveringarna som används i den där artikeln.
vulfgar skrev:
Du får gärna utveckla detta lite.
Frågan är varför det inte följer med defragmenteringsmjukvara till
t.ex. Ubuntu när det gör det till Microsofs operativsystem?
Artikeln ger svaret att vissa filsystem (FAT) fragmenteras lättare än
andra (ext2) eftersom filerna fylls på från början av filsystemet istället
för att spridas ut så att de får gott om plats att växa på.
Detta illustreras med missvisande ASCII-bilder. Fragmentering sker
på block(kluster)-nivå, inte på byte(bokstavs)-nivå. Du kan ta vilket
FAT-filsystem som helt, spara två filer innehållande "Hello, world"
och "Goodbye, world". Men du kommer aldrig att få fragmentering
genom att bara lägga till två utropstecken till den första filen. Filer
mindre än kluster-storleken fragmenteras inte.
Dessutom så är det fel att säga att linux-implementationen av ext2
sprider ut filerna. Faktum är att om filerna i artikelns exempel skrivs
en i taget så skulle de troligen hamna närmare varandra i ext2 än i FAT
eftersom kluster-storleken i FAT ofta är 32kiB medan ext2 vanligtvis
använder 4kiB. Även om filerna skrivs samtidigt så hamnar de ändå
relativt nära varandra i ext2. Men det blir antagligen mer än 32kiB
mellan dem eftersom ett antal block förallokeras för att undvika risken
att filerna blir alltför sammanflätade.
Varför hamnar filerna nära varandra även i ext2? Artikeln försökte
ju visa att det inte är bra att göra så!
Det som tar mest tid vid i/o-operationer är att flytta hårdiskens
läs/skriv-huvud, vilket man därför vill undvika så mycket som möjligt.
Säg att du startar ett spel som läser in hundratals texturfiler. Om filerna
ligger utspridda över hela disken så tvingas läshuvudet röra sig onödigt
mycket jämfört med om filerna hade legat i närheten av varandra.
Tricket är att försöka lagra relaterad filer nära varandra. Filer som inte är
relaterade är det däremot fördelaktigt att sprida ut, inte för att de ska ha
plats att växa, utan snarare för att de inte ska vara i vägen för de
relaterade filerna.
Med ext2 så sprids huvudkatalogerna ut över hela filsystemet, medan filer
i samma katalog lagras i närheten av varandra. Om filerna fragmenteras
så försöker man se till att även fragmenten hamnar i närheten.
Rent tekniskt så delas ext2-filsystem in i ett antal lika stora delar, typiskt
128MiB stora. En ny katalog hamnar sedan i en del som har gott om plats.
Filerna i katalogen hamnar så länge de får plats i samma del, sedan i
närbelägna delar. Filer som är större än 128MiB blir därför alltid
fragmenterade.
Man kan se hur fragmenterad en viss fil är med kommandot
filefrag:
Kod: Markera allt
bash$ sudo filefrag ubuntu-7.04-desktop-i386.iso
ubuntu-7.04-desktop-i386.iso: 11 extents found, perfection would be 6 extents
Här visade det sig att min ubuntu-iso är uppdelad i 11 delar. Bästa möjliga
hade varit 698MiB / 128MiB, dvs 6 delar.
Hur illa ext2 drabbas av fragmentering beror mycket på hur stor andel av
filsystemet som används. Vid 80-90% fullt börjar det bli problem och vid
95% blir det stora problem. Det är en av anledningarna till att 5% av
utrymmet är reserverat som standard.
Ett fragmenterat filsystem är sämre än ett som inte är fragmenterat.
Frågan är hur mycket sämre? Linux cachar läs/skriv-förfrågningar och
använder sedan elevator-algoritmer som sorterar det hela i en smart
ordning så att diskhuvudets rörelser minimeras, oavsett om det är en
fragmenterad fil eller 10 olika filer som ska läsas/skrivas.
Linux har dessutom readahead-cache och moderna hårdiskar har egna
cacher, vilket även det minskar betydelsen av diskfragmentering.
Så varför följer det inte med något defragmenteringprogram till Ubuntu?
Är det för att det inte behövs något? Eller?
De defragmenteringsprogram som finns idag (t.ex. shake) bygger på idén
att en kopia av en fil blir mindre fragmenterad än vad filen var från början,
vilket inte alltid är fallet. Dessutom finns det risk att någon annan process
skriver till filen under tiden med dataförlust som följd.
Det fanns ett riktigt defragmenteringsprogram till ext2 som jobbade på
avmonterade filsystem. Det har dock inte uppdaterats på 10 år. Problemet
var att ett strömavbrott under defragmenteringen innebar att filsystmet
totalförstördes. Detta gjorde att man alltid behövde ta en backup innan
defragmentering. Och måste man ändå ta en backup så är det långsammare
att defragmentera än att göra ett nytt filsystem med "mkfs" och återställa
backupen till det nya filsystemet (vilket innebär att allting blir defragmenterat).
Det ska dock finnas ett riktigt och säkert defragmenteringsprogram till det
nya ext4 som fungerar utan att man behöver avmontera filsystemet.