ODX(오프로드된 데이터 전송)는 서버 복사 및 이동 작업을 가속화하는 기능입니다. 이 기능은 Windows Server 2012부터 사용할 수 있으며 NTFS 볼륨에서 지원됩니다. 이 페이지에서는 파일 시스템 및 미니 필터 관점에서 ODX에 대해 설명합니다. 스토리지 디바이스와 관련된 자세한 내용은 Windows Storage 오프로드된 데이터 전송을 참조 하세요.
컴퓨터 간 또는 동일한 컴퓨터 내에서 데이터를 전송하는 작업은 파일 시스템 작업이 자주 발생합니다. 표준 ReadFile 및 WriteFile 함수를 사용하는 것은 기능적인 관점에서 잘 작동하지만 시스템의 모든 수준과 잠재적으로 네트워크를 통해 대량의 데이터 이동이 포함됩니다. 이러한 복잡성은 전송과 관련된 시스템의 가용성과 시스템을 연결하는 네트워크에 영향을 줄 수 있습니다. 많은 스토리지 하위 시스템에 사용할 수 있는 고급 기능은 데이터 이동의 무거운 작업을 수행하는 보다 효율적인 방법을 제공합니다.
애플리케이션은 이러한 기능을 활용하여 데이터 이동 프로세스를 스토리지 하위 시스템에 오프로드할 수 있습니다. 파일 시스템 필터는 일반적으로 볼륨에 대한 읽기 및 쓰기 요청을 가로채 이러한 작업을 모니터링할 수 있습니다. 필터가 ODX를 인식하려면 더 많은 작업이 필요합니다.
일반적인 데이터 전송
현재 애플리케이션 시나리오에서 데이터를 이동하는 것이 더 간단합니다. 데이터를 로컬 메모리로 읽은 다음 새 위치에 다시 쓰는 작업이 포함됩니다. 다음 다이어그램은 이 시나리오를 보여 줍니다.
이 시나리오에는 서로 다른 두 파일 서버의 두 위치 간에 파일을 복사하는 작업이 포함되며, 각각 ISA(Intelligent Storage Array)를 통해 노출되는 자체 가상 디스크가 있습니다. 시작 시스템은 먼저 원본 가상 디스크에서 로컬 버퍼로 데이터를 읽어야 합니다. 그런 다음, 일부 전송 및 프로토콜(예: 1GbE 이상의 SMB)을 통해 데이터를 패키지하고 두 번째 시스템으로 전송합니다. 그런 다음 두 번째 시스템은 데이터를 수신하고 로컬 버퍼에 출력합니다. 그런 다음 대상 시스템은 대상 가상 디스크에 데이터를 씁니다. 이 시나리오에서는 매일 여러 애플리케이션에서 여러 번 수행되는 일반적인 데이터 전송 읽기/쓰기 방법을 설명합니다.
표준 읽기 및 쓰기는 대부분의 시나리오에서 잘 작동하지만 복사하려는 데이터는 동일한 Intelligent Storage 배열에서 관리하는 가상 디스크에 있을 수 있습니다. 이 상황은 데이터가 배열에서 서버로, 네트워크 전송을 통해, 다른 서버로, 다시 동일한 배열로 다시 이동된다는 것을 의미합니다. 서버 내 및 네트워크 전송을 통해 데이터를 이동하는 행위는 해당 시스템의 가용성에 크게 영향을 줄 수 있습니다. 또한 데이터 이동의 처리량은 네트워크의 처리량 및 가용성에 의해 제한됩니다.
오프로드된 데이터 전송(ODX)
데이터 전송 오프로드
데이터 전송을 오프로드하는 방법을 용이하게 하는 두 개의 FSCTL이 Windows 8에 도입되었습니다. 이 오프로드는 서버에서 비트 이동의 부담을 스토리지 하위 시스템 내에서 지능적으로 발생하는 비트 이동으로 이동합니다. 명령 의미 체계를 시각화하는 가장 좋은 방법은 버퍼되지 않은 읽기 및 버퍼되지 않은 쓰기와 유사하다고 생각하는 것입니다.
-
이 제어 요청은 읽을 파일 내의 오프셋 및 FSCTL_OFFLOAD_READ_INPUT 구조 내에서 원하는 길이를 사용합니다. 지원되는 경우 파일을 호스팅하는 스토리지 하위 시스템은 연결된 오프로드 읽기 스토리지 명령을 받습니다. 그런 다음 토큰을 생성합니다. 이 토큰은 오프로드 읽기 명령 시 읽을 데이터의 논리적 표현입니다. 이 토큰 문자열은 FSCTL_OFFLOAD_READ_OUTPUT 구조의 호출자에게 반환됩니다.
-
이 컨트롤 요청은 쓸 파일 내의 오프셋, 원하는 쓰기 길이 및 쓸 데이터의 논리적 표현인 토큰을 사용합니다. 지원되는 경우 쓸 파일을 호스팅하는 스토리지 하위 시스템은 연결된 오프로드 쓰기 스토리지 명령을 받습니다. 먼저 지정된 토큰을 인식하려고 시도한 다음 가능한 경우 쓰기 작업을 수행합니다. 쓰기 작업은 Windows 아래에서 완료되므로 파일 시스템 및 스토리지 스택의 구성 요소에 데이터 이동이 표시되지 않습니다. 데이터 이동이 완료되면 기록된 바이트 수가 호출자에게 반환됩니다.
첫 번째 다이어그램과 마찬가지로 다음 다이어그램은 서로 다른 두 서버의 두 가상 디스크 간에 간단한 파일 복사를 보여 줍니다.
그러나 일반적인 읽기 및 쓰기를 수행하는 대신 스토리지 배열에 비트 이동의 많은 부분을 오프로드합니다. 첫 번째 시스템은 오프로드 읽기 작업을 실행하여 배열에 첫 번째 가상 디스크의 지역 내에서 읽을 데이터의 지정 시간 보기를 나타내는 토큰을 생성하도록 요청합니다. 그런 다음 첫 번째 시스템은 토큰을 두 번째 시스템으로 전송합니다. 그러면 토큰을 사용하여 두 번째 가상 디스크에 오프로드 쓰기 작업을 실행합니다. 그런 다음 배열은 토큰을 해석하고 가상 디스크 간에 데이터 이동을 수행하려고 시도합니다. 실제 데이터 전송은 두 호스트가 아닌 지능형 스토리지 배열 내에서 발생합니다. 이 설계는 두 시스템의 가용성을 크게 향상시키면서 시스템 간의 네트워크 트래픽을 사실상 제거합니다.
복사 엔진과 통합
Windows의 핵심 복사 엔진은 CopyFile 및 관련 함수에서 사용됩니다. Windows 8부터 복사 엔진은 기존의 복사 파일 코드 경로 앞에 ODX를 투명하게 사용하려고 시도합니다. 복사 API는 대부분의 애플리케이션, 유틸리티 및 셸에서 사용됩니다. 이러한 호출자는 코드 수정 또는 사용자 개입이 거의 없는 경우 기본적으로 ODX 기능을 사용할 수 있습니다.
다음 단계에서는 복사 엔진이 ODX를 시도하는 방법을 요약합니다.
- 복사 엔진은 소스 파일에 FSCTL_OFFLOAD_READ 실행하여 읽기 토큰을 가져옵니다.
- 읽기 토큰을 검색하지 못한 경우 복사 엔진은 기존의 읽기 및 쓰기(기존 복사 파일 코드 경로)로 대체됩니다. 오류가 원본 볼륨이 오프로드를 지원하지 않음을 나타내는 경우 복사 엔진은 프로세스별 캐시의 볼륨도 표시합니다. 복사 엔진은 프로세스별 캐시의 볼륨에 대해 더 이상 오프로드를 시도하지 않습니다.
- 토큰을 성공적으로 검색한 경우, 복사 엔진은 토큰으로 논리적으로 표현되는 모든 데이터가 오프로드될 때까지 FSCTL_OFFLOAD_WRITE 명령을 대상 파일에 큰 청크로 실행하려고 시도합니다.
- 오프로드 읽기/쓰기를 수행하는 동안 오류가 발생하면 복사 엔진이 기존 읽기/쓰기 코드 경로로 대체됩니다. 이 대체는 오프로드 코드 경로가 종료된 위치에서 시작됩니다(읽기 또는 쓰기가 잘린 위치). 복사 엔진은 프로세스당 동일한 캐시를 업데이트하므로 다음 조건 중 하나가 충족되는 경우 이러한 볼륨에서 오프로드를 시도하지 않습니다. 이 프로세스별 캐시는 주기적으로 다시 설정됩니다.
- 실패는 대상 볼륨이 오프로드를 지원하지 않음을 나타냅니다.
- 원본 볼륨이 대상 볼륨에 도달할 수 없습니다.
다음 함수는 ODX를 지원합니다.
- CopyFile
- CopyFileEx
- MoveFile
- MoveFileEx
- CopyFile2
다음 함수는 ODX를 지원하지 않습니다.
- CopyFileTransacted
- MoveFileTransacted
지원되는 오프로드 데이터 전송 시나리오
오프로드 작업에 대한 지원은 Hyper-V 스토리지 스택 및 Windows SMB 파일 서버에서 제공됩니다. 지원하는 물리적 스토리지가 ODX 작업을 지원하는 경우, 호출자는 가상 머신 내에서나 물리적 하드웨어 상에 있는 VHD 또는 원격 파일 공유의 파일에 대해 FSCTL_OFFLOAD_READ 및 FSCTL_OFFLOAD_WRITE를 발급할 수 있습니다. 다음 다이어그램에서는 ODX에 대해 지원되는 가장 기본적인 원본 및 대상 대상을 보여 줍니다.
파일 시스템 필터 옵트인 모델 및 애플리케이션에 미치는 영향
Windows 8부터 필터 관리자를 사용하면 필터에서 오프로드 기능을 지원되는 기능으로 지정할 수 있습니다. 볼륨에 연결된 파일 시스템 필터는 오프로드된 특정 작업이 지원되는지 여부를 전체적으로 확인할 수 있습니다. 지원되지 않으면 적절한 오류 코드로 작업이 실패합니다.
필터는 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\filter 드라이버 이름\ 레지스트리의 드라이버 서비스 정의에 있는 SupportedFeatures라는 레지스트리 DWORD 값을 통해 FSCTL_OFFLOAD_READ 및 FSCTL_OFFLOAD_WRITE을 지원한다는 것을 나타내야 합니다. 이 값에는 비트 필드가 포함되어 있으며, 각 비트는 선택할 기능을 결정합니다. 이러한 값은 필터 설치 시 설정해야 합니다.
현재 정의된 비트는 다음과 같습니다.
| 플래그 | 의미 |
|---|---|
| SUPPORTED_FS_FEATURES_OFFLOAD_READ 0x00000001 | 필터는 FSCTL_OFFLOAD_READ를 지원합니다. |
| SUPPORTED_FS_FEATURES_OFFLOAD_WRITE 0x00000002 | 필터는 FSCTL_OFFLOAD_WRITE를 지원합니다. |
필터 옵트인 모델은 다음 값을 포함하는 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem\FilterSupportedFeaturesMode 레지스트리 키에 있는 값에 따라 사용하거나 사용하지 않도록 설정할 수 있습니다.
| FilterSupportedFeaturesMode 값 | 의미 |
|---|---|
| 0(기본값) | 일반적인 옵트인 처리를 수행합니다. |
| 1 | 옵트인 안 함(연결된 모든 필터에서 SupportedFeatures를 0으로 설정하는 것과 동일) |
테스팅
필터의 지원되는 스택 기능을 확인하려면 fltmc 유틸리티를 사용합니다. 관리자 권한 사용자로 fltmc 인스턴스 –v [볼륨]를 실행하고, SprtFtrs 열을 확인합니다.
- SprtFtrs 값이 0x00 경우 필터가 이 볼륨에서 오프로드를 차단하고 있음을 의미합니다. SprtFtrs가 0x03으로 설정되어 있으면 두 가지 오프로드 작업을 모두 지원합니다.
IRP 처리에서 기능 지원 확인
IRP 처리의 일환으로 FsRtlGetSupportedFeatures 루틴은 지정된 볼륨 스택에 연결된 모든 필터에 대해 집계된 SupportedFeatures 상태를 검색합니다. I/O 관리자 및 SMB(SRV)와 같은 구성 요소는 이 루틴을 호출하여 스택의 모든 필터에 대한 SupportedFeatures 상태의 유효성을 검사합니다. 자체 오프로드 IRP를 롤하는 구성 요소는 이 함수를 호출하여 해당 작업에 대한 옵트인 지원의 유효성을 검사해야 합니다.
필터 드라이버에 대한 고려 사항
ODX는 데이터 센터에서 데이터를 이동하는 방법입니다. 핵심 복사 엔진의 오프로드 논리 통합으로 인해 기본적으로 많은 애플리케이션은 명시적으로 옵트인하지 않고 오프로드된 데이터 이동을 수행할 수 있습니다. 따라서 필터 개발자는 이러한 작업이 필터에 미치는 영향을 이해해야 합니다. 이러한 작업을 완전히 이해하지 못하거나 데이터 흐름 변경을 평가하지 않으면 데이터가 일관되지 않거나 손상될 수 있는 시나리오가 발생할 수 있습니다. 다음 목록에는 필터 개발자가 오프로드와 함께 기록해 두는 작업 항목 집합이 요약되어 있습니다.
- 이 데이터 흐름, 필터에 미치는 영향 및 이러한 오프로드된 작업을 지원하는 필터의 기능을 이해합니다.
- HKLM\System\CurrentControlSet\Services\[filter] 하위 키에 SupportedFeatures에 대한 REG_DWORD 값을 추가하도록 필터 설치 관리자를 업데이트합니다. 오프로드 기능을 지정하도록 초기화합니다.
- 오프로드 작업을 처리하려는 필터의 경우, IRP_MJ_FILE_SYSTEM_CONTROL 등록을 업데이트하여 FSCTL_OFFLOAD_READ 및 FSCTL_OFFLOAD_WRITE를 처리하도록 합니다.
- 오프로드된 작업을 차단해야 하는 필터의 경우 필터 내에서 STATUS_NOT_SUPPORTED 상태 코드를 반환합니다. 최종 사용자가 변경할 수 있으므로 레지스트리 값을 사용하여 차단 오프로드 작업을 적용하지 마세요. 필터는 오프로드 작업을 명시적으로 허용하거나 허용하지 않아야 합니다.
토큰 복사
오프로드된 작업을 사용하면 I/O 스택에 파일 데이터가 표시되지 않습니다. 대신 파일 데이터는 데이터의 논리적 프록시인 512 바이트 토큰으로 표시됩니다. 이 토큰은 다음 중 하나입니다.
- 스토리지 하위 시스템에 의해 생성된 공급업체별 형식의 불투명하고 고유한 문자열입니다.
- 데이터 패턴을 나타내는 잘 알려진 형식입니다(예: 논리적으로 0과 동일한 데이터 범위).
프록시 토큰의 데이터를 수정하면 토큰이 무효화되거나 스토리지 하위 시스템이 스냅샷 메커니즘과 같은 일부 공급업체별 수단을 통해 원래 데이터를 유지하게 됩니다. 이후 파일의 지정된 범위에 대한 읽기 요청을 오프로드하면 고유한 토큰이 생성됩니다.
잘 정의된 데이터 패턴을 나타내는 토큰 클래스가 있습니다. 가장 일반적으로 잘 알려진 토큰은 0과 동일한 제로 토큰입니다. 토큰이 잘 알려진 토큰으로 정의되면 STORAGE_OFFLOAD_TOKEN 구조의 TokenType 멤버가 STORAGE_OFFLOAD_TOKEN_TYPE_WELL_KNOWN 설정됩니다. 이 필드가 설정 되면 WellKnownPattern 멤버는 토큰이 있는 데이터의 패턴을 결정합니다.
- WellKnownPattern 필드가 STORAGE_OFFLOAD_PATTERN_ZERO 또는 STORAGE_OFFLOAD_PATTERN_ZERO_WITH_PROTECTION_INFORMATION 설정되면 제로 토큰을 나타냅니다. 이 토큰은 FSCTL_OFFLOAD_READ 작업에서 반환될 때 원하는 파일 범위 내에 포함된 데이터가 논리적으로 0과 동일하다는 것을 나타냅니다. 이 토큰이 FSCTL_OFFLOAD_WRITE 작업에 제공되면 기록할 파일의 원하는 범위가 논리적으로 0이어야 임을 나타냅니다.
- 제로 토큰 이외에는 현재 정의된 다른 잘 알려진 토큰 패턴이 없습니다. 사용자가 잘 알려진 자체 토큰 패턴을 정의하는 것은 권장되지 않습니다.
잘림
Windows가 통신하는 기본 스토리지 하위 시스템은 오프로드 작업에서 원하는 데이터를 더 적게 처리할 수 있습니다. 이 조건을 잘림이라고 합니다. 오프로드 읽기를 사용하면 반환된 토큰은 요청된 데이터보다 작은 데이터 범위를 나타냅니다. FSCTL_OFFLOAD_READ_OUTPUT 구조체의 TransferLength 멤버는 읽을 파일 범위의 시작 부분에서 바이트 수인 이 값을 나타내는 데 사용됩니다. 오프로드 쓰기의 경우 잘림은 원하는 것보다 적은 데이터가 기록되었음을 나타냅니다. FSCTL_OFFLOAD_WRITE_OUTPUT 구조체의 LengthWritten 멤버는 기록할 파일 범위의 시작 위치에서부터 바이트 수를 나타냅니다. 명령 처리 오류 또는 큰 범위에 대한 스택 내의 제한 사항으로 인해 잘림이 발생합니다.
NTFS가 읽기 또는 쓰기를 오프로드할 범위를 잘라내는 두 가지 시나리오가 있습니다.
VDL이 EOF(파일의 끝) 앞에 있으면 복사 범위가 VDL(유효한 데이터 길이)으로 잘립니다. 이 작업은 VDL이 논리 섹터 경계에 맞춰진 것으로 가정하고, 그렇지 않으면 시나리오를 참조하세요.
FSCTL_OFFLOAD_READ 작업 중에, 파일의 나머지 부분이 0으로 채워져 있음을 나타내기 위해 FSCTL_OFFLOAD_READ_OUTPUT 구조체 내에 OFFLOAD_READ_FLAG_ALL_ZERO_BEYOND_CURRENT_RANGE 플래그가 설정되며, TransferLength 멤버는 VDL로 잘립니다.
시나리오 1과 비슷하지만 VDL이 논리 섹터 경계에 정렬되지 않은 경우 NTFS는 원하는 범위를 다음 논리 섹터 경계로 자립니다.
제한 사항
- 오프로드 작업은 NTFS 볼륨에서만 지원됩니다.
- 다음 조건이 모두 true인 경우 원격 파일 서버를 통해 오프로드 작업이 지원됩니다.
- 원격 공유는 NTFS 볼륨입니다.
- 서버에서 Windows Server 2012 이상 버전을 실행하고 있습니다(원격 스택이 오프로드 작업도 지원되는 것으로 가정).
- NTFS는 Bitlocker 또는 NTFS 암호화(EFS), 중복 제거된 파일, 압축 파일, 상주 파일, 스파스 파일 또는 TxF 트랜잭션에 참여하는 파일로 암호화된 파일에서 수행되는 오프로드 FSCTL을 지원하지 않습니다.
- NTFS는 volsnap 스냅샷 내의 파일에서 수행되는 오프로드 FSCTL을 지원하지 않습니다.
- 다음 조건 중 하나가 true이면 NTFS가 FSCTL 오프로드에 실패합니다. 이 방법은 캐시되지 않은 IO와 동일한 의미 체계를 따릅니다.
- 원하는 파일 범위는 원본 디바이스의 논리 섹터 크기에 정렬되지 않습니다.
- 원하는 파일 범위는 대상 디바이스의 논리적 섹터 크기에 정렬되지 않습니다.
- SetEndOfFile 및 SetAllocation이 아닌 FSCTL_OFFLOAD_WRITE 전에 대상 파일을 미리 할당해야 합니다.
- NTFS는 오프로드 읽기 및 쓰기를 처리할 때 먼저 CcCoherencyFlushAndPurgeCache를 호출하여 시스템 캐시에서 수정된 데이터를 커밋합니다. 이 작업은 캐시되지 않은 IO와 동일한 의미 체계입니다.