Udostępnij przez


Odciążone transfery danych systemu Windows

ODX (odciążony transfer danych) to funkcja, która przyspiesza operacje kopiowania i przenoszenia serwera. Ta funkcja jest dostępna od systemu Windows Server 2012 i jest obsługiwana na woluminach NTFS. Na tej stronie opisano ODX z perspektywy systemu plików i minifiltru. Aby uzyskać informacje dotyczące urządzeń magazynujących, zobacz Odciążone transfery danych w usłudze Windows Storage.

Transferowanie danych między komputerami lub na tym samym komputerze jest częstą aktywnością systemu plików. Korzystanie ze standardowych funkcji ReadFile i WriteFile działa dobrze z punktu widzenia funkcjonalnego, ale obejmuje duże przenoszenie danych przez wszystkie poziomy systemu i potencjalnie przez sieć. Ta złożoność może mieć wpływ na dostępność systemów związanych z transferem i siecią łączącą systemy. Zaawansowane możliwości dostępne w wielu podsystemach magazynowania zapewniają bardziej wydajne sposoby wykonywania ciężkich zadań przenoszenia danych.

Aplikacje mogą korzystać z tych możliwości, aby ułatwić odciążanie procesu przenoszenia danych do podsystemu magazynowania. Filtry systemu plików mogą zwykle monitorować te akcje, przechwytując żądania odczytu i zapisu na woluminie. Aby filtry były świadome funkcji ODX, konieczne jest podjęcie dodatkowych działań.

Typowe transfery danych

Przenoszenie danych w scenariuszu aplikacji jest obecnie prostsze. Obejmuje odczytywanie danych do pamięci lokalnej, a następnie zapisywanie ich z powrotem w nowej lokalizacji. Na poniższym diagramie przedstawiono ten scenariusz.

Diagram przedstawiający typowy transfer danych.

Ten scenariusz obejmuje kopiowanie pliku między dwiema lokalizacjami na dwóch różnych serwerach plików, z których każdy ma własny dysk wirtualny udostępniany za pośrednictwem inteligentnej macierzy magazynowej (ISA). System inicjujący najpierw musi odczytać dane ze źródłowego dysku wirtualnego do buforu lokalnego. Następnie pakuje i przesyła dane za pomocą jakiegoś transportu i protokołu (na przykład SMB przez 1 GbE) do drugiego systemu. Drugi system następnie odbiera dane i generuje je do buforu lokalnego. Następnie docelowy system zapisuje dane na docelowym dysku wirtualnym. W tym scenariuszu opisano typową metodę odczytu/zapisu transferu danych wykonywaną wiele razy przez wiele różnych aplikacji każdego dnia.

Chociaż standardowe operacje odczytu i zapisu działają dobrze w większości scenariuszy, dane, które mają zostać skopiowane, mogą znajdować się na dyskach wirtualnych zarządzanych przez tę samą inteligentną macierz magazynową. Taka sytuacja oznacza, że dane są przenoszone z tablicy, na serwer, przez transport sieciowy, na inny serwer i z powrotem do tej samej tablicy po raz kolejny. Działanie przenoszenia danych na serwerze i w transporcie sieciowym może znacząco wpłynąć na dostępność tych systemów. Ponadto przepływność przenoszenia danych jest ograniczona przez przepływność i dostępność sieci.

Odciążone transfery danych (ODX)

Odciążanie transferu danych

W systemie Windows 8 wprowadzono dwie funkcjonalności FSCTLs, które ułatwiają odciążenie transferu danych. To odciążenie przenosi obciążenie przenoszenia bitów z serwerów na ruch bitowy, który odbywa się inteligentnie w podsystemach magazynowania. Najlepszym sposobem wizualizacji semantyki poleceń jest myślenie o nich jako analogicznym do niebuforowanego odczytu i niebuforowanego zapisu.

  • FSCTL_OFFLOAD_READ

    To żądanie kontrolne pobiera przesunięcie w pliku, który ma być odczytany, oraz żądaną długość w strukturze FSCTL_OFFLOAD_READ_INPUT. Jeśli jest obsługiwana, podsystem magazynowania hostujące plik odbiera skojarzone polecenie odciążania magazynu do odczytu. Następnie generuje token, który jest logiczną reprezentacją danych, służący do odczytywania podczas wykonywania polecenia odczytu. Ten ciąg tokenu jest zwracany do obiektu wywołującego w strukturze FSCTL_OFFLOAD_READ_OUTPUT .

  • FSCTL_OFFLOAD_WRITE

    To żądanie sterowania przyjmuje przesunięcie wewnątrz pliku, w którym ma być dokonywany zapis, oczekiwaną długość zapisu oraz token, który jest logiczną reprezentacją danych, które należy zapisać. Jeśli jest to obsługiwane, podsystem magazynowania hostujące plik do zapisania odbiera skojarzone polecenie odciążania magazynu zapisu. Najpierw próbuje rozpoznać dany token, a następnie wykonuje operację zapisu, jeśli jest to możliwe. Operacja zapisu jest zakończona w systemie Windows, dlatego składniki w systemie plików i stosach pamięci masowej nie widzą przenoszenia danych. Po zakończeniu przenoszenia danych liczba zapisanych bajtów jest zwracana do obiektu wywołującego.

Podobnie jak na pierwszym diagramie, na poniższym diagramie przedstawiono prostą kopię pliku między dwoma dyskami wirtualnymi na dwóch różnych serwerach.

Diagram przedstawiający odciążony transfer danych.

Jednak zamiast wykonywać normalne operacje odczytu i zapisu, przenosimy ciężar przenoszenia bitów do macierzy dyskowej. Pierwszy system wystawia operację odciążania odczytu, z żądaniem wygenerowania przez tablicę tokenu reprezentującego widok danych przeznaczonych do odczytu w danym momencie w regionie pierwszego dysku wirtualnego. Pierwszy system przesyła następnie token do drugiego systemu, który z kolei inicjuje operację zapisu typu offload na drugim dysku wirtualnym, wykorzystując token. Następnie tablica interpretuje token i próbuje wykonać przenoszenie danych między dyskami wirtualnymi. Rzeczywisty transfer danych odbywa się w inteligentnej macierzy magazynowej, a nie między dwoma hostami. Ten projekt znacznie zwiększa dostępność obu systemów, jednocześnie eliminując praktycznie ruch sieciowy między systemami.

Integracja z aparatem kopiowania

Podstawowy mechanizm kopiowania w systemie Windows jest używany przez funkcję CopyFile i powiązane. Począwszy od systemu Windows 8, aparat kopiowania w sposób niewidoczny próbuje użyć funkcji ODX przed tradycyjną ścieżką kodu kopii pliku. API kopiowania są używane przez większość aplikacji, narzędzi i powłoki systemowej. Te programy wywołujące mogą domyślnie używać funkcji ODX bez większej modyfikacji kodu lub ingerencji użytkownika.

W poniższych krokach podsumowano, jak aparat kopiowania próbuje wykonać operację ODX:

  1. Silnik kopiujący wystawia FSCTL_OFFLOAD_READ na pliku źródłowym, aby uzyskać token odczytu.
  2. Jeśli wystąpił błąd podczas pobierania tokenu odczytu, aparat kopiowania powraca do tradycyjnych operacji odczytu i zapisu (tradycyjna ścieżka kodu kopiowania pliku). Jeśli błąd wskazuje, że wolumin źródłowy nie obsługuje odciążania, aparat kopiowania również oznacza wolumin w pamięci podręcznej dla każdego procesu. Aparat kopiowania nie próbuje już odciążać woluminów w pamięci podręcznej poszczególnych procesów.
  3. Jeśli token został pomyślnie pobrany, aparat kopiowania próbuje wydać FSCTL_OFFLOAD_WRITE polecenia w pliku docelowym w dużych fragmentach, dopóki wszystkie dane, które są logicznie reprezentowane przez token, zostaną odciążone.
  4. Wszelkie błędy podczas odciążania odczytu/zapisu powodują powrót aparatu kopiowania do tradycyjnej ścieżki kodu odczytu/zapisu. Operacja powrotna rozpoczyna się od punktu, w którym zakończyła się ścieżka wykonywania kodu obciążającego (gdzie odczyt lub zapis został przerwany). Aparat kopiowania aktualizuje tę samą pamięć podręczną dla poszczególnych procesów, więc nie próbuje odciążać tych woluminów, jeśli którykolwiek z poniższych warunków jest spełniony. Ta pamięć podręczna procesów resetuje się okresowo.
  • Błąd wskazuje, że wolumin docelowy nie obsługuje funkcji odciążenia.
  • Wolumin źródłowy nie może uzyskać dostępu do woluminu docelowego.

Następujące funkcje obsługują funkcje ODX:

  • CopyFile
  • CopyFileEx
  • MoveFile
  • MoveFileEx
  • CopyFile2

Następujące funkcje nie obsługują funkcji ODX:

  • CopyFileTransacted
  • MoveFileTransacted

Obsługiwane scenariusze odciążania transferu danych

Obsługa operacji odciążania jest dostępna w stosie pamięci masowej Hyper-V i na serwerze plików SMB systemu Windows. Jeśli bazowy magazyn fizyczny obsługuje operacje ODX, użytkownicy mogą wydawać polecenia FSCTL_OFFLOAD_READ i FSCTL_OFFLOAD_WRITE do plików znajdujących się na plikach VHD lub w zdalnych udziałach plików, bez względu na to, czy są na maszynie wirtualnej, czy na sprzęcie fizycznym. Na poniższym diagramie przedstawiono najbardziej podstawowe obsługiwane źródła i cele docelowe dla ODX.

Diagram przedstawiający scenariusze odciążonego transferu danych.

Model na zasadzie opt-in dla filtra systemu plików i jego wpływ na aplikacje

Począwszy od systemu Windows 8, Menedżer filtrów umożliwia filtrowi określenie możliwości odciążania jako obsługiwanej funkcji. Filtry systemu plików dołączone do woluminu mogą zbiorczo ustalić, czy określona operacja odciążona jest wspierana. Jeśli operacja nie jest obsługiwana, operacja kończy się niepowodzeniem z odpowiednim kodem błędu.

Filtr musi wskazywać, że obsługuje FSCTL_OFFLOAD_READ i FSCTL_OFFLOAD_WRITE za pośrednictwem wartości DWORD rejestru o nazwie SupportedFeatures, znajdującej się w definicji usługi sterownika w rejestrze pod adresem HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\nazwa sterownika filtru\. Ta wartość zawiera pola bitowe, w których bity określają, które funkcje są włączone, i powinny być ustawione podczas instalacji filtra.

Obecnie zdefiniowane bity to:

Flaga Znaczenie
SUPPORTED_FS_FEATURES_OFFLOAD_READ 0x00000001 Filtr obsługuje FSCTL_OFFLOAD_READ
SUPPORTED_FS_FEATURES_OFFLOAD_WRITE 0x00000002 Filtr obsługuje FSCTL_OFFLOAD_WRITE

Model zgody filtru można włączyć lub wyłączyć na podstawie wartości obecnej w kluczu rejestru HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem\FilterSupportedFeaturesMode, który ma następujące wartości:

FilterSupportedFeaturesMode: wartość Znaczenie
0 (ustawienie domyślne) Wykonaj normalne przetwarzanie przystąpienia.
1 Nigdy nie wyrażaj zgody (odpowiednik ustawienia SupportedFeatures na wartość 0 we wszystkich dołączonych filtrach)

Testowanie

Aby sprawdzić obsługiwane przez filtr funkcje w stosie, użyj narzędzia fltmc. Uruchom fltmc instance –v [volume]: jako użytkownik z uprawnieniami administratora i sprawdź kolumnę SprtFtrs.

  • Jeśli wartość SprtFtrs jest 0x00, oznacza to, że filtr blokuje odciążanie tego woluminu. Jeśli dla opcji SprtFtrs ustawiono wartość 0x03, obsługiwane są obie operacje odciążania.

Sprawdzanie obsługi funkcji w przetwarzaniu IRP

W ramach przetwarzania IRP funkcja FsRtlGetSupportedFeatures pobiera zagregowany stan SupportedFeatures dla wszystkich filtrów dołączonych do określonego stosu woluminów. Składniki takie jak Menedżer I/O i SRV (SMB) wywołują tę rutynę, aby zweryfikować stan SupportedFeatures dla wszystkich filtrów na stosie. Składniki, które tworzą własne pakiety żądań wejścia/wyjścia (IRP) w celu delegowania zadań, powinny wywołać tę funkcję, aby zweryfikować włączoną obsługę tej operacji.

Zagadnienia dotyczące sterowników filtrów

ODX to sposób przenoszenia danych w centrum danych. Ze względu na integrację logiki odciążania w podstawowym mechanizmie kopiowania, wiele aplikacji ma domyślnie możliwość wykonywania przenoszenia danych w sposób odciążony bez konieczności jawnego ich włączania. W rezultacie deweloperzy filtrów muszą zrozumieć, jak te operacje wpływają na filtry. Niezrozumienie tych operacji w pełni lub nie ocenianie zmiany przepływu danych może potencjalnie spowodować scenariusze, w których dane mogą stać się niespójne lub uszkodzone. Poniższa lista zawiera podsumowanie zestawu zadań do wykonania dla deweloperów filtrów, na które należy zwrócić uwagę w związku z odciążeniem:

  • Zapoznaj się z tym przepływem danych, jego wpływem na filtr oraz zdolnością filtru do obsługi odciążonych operacji.
  • Zaktualizuj instalatora filtru, aby dodać wartość REG_DWORD SupportedFeatures do podklucza HKLM\System\CurrentControlSet\Services\[filter]. Zainicjuj ją, aby określić funkcję odciążania.
  • W przypadku filtrów, które mają obsługiwać operacje odciążania, zaktualizuj rejestrację dla IRP_MJ_FILE_SYSTEM_CONTROL, aby obsługiwać FSCTL_OFFLOAD_READ i FSCTL_OFFLOAD_WRITE.
  • W przypadku filtrów, które muszą blokować odciążone operacje, zwróć kod stanu STATUS_NOT_SUPPORTED z poziomu filtra. Nie polegaj na wartości rejestru do wymuszania blokowania operacji odciążania, ponieważ użytkownicy końcowi mogą ją zmienić. Filtr powinien jawnie zezwalać na operacje odciążania lub nie zezwalać na nie.

Kopiowanie tokenów

W przypadku operacji odciążonych stos wejścia/wyjścia nie widzi danych pliku. Zamiast tego dane pliku są traktowane jako 512-bajtowy znacznik, który jest logicznym odpowiednikiem danych. Ten token jest dowolny z następujących:

  • Nieprzezroczysty i unikatowy ciąg formatu specyficznego dla dostawcy wygenerowanego przez podsystem magazynowania.
  • Dobrze znany typ reprezentujący wzorzec danych (na przykład zakres danych, który jest logicznie równoważny zero).

Modyfikacje danych tokenu proxy powodują unieważnienie tokenu lub dla podsystemu przechowywania utrwalanie oryginalnych danych za pomocą niektórych środków specyficznych dla dostawcy, takich jak mechanizm migawki. Kolejne przekierowywanie żądań odczytu do określonego zakresu w pliku skutkuje unikatowymi tokenami.

Istnieją klasy tokenów, które reprezentują wzorzec danych, który jest dobrze zdefiniowany. Najbardziej znanym tokenem jest token zerowy, który jest odpowiednikiem zera. Gdy token jest zdefiniowany jako dobrze znany token, element członkowski TokenType w strukturze STORAGE_OFFLOAD_TOKEN jest ustawiony na STORAGE_OFFLOAD_TOKEN_TYPE_WELL_KNOWN. Po ustawieniu tego pola, członek WellKnownPattern określa, jaki wzorzec danych jest reprezentowany przez token.

  • Gdy pole WellKnownPattern jest ustawione na STORAGE_OFFLOAD_PATTERN_ZERO lub STORAGE_OFFLOAD_PATTERN_ZERO_WITH_PROTECTION_INFORMATION, wskazuje token zerowy. Gdy ten token jest zwracany przez operację FSCTL_OFFLOAD_READ , wskazuje, że dane zawarte w żądanym zakresie plików są logicznie równoważne zero. Gdy ten token jest dostarczany do operacji FSCTL_OFFLOAD_WRITE, wskazuje, że żądany zakres pliku do zapisu powinien być logicznie wyzerowany.
  • Poza tokenem zerowym nie zdefiniowano żadnych innych dobrze znanych wzorców tokenów. Nie zaleca się, aby użytkownicy definiowali własne dobrze znane wzorce tokenów.

Przycinanie

Podstawowy podsystem magazynowania komunikujący się z systemem Windows może przetwarzać mniej danych, które były pożądane w operacji odciążania. Ten stan nazywa się obcinaniem. Po odciążeniu odczyt zwracany token reprezentuje zakres danych mniejszych niż żądane dane. Element członkowski TransferLength w strukturze FSCTL_OFFLOAD_READ_OUTPUT służy do wskazywania tej wartości, która jest liczbą bajtów od początku zakresu pliku do odczytania. W przypadku odciążonego zapisu, obcięcie wskazuje, że zapisano mniej danych niż oczekiwano. Składowa LengthWritten w strukturze FSCTL_OFFLOAD_WRITE_OUTPUT wskazuje tę wartość, która jest liczbą bajtów od początku zakresu pliku do zapisania. Błędy przetwarzania poleceń lub ograniczenia w stosie dla dużych zakresów powodują obcięcie.

Istnieją dwa scenariusze, w których ntfs obcina zakres do odciążania odczytu lub zapisu:

  1. Zakres kopiowania jest obcięty do prawidłowej długości danych (VDL), jeśli VDL znajduje się przed końcem pliku, czyli EOF. Ta czynność zakłada, że VDL jest wyrównany do granicy sektora logicznego. W przeciwnym razie, należy zapoznać się ze scenariuszem.

    Diagram przedstawiający zjawisko VDL występujące przed EOF.

    Podczas operacji FSCTL_OFFLOAD_READ w strukturze FSCTL_OFFLOAD_READ_OUTPUT ustawiana jest flaga OFFLOAD_READ_FLAG_ALL_ZERO_BEYOND_CURRENT_RANGE, która wskazuje, że reszta pliku zawiera zera, a członek TransferLength jest skracany do VDL.

  2. Podobnie jak w przypadku scenariusza 1, ale gdy VDL nie jest wyrównany do granicy sektora logicznego, NTFS obcina żądany zakres do następnej granicy sektora logicznego.

    Diagram przedstawiający niezbieżność VDL z granicą sektora.

Ograniczenia

  • Operacje odciążania są obsługiwane tylko na woluminach NTFS.
  • Operacje odciążania są obsługiwane za pośrednictwem zdalnych serwerów plików, jeśli spełnione zostaną następujące warunki:
    • Udział zdalny jest woluminem NTFS.
    • Na serwerze działa system Windows Server 2012 lub nowszy (przy założeniu, że stos zdalny obsługuje również operacje odciążania).
  • System plików NTFS nie obsługuje odciążania plików FSCTL wykonywanych na plikach zaszyfrowanych za pomocą funkcji BitLocker lub szyfrowania NTFS (EFS), deduplikowanych plików, skompresowanych plików, plików rezydentnych, plików rozrzedzonych ani plików uczestniczących w transakcjach TxF.
  • System plików NTFS nie obsługuje operacji odciążania FSCTLs wykonywanych na plikach w ramach migawki volsnap.
  • NTFS nie wykonuje operacji odciążania FSCTL, jeśli jeden z poniższych warunków jest spełniony. Takie podejście jest zgodne z tą samą semantyką co niebuforowane I/O.
    • Żądany zakres plików jest niedopasowany do rozmiaru sektora logicznego na urządzeniu źródłowym.
    • Żądany zakres plików jest nieprzyrównywany do rozmiaru sektora logicznego na urządzeniu docelowym.
  • Przed FSCTL_OFFLOAD_WRITE należy wstępnie przydzielić plik docelowy (SetEndOfFile, a nie SetAllocation).
  • Gdy system NTFS przetwarza odciążanie odczytów i zapisów, najpierw wywołuje funkcję CcCoherencyFlushAndPurgeCache w celu zatwierdzenia wszelkich zmodyfikowanych danych w pamięci podręcznej systemu. Ta akcja jest taka sama semantyka jak niecachedowane we/wy.