Dynamic PAS — 런타임 모드 전환으로 다양한 부하에 대응
2026-1 시스템최신기술PAS는 매 I/O마다 sleep duration을 adaptive하게 조정하는 효과적인 기법이지만, 항상 "sleep + poll" 패턴만 사용합니다. 그런데 실제 시스템에서는 이 패턴이 최적이 아닌 상황이 존재합니다:
Queue depth가 1이면 한 번에 하나의 I/O만 처리합니다. 이때 PAS의 sleep 시간이 디바이스 처리 시간보다 짧으면 깨어난 후 잠깐의 busy-wait(polling)만으로 완료를 감지합니다. → PAS가 잘 동작합니다.
여러 I/O가 동시에 진행되면 디바이스의 실효 지연시간이 길어지고, polling의 CPU 비용도 증가합니다. 이때는:
PAS의 sleep duration은 d_init(최소값)보다 작아질 수 없습니다.
디바이스가 매우 빨라서 PAS의 sleep이 계속 이 하한에 도달하면,
"이미 충분히 짧은데도 oversleep" 하는 상황이 반복됩니다.
이는 sleep이 근본적으로 불필요한 상황 — 즉 Classic Polling이 적절한 신호입니다.
DPAS (Dynamic PAS)는 4개의 모드를 상태 머신으로 관리합니다. 매 Neval = 100 I/O마다 관측된 Queue Depth(QD)와 Timer Floor(tf) 횟수를 평가하여 모드를 전환합니다.
| 모드 | 번호 | 동작 | 적합한 상황 |
|---|---|---|---|
| PAS | 2 | adaptive sleep + poll (기본 모드) | QD=1, 안정적인 I/O latency |
| CP | 1 | classic polling (busy-wait) | QD=1이면서 디바이스가 매우 빠름 |
| OL | 3 | overload 상태 — QD를 평가하여 PAS 또는 INT로 분기 | PAS의 timer가 바닥에 도달하는 과도기 |
| INT | 0 | 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 사용 |
qd_sum)과 timer floor 횟수(tf)를 누적한 후 평균으로 판단합니다.
특정 시점에 디바이스에 제출되었지만 아직 완료되지 않은 I/O 요청의 수입니다.
DPAS는 평가 기간(100 I/O) 동안의 평균 QD를 10배 스케일(qd_sum × 10 / count)로 추적합니다.
avg_QD = 10 → 실제 QD ≈ 1 (단일 I/O 수준)avg_QD > 10 → 동시에 여러 I/O가 처리 중 (높은 부하)
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은 timer floor가 한 번이라도 발생하면 즉시 OL로 전환한다는 뜻입니다.
이 값을 높이면 PAS가 timer floor 상태를 더 오래 허용합니다.
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 ...
MODE[0]=INT, MODE[1]=CP, MODE[2]=PAS, MODE[3]=OLpolled io: CP 모드에서 처리한 I/O 수pas io: PAS 모드에서 처리한 I/O 수ol io: OL 모드에서 처리한 I/O 수int io: INT 모드에서 처리한 I/O 수| PAS | DPAS | |
|---|---|---|
| 모드 | 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.)