5장. LVM-VDO 성능 최적화
VDO 커널 드라이버는 여러 스레드를 사용하여 작업을 가속화합니다. 하나의 스레드가 I/O 요청을 위해 모든 작업을 수행하는 대신 작업을 다른 스레드에 할당된 작은 부분으로 분할합니다. 이러한 스레드는 요청을 처리할 때 서로 통신합니다. 이렇게 하면 하나의 스레드가 일정한 잠금 및 잠금 해제 없이 공유 데이터를 처리할 수 있습니다.
하나의 스레드가 작업을 완료하면 VDO에는 이미 다른 작업이 준비됩니다. 이렇게 하면 스레드가 바빠지고 작업을 전환하는 데 소요되는 시간이 줄어듭니다. VDO는 또한 큐에 I/O 작업 추가 또는 중복 제거 인덱스에 메시지를 처리하는 등 느린 작업에 별도의 스레드를 사용합니다.
5.1. VDO 스레드 유형
VDO는 다양한 스레드 유형을 사용하여 특정 작업을 처리합니다.
- 논리 영역 스레드 (
vdo:logQ
) - 기본 스토리지 시스템에서 VDO 장치의 사용자에게 제공되는LBN(Logical block numbers)과 물리적 블록 번호(PBN) 간의 매핑을 유지 관리합니다. 또한 동일한 블록에 대한 동시 쓰기를 방지합니다. 논리 스레드는 읽기 및 쓰기 작업 둘 다에서 활성화됩니다. 일반적으로 처리는 균등하게 분배되지만 특정 액세스 패턴은 때때로 하나의 스레드에서 작업을 집중시킬 수 있습니다. 예를 들어 특정 블록 맵 페이지에서 LBN에 자주 액세스하는 경우 하나의 논리 스레드가 이러한 모든 작업을 처리할 수 있습니다.
- 물리 영역 스레드 (
vdo:physQ
) - 쓰기 작업 중 데이터 블록 할당 및 참조 수를 처리합니다.
- I/O 제출 스레드(
vdo:bioQ
) -
VDO에서 스토리지 시스템으로 블록 I/O(
bio
) 작업 전송을 처리합니다. 다른 VDO 스레드의 I/O 요청을 처리하고 기본 장치 드라이버에 전달합니다. 이러한 스레드는 장치 관련 데이터 구조와 상호 작용하고, 장치 드라이버 커널 스레드에 대한 요청을 생성하며 전체 장치 요청 큐로 인해 I/O 요청이 차단될 때 지연을 방지합니다. - CPU 처리 스레드 (
vdo:cpuQ
) - 다른 스레드 유형에서 관리하는 데이터 구조에 대한 배타적 액세스 권한을 차단하거나 필요로 하지 않는 CPU 집약적인 작업을 처리합니다. 이러한 작업에는 해시 값 계산 및 데이터 블록 압축이 포함됩니다.
- I/O 승인 스레드(
vdo:ackQ
) - 직접 I/O를 수행하는 커널 페이지 캐시 또는 애플리케이션 스레드와 같은 상위 수준 구성 요소에 대한 I/O 요청 완료 신호를 보냅니다. 해당 CPU 사용량과 메모리 경합에 미치는 영향은 커널 수준 코드의 영향을 받습니다.
- 해시 영역 스레드 (
vdo:hashQ)
- 잠재적인 중복 제거 작업을 처리하기 위해 일치하는 해시로 I/O 요청을 조정합니다. 중복 제거 요청을 생성 및 관리하더라도 상당한 계산을 수행하지 않습니다. 일반적으로 단일 해시 영역 스레드로 충분합니다.
- 중복 제거 스레드(
vdo:dupeQ
) - I/O 요청을 처리하고 중복 제거 인덱스와 통신합니다. 이 작업은 차단을 방지하기 위해 별도의 스레드에서 수행됩니다. 또한 인덱스가 빠르게 응답하지 않는 경우 중복 제거를 생략하는 시간 초과 메커니즘이 있습니다. VDO 장치당 중복 제거 스레드가 하나만 있습니다.
- 저널 스레드(
vdo:journalQ
) - 복구 저널을 업데이트하고 쓰기를 위해 저널 블록을 예약합니다. 이 작업은 여러 스레드로 나눌 수 없습니다. VDO 장치당 저널 스레드가 하나만 있습니다.
- Packer 스레드 (
vdo:packerQ
) - 압축이 활성화된 경우 쓰기 작업 중에 작동합니다. CPU 스레드에서 압축 데이터 블록을 수집하여 낭비되는 공간을 줄입니다. VDO 장치당 하나의 팩터 스레드만 있습니다.