Part 4: DPAS 소개

Dynamic PAS — 런타임 모드 전환으로 다양한 부하에 대응

2026-1 시스템최신기술
← 전체 실습 안내로 돌아가기 English

1. PAS의 한계: 단일 모드

PAS는 매 I/O마다 sleep duration을 adaptive하게 조정하는 효과적인 기법이지만, 항상 "sleep + poll" 패턴만 사용합니다. 그런데 실제 시스템에서는 이 패턴이 최적이 아닌 상황이 존재합니다:

QD = 1 (단일 I/O, 낮은 부하)

Queue depth가 1이면 한 번에 하나의 I/O만 처리합니다. 이때 PAS의 sleep 시간이 디바이스 처리 시간보다 짧으면 깨어난 후 잠깐의 busy-wait(polling)만으로 완료를 감지합니다. → PAS가 잘 동작합니다.

QD > 1 (동시 I/O, 높은 부하)

여러 I/O가 동시에 진행되면 디바이스의 실효 지연시간이 길어지고, polling의 CPU 비용도 증가합니다. 이때는:

Timer Floor 도달

PAS의 sleep duration은 d_init(최소값)보다 작아질 수 없습니다. 디바이스가 매우 빨라서 PAS의 sleep이 계속 이 하한에 도달하면, "이미 충분히 짧은데도 oversleep" 하는 상황이 반복됩니다. 이는 sleep이 근본적으로 불필요한 상황 — 즉 Classic Polling이 적절한 신호입니다.

단일 모드의 근본적 한계 PAS는 I/O 지연시간이 안정적이고 QD=1인 환경에 최적화되어 있습니다. 하지만 실제 시스템에서는 부하가 동적으로 변하므로, 하나의 completion 기법만으로는 모든 상황에 대응할 수 없습니다. → DPAS는 런타임에 상황을 판단하여 최적의 모드를 자동 선택합니다.

2. DPAS 상태 머신

DPAS (Dynamic PAS)는 4개의 모드를 상태 머신으로 관리합니다. 매 Neval = 100 I/O마다 관측된 Queue Depth(QD)와 Timer Floor(tf) 횟수를 평가하여 모드를 전환합니다.

CP Polling PAS Sleep+Poll OL Overloaded INT Interrupt 초기 모드 cp_cnt ≥ 1000 param4≥1 && avg_qd = 1.0 tf > param1 avg_qd ≤ param2 avg_qd > param3 int_cnt ≥ 10000 전환 조건 부하 증가 방향 부하 감소 방향 재평가 (INT→OL) 초기 전환 (CP→PAS)

4가지 모드

모드번호동작적합한 상황
PAS2 adaptive sleep + poll (기본 모드) QD=1, 안정적인 I/O latency
CP1 classic polling (busy-wait) QD=1이면서 디바이스가 매우 빠름
OL3 overload 상태 — QD를 평가하여 PAS 또는 INT로 분기 PAS의 timer가 바닥에 도달하는 과도기
INT0 interrupt 기반 (sleep + interrupt wake) QD가 매우 높아 polling이 비효율적

전환 조건 상세

전환조건해석
PAS → CP avg_QD = 1 && param4 ≥ 1 부하가 낮고(QD=1) PAS가 유지되지만, CP로 전환하면 sleep 오버헤드 제거 가능
PAS → OL tf > param1 Timer floor 초과 — sleep이 계속 최소값에 도달하여 사실상 의미 없음
CP → PAS 1000 I/O 후 CP에서 일정 기간 후 PAS로 복귀하여 재평가
OL → PAS avg_QD ≤ param2 부하가 다시 낮아짐 → PAS가 적절
OL → INT avg_QD > param3 부하가 매우 높음 → polling 포기, interrupt 사용
평가 주기 모든 전환 판단은 Neval = 100 I/O (PAS, OL) 또는 1000 I/O (CP) 단위로 이루어집니다. 이 기간 동안 QD 합산(qd_sum)과 timer floor 횟수(tf)를 누적한 후 평균으로 판단합니다.

3. 핵심 지표: QD와 Timer Floor

Queue Depth (QD)

특정 시점에 디바이스에 제출되었지만 아직 완료되지 않은 I/O 요청의 수입니다. DPAS는 평가 기간(100 I/O) 동안의 평균 QD를 10배 스케일(qd_sum × 10 / count)로 추적합니다.

Timer Floor (tf)

PAS의 sleep duration이 최소값(d_init)에 도달한 횟수입니다.

// 커널 코드 (blk-mq.c)
dur = dur * adj / div;
if (dur < d_init) {
    dur = d_init;       // 하한 클램프
    sc->tf++;           // timer floor 카운터 증가
}

tf가 높다는 것은 PAS가 sleep을 줄이려 해도 이미 바닥이라는 뜻입니다. 이 상태가 지속되면(tf > param1) PAS가 더 이상 유효하지 않다고 판단하고 OL로 전환합니다.

param1 = 0의 의미 기본값 param1 = 0은 timer floor가 한 번이라도 발생하면 즉시 OL로 전환한다는 뜻입니다. 이 값을 높이면 PAS가 timer floor 상태를 더 오래 허용합니다.

4. sysfs 파라미터

DPAS의 전환 기준은 sysfs를 통해 런타임에 조정할 수 있습니다. 커널 실습에서 이 파라미터를 변경하며 동작을 관찰합니다.

파라미터기본값역할
switch_param1 0 PAS → OL 전환 임계값: tf > param1이면 OL로 전환
switch_param2 10 OL → PAS 전환 기준: avg_QD ≤ param2이면 PAS로 복귀
switch_param3 10 OL → INT 전환 기준: avg_QD > param3이면 INT로 전환
switch_param4 1 PAS ↔ CP 전환 활성화: 1이면 활성화, 0이면 비활성화
# sysfs 경로 (QEMU 실습)
/sys/block/nvme0n1/queue/switch_param1
/sys/block/nvme0n1/queue/switch_param2
/sys/block/nvme0n1/queue/switch_param3
/sys/block/nvme0n1/queue/switch_param4

# 모드별 I/O 통계 확인
cat /sys/block/nvme0n1/queue/switch_stat
# → CPU[ 0] MODE[2] QD[ 1] param1: 0 param2: 10 param3: 10 polled io: 42 pas io: 958 ...
switch_stat 읽는 법
  • MODE[0]=INT, MODE[1]=CP, MODE[2]=PAS, MODE[3]=OL
  • polled io: CP 모드에서 처리한 I/O 수
  • pas io: PAS 모드에서 처리한 I/O 수
  • ol io: OL 모드에서 처리한 I/O 수
  • int io: INT 모드에서 처리한 I/O 수

5. PAS vs DPAS: 정리

PASDPAS
모드 adaptive sleep + poll (단일) PAS / CP / INT 자동 전환
QD 대응 QD 변화에 대응 못함 QD에 따라 모드 전환
고부하 대응 과도한 polling으로 CPU 낭비 가능 OL → INT 전환으로 CPU 보호
초저지연 대응 timer floor에서 oversleep 반복 PAS → CP 전환으로 sleep 오버헤드 제거
적용 범위 단일 워크로드 multi-tenant, 동적 워크로드

다음 단계

DPAS의 설계를 이해했다면, QEMU 가상 머신에서 직접 커널을 설치하고 성능을 비교해 보세요.

DPAS 커널 실습으로 이동 → QEMU VM에서 INT/CP/PAS/DPAS 4가지 모드의 성능을 벤치마크합니다

논문 원문: DPAS: A Prompt, Accurate and Safe I/O Completion Method for SSDs (USENIX FAST '26, Seo et al.)