Share via


Windows 7: kopiowanie wielowątkowe i Shrink Volume

W dniu dzisiejszym (18.03.2003) w siedzibie Microsoft odbylo sie spotkanie wszystko o Windows Server 2008 R2 i Windows 7. Mialam przyjemnosc prowadzic prezentacje “Co nowego w Windows Client - Windows 7 i Windows Vista” .

Prezentacja dostepna bedzie na stronach https://microsoft.pl/technet.

Pod koniec prezentacji wirtualna maszyna pewnej firmy niestety z (na razie) nieznanych mi przyczyn calkowicie sie zamrozila. Niemozliwe bylo uzyskanie z jej strony jakiejkolwiek reakcji, mimo iz bootowala sie prawidlowo i pulpit Windows 7 byl widoczny… W efekcie to, co moglam pokazac ze swojego systemu Windows 7 – pokazalam, jesli chodzi o reszte dzialan, to obiecalam Sluchaczom, ze demo, które chcialam pokazac jest calkowicie wykonywalne w domu i zamieszcze na blogu opis krok-po-kroku.

Demo 1 – Robocopy – Celem jest zaprezentowanie wielowatkowego kopiowania plików w Windows 7

Do dema potrzebna jest maszyna z Windows 7, moze byc wirtualna. Do maszyny tej nalezy dodac nowy dysk o stalym niewielkim rozmiarze (celem jest uzyskanie srodowiska, w którym interakcja z “czynnikami zewnetrznymi” bedzie niewielka). Na maszynie fizycznej mozna sie bez tego obejsc.

1. Na nowym dysku (niech bedzie T:\) nalezy zalozyc dwa foldery “Src” oraz “Dst”.

2. Otworzyc konsole cmd.exe, przejsc do folderu “Src” i wprowadzic nastepujace polecenie: for /l %i in (1,1,100000) do echo Created> T:\Src\file%i.txt – polecenie to utworzy 100000 plików.

3. Zakladanie, a pózniej kopiowanie, 100000 plików niestety troche potrwa, ale w pózniejszych krokach czas ten wykorzystany zostanie na obserwacje.

4. W konsoli cmd.exe wpisac polecenie Robocopy T:\Src T:\Dst - Zostanie rozpoczete kopiowanie plików oparte na dwóch watkach (samo kopiowanie jest jednowatkowe, drugi watek wynika z architektury robocopy), czyli po prostu standardowe proste kopiowanie.

5. Uruchomic Windows PowerShell V2 ISE (%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell_ise.exe).

6. W dolnej czesci okna (prompt) wprowadzic polecenie: (get-process robocopy).Threads.Count.ToString() – polecenie to zlicza watki dla procesu “robocopy”. W efekcie powinno sie otrzymac wartosc 2. Liczbe watków dla procesów mozna odnalezc równiez w Task Manager.

7. Po zakonczeniu kopiowania, program “robocopy” wyswietla podsumowanie kopiowania m.in. czas kopiowania. Nalezy zanotowac calkowity czas kopiowania (Total) dla kopiowania jednowatkowego.

7. W konsoli cmd.exe wpisac polecenie Robocopy T:\Src T:\Dst1 /MT:128, gdzie 128 to liczba watków w procesie “robocopy”. Robocopy z parametrem /MT domyslnie wykorzystuje 8 watków+ 1 + 1, czyli 8 watków kopiowania, jeden watek zarzadzajacy wielowatkowoscia (parametrem MT), jeden watek wynikajacy z architektury robocopy. Minimalnie, jako XXX mozna podac 1 watek, maksymalnie 128.

8. Uruchomic Windows PowerShell V2 ISE (%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell_ise.exe).

9. W dolnej czesci okna (prompt) wprowadzic polecenie: (get-process robocopy).Threads.Count.ToString() – w efekcie powinno sie otrzymac wartosc XXX + 2, w tym przypadku 130.

10. Po zakonczeniu kopiowania nalezy zanotowac calkowity czas kopiowania (Total) dla kopiowania wielowatkowego.

Wnioski: Jezeli nic nie zaklócilo przebiegu kopiowania, kopiowanie wielowatkowe powinno przebiegac szybciej. Znane wszystkim kopiowanie (GUI) w Windows Explorer jest kopiowaniem jednowatkowym. Kopiowanie wielowatkowe nie zostalo jeszcze zaimplementowane w systemie Windows 7 Beta w Windows Explorer i chyba raczej nie zapowiada sie, zeby znalazlo sie w wersji finalnej.

Demo 2 – Shrink Volume – zmiany w NTFS

Wbudowana funkcja Shrink Volume w systemie Windows Vista ma pewne ograniczenia. Glównym ograniczeniem jest brak mozliwosci zmniejszenia rozmiaru wolumenu dysku (shrink) nawet, jezeli wolumen zawiera jeszcze troche wolnego miejsca. W efekcie przy próbie zmniejszenia rozmiaru w Disk Management wyswietlana jest wartosc 0 [MB] w polu “Size of available shrink space in MB”. Powodem niemozliwosci skurczenia dysku sa zazwyczaj nieprzenoszalne pliki systemowe znajdujace sie na koncu wolumenu (czy faktycznie tak jest mozna sprawdzic jakims graficznym defragmenterem dysków np. darmowym Auslogics) . Sytuacja taka moze wystapic np. gdy uzytkownik zmniejszyl wolumen o polowe (maksymalne mozliwe zmniejszenie wolumenu w systemie Windows Vista). Dlaczego o polowe?

Aby odpowiedziec na to pytanie nalezy nieco bardziej zaglebic sie w strukture systemu plików NTFS. W implementacji NTFS w Windows Vista mirror MFT (Master File Table, czyli kopia MFT zawierajaca pierwsze 16 rekordów MFT - najwazniejszych) przechowywany jest na srodku wolumenu. Kopia MFT potrzebna jest m.in. do odtworzenia glównego MFT. Uproszczony schemat logiczny wolumenu NTFS wyglada nastepujaco:

image

Rysunek 1. Uproszczony schemat logiczny dla partycji NTFS.

Obszar MFT Zone jest zarezerwowany przez Ntfs.sys i wyliczany podczas montowania wolumenu w oparciu o calosciowy rozmiar.

Z racji tego, ze kopia MFT to nieprzenoszalne pliki systemowe, to Shrink Volume w Vista nie radzi sobie z przeniesieniem tych plików w inne miejsce. Istnieje wiele komercyjnych narzedzi, które potrafia to zrobic. Jesli znacie jakies darmowe narzedzie, które zrobi to dobrze – prosze o umieszczenie informacji w komentarzach. W Windows 7 troche sie pozmienialo. MFT jest przenoszalne i robi to bez problemu wbudowana funkcja Shrink Volume.

Poniewaz Diskpart w niewprawnych rekach jest dosc niebezpiecznym narzedziem nie podaje tu pelnego przepisu krok po kroku (o numerowanie dysków i partycji pytalam na sesji :)) i podpowiem tylko, ze po wybraniu dysku i partycji, o ilosc mozliwych do odzyskania bajtów mozna zapytac poleceniem shrink querymax. Mozna takze skorzystac z GUI Diskmgmt.msc.

Autor: Paula Januszkiewicz