커널 필터 드라이버
개요
FSR 은 파일수준의 복제를 구현합니다. 파일을 복제하는 환경은 볼륨의 데이터가 파일 시스템에 의해 형식화 된 파일과 경로를 통해 관리 됨을 전제합니다. FSR 은 파일시스템 계층 상부에 커널 필터 모듈을 삽입하여 볼륨으로 유입되는 모든 쓰기 I/O 에 대해 조사하고 해당 I/O 가 복제할 대상인지 식별합니다. 여기서 커널 필터 드라이버 내의 복제 대상을 식별하기 위한 파일 경로 필터링 로직을 경로필터(path filter)라고 합니다. 경로필터는 FSR로 유입된 쓰기 I/O 의 목적지 경로가 복제 대상인지를 판단하여 I/O 를 버퍼링을 하거나 아니면 하부 계층으로 bypass 합니다. 쓰기 I/O 를 버퍼링 한다면 드라이버는 I/O 데이터를 공유된 메모리 영역 또는 파일을 통해 FSR Syncer 엔진 측으로 전달합니다. 이후 데이터를 타깃으로 송신하여 전달하는 것은 Syncer 엔진이 담당합니다.
이 과정에서 주요한 요소로 동작하는 경로필터, 공유버퍼 등에 대해 설명합니다.
경로 필터
경로필터는 리소스에 지정된 복제대상 경로들을 목록화하고 검색할 수 있도록 하는 구성요소 입니다. 경로필터는 로컬의 실시간 I/O 문맥에서 수행되기 때문에 경로필터 내의 검색시간이 로컬 I/O 지연시간에 크게 영향을 줍니다. 경로필터의 내부 구조는 이진트리를 기본으로 하여 최적화되어 있지만 기본적으로 목록화 해야할 대상 경로가 많아질 수록 검색비용이 증가하는 것은 불가피 합니다. 또한 복제해야 할 리소스 개수가 많아질 수록 리소스 별 경로필터 검색을 모두 수행해야 하기 때문에 지연시간에 영향을 주는 요소가 됩니다. 따라서 로컬의 성능을 위해서는 복제 대상 구성 단계에서 경로필터의 대상 요소들을 최소화하여 구성하는게 바람직합니다. 너무 복잡한 복제 경로 설정은 성능에 불리하게 작용합니다.
파일 스트림 문맥
표준 파일 입출력에는 파일 열기,읽기, 쓰기, 삭제, 조회, 설정, 닫기 등의 연산 동작이 있습니다. 각각의 연산이 수행될 때 마다 FSR 은 I/O 를 조사하고 각각의 연산에 맞는 동작을 취해야 하는데 만약 그 때 마다 I/O의 유형과 관련 정보를 로컬 I/O 문맥에서 지속적으로 조회해야 한다면 상당한 수준의 부하와 병목의 요인이 될 수 있습니다. FSR 은 이를 위해 파일 스트림 당 문맥 정보를 할당하여 파일의 경로와 기타 관련 정보들을 캐쉬로 보관하고 필요할 때마다 이를 참조하여 동작합니다.
공유 버퍼
메모리 버퍼
파일 I/O 데이터는 버퍼링을 위해 먼저 메모리 버퍼로 복사 됩니다. 메모리 버퍼는 사용자에 의해 크기가 지정될 수 있으며 보통 수백 MB에서 수 GB 수준으로 설정됩니다. 보통의 운영상황에서는 메모리 버퍼의 복제 데이터는 큐잉 되는 즉시 타깃으로 바로 전송되기 때문에 버퍼의 사용량이 늘어나지 않고 일정 수준으로 유지됩니다. 만약 전송 계층의 대역폭이 충분하지 않거나 병목으로 인해 전송지연이 발생한다면 복제 데이터가 메모리 버퍼에서 디큐잉 되는 속도가 떨어져서 버퍼의 사용량은 점차 증가하고 결국 버퍼가 넘치게 됩니다. FSR 엔진이 버퍼 혼잡을 인지하면 복제 상태를 더 이상 유지할 수 없으며 재동기화 상태로 전환합니다.
파일 버퍼
메모리 버퍼와 더불어 파일버퍼가 구성되어 있다면 메모리 버퍼 넘침 시 파일로 이어서 버퍼링을 수행합니다. 즉 버퍼링을 메모리 버퍼와 파일 버퍼로 혼합하여 수행하게 됩니다. 파일버퍼는 디스크 공간이 허용하는 한도 내에서 용량을 확보할 수 있기 때문에 메모리 버퍼에 비해 상대적으로 더 큰 대용량 버퍼로 운영할 수 있어서 운영 측면의 이점이 있습니다. 그러나 파일버퍼는 메모리 버퍼 대비 지연(파일 I/O로 인한)이 크기 때문에 파일버퍼링을 수행하는 시점의 로컬 I/O의 성능이 저하되는 것은 감안하고 사용해야 합니다. 파일버퍼링을 할 경우 원본 I/O와 버퍼링용 I/O를 이중으로 수행하기 때문에 통상 기존 대비 2배의 성능저하가 발생할 수 있습니다.