Defragmentace souborů
Při zápisu souboru na disk někdy nelze soubor zapsat v souvislých clusterech. Nesouvislé clustery zpomalují proces čtení a zápisu souboru. Čím dále od sebe jsou nesouvislé clustery na disku, tím horší je problém, protože doba potřebná k přesunutí hlavy pro čtení a zápis pevného disku. Soubor s nesouvisenými clustery je fragmentovaný. Kvůli optimalizaci souborů pro rychlý přístup je možné svazek defragmentovat.
defragmentace je proces přesouvání částí souborů na disku, aby se soubory defragmentovaly, to znamená proces přesouvání clusterů souborů na disku, aby byly souvislé. Další informace najdete v následujících částech:
- Defragmentace souboru
- minimalizace interakcí mezi defragmentací a stínovými kopiemi
- Soubory, datové proudy a typy datových proudů podporované pro defragmentaci
Defragmentace souboru
V jednoduchém operačním systému s jedním úkolem je defragmentační software jediným úkolem a neexistují žádné další procesy pro čtení z disku nebo zápis na disk. V operačním systému multitaskingu však některé procesy mohou číst a zapisovat na pevný disk, zatímco jiný proces defragmentuje tuto jednotku pevného disku. Trikem je vyhnout se zápisům do souboru, který je defragmentován bez zastavení procesu zápisu po velmi dlouhou dobu. Řešení tohoto problému není triviální, ale je možné.
Chcete-li povolit defragmentaci bez nutnosti podrobné znalosti struktury disku systému souborů, je k dispozici sada tří řídicích kódů. Řídicí kódy poskytují následující funkce:
- Povolit aplikacím vyhledání prázdných clusterů
- Určení umístění disku clusterů souborů
- Přesun clusterů na disku
Řídicí kódy také transparentně zpracovávají problém inhibice a umožňují jiným procesům číst a zapisovat do souborů během přesouvání.
Tyto operace je možné provádět bez inhibice spuštění jiných procesů. Ostatní procesy však mají pomalejší dobu odezvy, když je disková jednotka defragmentována.
Postup defragmentace souboru:
- Pomocí řídicího kódu FSCTL_GET_VOLUME_BITMAP najděte místo na svazku, který je dostatečně velký k přijetí celého souboru.
Poznámka
V případě potřeby přesuňte jiné soubory, abyste uvolnili dostatečně velké místo. V ideálním případě je po prvním rozsahu souboru dostatek nepřidělených clusterů, které můžete přesunout do prostoru po prvním rozsahu.
Pomocí řídicího kódu FSCTL_GET_RETRIEVAL_POINTERS získáte mapu aktuálního rozložení souboru na disku.
Procházejte strukturu RETRIEVAL_POINTERS_BUFFER vrácenou příkazem FSCTL_GET_RETRIEVAL_POINTERS.
Pomocí řídicího kódu FSCTL_MOVE_FILE můžete při procházení struktury přesouvat jednotlivé clustery.
Poznámka
Možná budete muset obnovit rastrovou bitovou mapu nebo strukturu načítání nebo obojí v různých časech, protože jiné procesy zapisují na disk.
Dvě operace, které se používají v procesu defragmentace, vyžadují popisovač svazku. Jenom správci mohou získat popisovač svazku, takže svazek mohou defragmentovat pouze správci. Aplikace by měla zkontrolovat práva uživatele, který se pokusí spustit defragmentaci softwaru, a neměl by umožnit uživateli defragmentovat svazek, pokud uživatel nemá příslušná práva.
Při použití CreateFile k otevření adresáře během defragmentace svazku souborového systému FAT nebo FAT32 zadejte hodnotu masky přístupu GENERIC_READ. Nezadávejte hodnotu masky přístupu MAXIMUM_ALLOWED. Pokud se to udělá, přístup k adresáři bude odmítnut.
Nepokoušejte se přesunout přidělené clustery v systému souborů NTFS, který přesahuje velikost zaokrouhleného souboru clusteru, protože výsledkem je chyba.
Reparse body, bitmapy a seznamy atributů ve svazcích systému souborů NTFS mohou být defragmentovány, otevřeny pro čtení a synchronizaci a pojmenovány pomocí syntaxe souboru:jméno:typ; například dirname:$i30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT a mrp::$ATTRIBUTE_LIST.
Při defragmentaci svazků systému souborů NTFS je povolena defragmentace virtuálního clusteru nad rámec velikosti přidělení souboru.
Minimalizace interakcí mezi defragmentací a stínovými kopiemi
Pokud je to možné, přesuňte data v blocích zarovnaných vůči sobě v přírůstcích po 16 kilobajtech (KB). To snižuje režii při zápisu při kopírování při povolení stínových kopií, protože se zvýší místo stínové kopie a sníží se výkon, když dojde k následujícím podmínkám:
- Velikost bloku žádosti o přesunutí je menší než 16 kB.
- Delta přesunu není v přírůstcích 16 KB.
Rozdíl přesunu je počet bajtů mezi začátkem zdrojového bloku a začátkem cílového bloku. Jinými slovy, blok začínající na předsazení X (na disku) lze přesunout na počáteční předsazení Y, pokud absolutní hodnota rozdílu X a Y je celý násobek 16 kB. Takže za předpokladu 4kB clusterů bude optimalizován přesun z clusteru 3 na cluster 27, zatímco přesun z clusteru 18 na cluster 24 nebude. Všimněte si, že mod(3,4) = 3 = mod(27,4). Mod 4 je zvolen, protože čtyři clustery v 4 kB jsou ekvivalentní 16 kB. Proto bude mít svazek s velikostí clusteru formátovanou na 16 kB za následek optimalizaci všech pohybových souborů.
Další informace o stínových kopiích naleznete v tématu Služba stínové kopie svazku.
Soubory, streamy a typy datových proudů podporované pro defragmentaci
Většinu souborů je možné přesunout pomocí řídicího kódu FSCTL_MOVE_FILE, ne všechny je možné přesunout. Níže je seznam souborů, datových proudů a typů datových proudů (označovaných také jako kódy typů atributů) podporovaných FSCTL_MOVE_FILE. Jiné soubory, datové proudy a typy datových proudů nejsou podporovány FSCTL_MOVE_FILE.
Typy datových proudů podporované pro libovolný soubor nebo adresář.
- ::$DATA
- ::$ATTRIBUTE_LIST
- ::$REPARSE_POINT
- ::$EA
- ::$LOGGED_UTILITY_STREAM
Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 a Windows XP: ::$EA a ::$LOGGED_UTILITY_STREAM nejsou podporovány před Windows 8 a Windows Server 2012
Typy datových proudů podporované pro libovolný adresář.
- ::$BITMAP
- ::$INDEX_ALLOCATION
Toto jsou systémové soubory, datové proudy a typy datových proudů podporované FSCTL_MOVE_FILE ve formátu "název souboru:název streamu:$název_typu".
- $MFT::$DATA
- $MFT::$ATTRIBUTE_LIST
- $MFT::$BITMAP
- $AttrDef::$DATA
- $AttrDef::$ATTRIBUTE_LIST
- $Secure:$SDS:$DATA
- $Secure::$ATTRIBUTE_LIST
- $Secure:$SDH:$INDEX_ALLOCATION
- $Secure:$SDH:$BITMAP
- $Secure:$SII:$INDEX_ALLOCATION
- $Secure:$SII:$BITMAP
- $UpCase::$DATA
- $UpCase::$ATTRIBUTE_LIST
- $Extend:$I30:$INDEX_ALLOCATION
- $Extend::$ATTRIBUTE_LIST
- $Extend:$I30:$BITMAP
- $Extend\$UsnJrnl:$J:$DATA
- $Extend\$UsnJrnl::$ATTRIBUTE_LIST
- $Extend\$UsnJrnl:$Max:$DATA
- $Extend\$Quota:$Q:$INDEX_ALLOCATION
- $Extend\$Kvóta::$SEZNAM_ATRIBUTŮ
- $Extend\$Quota:$Q:$BITMAP
- $Extend\$Quota:$O:$INDEX_ALLOCATION
- $Extend\$Quota:$O:$BITMAP
- $Extend\$ObjId:$O:$INDEX_ALLOCATION
- $Extend\$ObjId::$ATTRIBUTE_LIST
- $Extend\$ObjId:$O:$BITMAP
- $Extend\$Reparse:$R:$INDEX_ALLOCATION
- $Extend\$Reparse::$ATTRIBUTE_LIST
- $Extend\$Reparse:$R:$BITMAP
- $Extend\$RmMetadata:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata:$I30:$BITMAP
- $Extend\$RmMetadata::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair::$DATA
- $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair:$Config:$DATA
- $Extend\$RmMetadata\$Txf:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Txf:$I30:$BITMAP
- $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
- $Extend\$RmMetadata\$TxfLog:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog:$I30:$BITMAP
- $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
- $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog\$Tops:$T:$DATA
- $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
- $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST