Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

30.6.2. VDO 아키텍처 배경 정보

VDO 커널 드라이버는 여러 동시 I/O 요청에 걸쳐 처리 비용을 소진하여 성능을 향상시키는 다중 스레드입니다. 하나의 스레드가 처음부터 끝까지 I/O 요청을 처리하는 대신, I/O 요청 사이에 전달되는 메시지가 파이프라인을 통해 해당 요청을 통해 전달되는 메시지와 함께 작업 단계를 하나 이상의 스레드 또는 스레드 그룹에 위임합니다. 이렇게 하면 하나의 스레드가 I/O 작업이 처리될 때마다 잠금 및 잠금 해제 없이 글로벌 데이터 구조에 모든 액세스를 직렬화할 수 있습니다. VDO 드라이버가 잘 조정된 경우 스레드가 요청된 처리 단계를 완료할 때마다 일반적으로 동일한 처리를 위해 다른 요청이 대기열에 추가됩니다. 이러한 스레드를 바쁘게 유지하면 컨텍스트 전환 및 스케줄링의 오버헤드가 줄어들어 성능이 향상됩니다. 개별 스레드는 기본 스토리지 시스템 또는 UDS에 대한 I/O 작업 대기열과 같이 차단할 수 있는 운영 체제의 일부에도 사용됩니다.
VDO에서 사용하는 다양한 작업자 스레드 유형은 다음과 같습니다.
논리 영역 스레드
문자열 kvdo:logQ 를 포함한 프로세스 이름이 있는 논리 스레드는 VDO 장치의 사용자에게 제공되는 LBN(Logical Block Number)과 기본 스토리지 시스템의 물리적 블록 번호(PBN) 간의 매핑을 유지합니다. 또한 동일한 블록에 쓰기 위해 두 개의 I/O 작업이 동시에 처리되지 않도록 잠금을 구현합니다. 논리 영역 스레드는 읽기 및 쓰기 작업 중 활성화되어 있습니다.
LBN은 청크로 나뉩니다( 블록 맵 페이지에는 3MB 이상의 LBN이 포함되어 있으며 이러한 청크는 스레드 간에 분할되는 영역으로 그룹화됩니다.
처리는 스레드 전반에 걸쳐 상당히 균등하게 배포되어야 하지만 일부 의도하지 않은 액세스 패턴은 때때로 하나의 스레드에서 또는 다른 스레드에서 작동하는 데 집중할 수 있습니다. 예를 들어, 지정된 블록 맵 페이지 내에서 LBN에 자주 액세스하는 경우 논리 스레드 중 하나가 이러한 모든 작업을 처리합니다.
logical zone 스레드 수를 통해 organization's command의 --vdoLogicalThreads=thread count 옵션을 사용하여 제어할 수 있습니다.
물리적 영역 스레드
물리적, 또는 kvdo:physQ, 스레드는 데이터 블록 할당을 관리하고 참조 개수를 유지 관리합니다. 쓰기 작업 중에 활성화됩니다.
LBN과 마찬가지로 PBN은 slabs 라는 청크로 나뉘며, 이는 추가로 영역으로 나뉘어 처리 부하를 분산하는 작업자 스레드에 할당됩니다.
physical zone 스레드의 수는 organization 명령의 --vdoPhysicalThreads=thread count 옵션을 사용하여 제어할 있습니다.
I/O 제출 스레드
kvdo:bioQ 스레드는 VDO에서 스토리지 시스템으로 블록 I/O(bio) 작업을 제출합니다. 다른 VDO 스레드에 의해 큐잉된 I/O 요청을 가져와서 기본 장치 드라이버에 전달합니다. 이러한 스레드는 장치와 관련된 데이터 구조와 통신하거나 장치 드라이버의 커널 스레드를 처리할 요청을 설정할 수 있습니다. 기본 장치의 요청 대기열이 가득 차면 I/O 요청을 제출할 수 있으므로 이 작업은 처리 지연을 방지하기 위해 전용 스레드에 의해 수행됩니다.
이러한 스레드가 ps 또는 top 유틸리티로 D 상태에 자주 표시되는 경우 VDO는 스토리지 시스템을 I/O 요청과 함께 사용량에 따라 자주 유지합니다. 일부 SSD는 또는 요청 처리가 파이프라인될 수 있으므로 스토리지 시스템이 병렬로 여러 요청을 처리할 수 있는 경우 유용합니다. 이러한 기간 동안 스레드 CPU 사용률이 매우 낮으면 I/O 제출 스레드 수를 줄일 수 있습니다.
CPU 사용량 및 메모리 경합은 VDO 아래의 장치 드라이버에 따라 다릅니다. 더 많은 스레드가 추가될 때 I/O 요청당 CPU 사용률이 증가하면 해당 장치 드라이버에서 CPU, 메모리 또는 잠금 경합이 있는지 확인합니다.
EgressIP 명령의 --vdoBioThreads=thread count 옵션을 사용하여 I/O 제출 스레드 수를 제어할 있습니다.
CPU 처리 스레드
kvdo:cpuQ 스레드는 컴퓨팅 해시 값과 같은 CPU 집약적인 작업을 수행하거나 차단되지 않거나 다른 스레드 유형과 관련된 데이터 구조에 대한 배타적 액세스 권한이 필요한 데이터 블록을 수행하기 위해 존재합니다.
maintains 명령의 --vdoCpuThreads=thread count 옵션을 사용하여 CPU 처리 스레드 수를 제어할 있습니다.
I/O 승인 스레드
kvdo:ackQ 스레드는 I/O 요청의 완료를 보고하도록 atop VDO(예: 커널 페이지 캐시 또는 애플리케이션 프로그램 스레드)가 있는 모든 항목에 콜백을 발행합니다. CPU 시간 요구 사항 및 메모리 경합은 이 다른 커널 수준 코드에 따라 달라집니다.
acknowledgement 스레드 수는 EgressIP 명령의 --vdoAckThreads=thread count 옵션을 사용하여 제어할 수 있습니다.
스케일링할 수 없는 VDO 커널 스레드:
중복 스레드
kvdo:dedupeQ 스레드는 대기 중인 I/O 요청과 UDS 연락처를 사용합니다. 서버가 충분히 빠르게 요청을 처리할 수 없거나 커널 메모리가 다른 시스템 활동에 의해 제한되는 경우 소켓 버퍼를 채울 수 있으므로 이 작업은 별도의 스레드에 의해 수행되므로 스레드가 차단해야 하는 경우 다른 VDO 처리가 계속될 수 있습니다. 지연 후(초) 후에 I/O 요청을 건너뛰는 시간 초과 메커니즘도 있습니다.
journal 스레드
kvdo:journalQ 스레드는 복구 저널을 업데이트하고 쓰기를 위해 저널 블록을 예약합니다. VDO 장치는 한 개의 저널만 사용하므로 이 작업은 스레드 간에 분할할 수 없습니다.
Packer 스레드
kvdo:packerQ 스레드는 압축이 활성화될 때 쓰기 경로에서 활성화되며, 낭비된 공간을 최소화하기 위해 kvdo:cpuQ 스레드에 의해 압축된 데이터 블록을 수집합니다. 하나의 패더 데이터 구조가 있어서 VDO 장치당 하나의 패더 스레드가 있습니다.