본문으로 건너뛰기

FDP PoC Harness 평가 시나리오

작성일: 2026-06-15

목적

이 문서는 원문 PoC HTML, PoC harness README, 현재 코드 구현을 기준으로 FDP WAF 평가를 어떻게 실행할지 정리한다.

기준 우선순위는 다음과 같이 둔다.

우선순위기준 문서이 문서에서의 역할
1fdp/FDP_for_LMCache_Poc.html평가 목적과 필수 해석 기준. WAF/endurance/p99 개선, lifetime 분리, clean-state 회피와 preconditioning 필요성
2LMCache-fdp-poc-src/benchmarks/fdp_waf_stress/README.mdPoC harness 실행 방식. stress, warmup=2, measurement=8, no_fdp/mixed/separated 비교
3현재 smrc 코드/스크립트target 장비의 RUH 수, OCP media counter, 8-RUH remapping, 결과 파서/보고서 생성
4현재까지의 probe 결과실행 가능성, WAF counter 동작 여부, counter settle 필요성 확인

목표는 tensormesh 통합 전 단계에서 PoC 자체 storage replay harness로 다음을 확인하는 것이다.

  • FDP raw-block write path가 실제 SSD write를 발생시키는지
  • vendor media-write counter를 이용해 정식 WAF를 산출할 수 있는지
  • no_fdp, separated, mixed 세 모드의 WAF/host write/p99를 같은 조건에서 비교할 수 있는지
  • 이후 tensormesh 평가로 넘어갈 만한 신호가 있는지

원문 PoC 기준

원문 PoC HTML의 핵심 가설:

KV cache stream을 lifetime이 비슷한 placement group으로 분리하면
SSD 내부 GC 시 불필요한 copy가 줄어 WAF와 NAND wear가 감소하고,
p99 같은 tail latency도 안정될 수 있다.

원문 HTML이 명시한 평가 고려사항:

Starting from a clean state may make WAF difficult to observe.
Preconditioning to a sustained state should be considered before WAF evaluation.

여기서 원문이 직접 말한 것은 sustained state preconditioning을 고려해야 한다는 것이다. 원문은 full-device write량, fill 비율, 반복 횟수 같은 구체 숫자를 지정하지 않았다.

따라서 원문 기준의 평가 우선순위는 README 예시값보다 먼저 아래 조건을 만족하는 것이다.

원문 기준평가 반영
lifetime이 다른 KV stream 분리separated mode에서 hot/cold/metadata workload를 다른 RUH로 배치
WAF와 endurance 개선host write와 vendor media write counter로 정식 WAF 산출
p99 tail latency 안정화records.jsonl 기반 write/read p99 산출
clean-state에서는 WAF 관측이 어려울 수 있음R0 precondition 여부와 span을 결과표에 명시
sustained-state preconditioning 고려최소 window-local R0, 최종 주장에는 확장 R0 또는 full-span R0 필요

따라서 현재 시나리오는 두 단계로 나눈다.

단계목적주장 가능한 범위
1차 window-local R0PoC harness 정식 WAF 산출과 mode 비교 가능성 확인harness measurement window 기준 WAF 비교
확장 R0더 큰 span 또는 full-span preconditioning으로 SSD-level sustained state에 가까운 결과 확보더 강한 WAF 평가 근거

PoC Harness 기준

PoC README의 harness 의도:

  • 여러 LMCache storage trace replay를 raw-block NVMe namespace에 동시에 수행
  • cache-like churn을 만들어 SSD GC pressure를 관찰하기 쉽게 함
  • no_fdp, mixed, separated 세 모드를 비교
  • vendor media/NAND write counter가 설정되면 summary.jsonmedia_write_bytes_deltawaf를 산출

PoC harness README의 3모드 비교 예시는 다음 측정 조건을 사용한다.

항목README 기준값의미
--warmup-iterations2측정 전 동일 trace replay를 2회 수행하고, 이 구간은 WAF 계산에서 제외
--iterations8warmup 이후 측정 대상 replay를 8회 수행
--scalestressWAF/GC pressure 관찰용 synthetic trace scale

따라서 팀 공유용 1차 정식 결과는 warmup=2, measurement=8, TRACE_SCALE=stress를 기준으로 한다. 기존 warmup=0, measurement=1 실행은 smoke/debug 결과로만 분리한다.

모드 의미:

Mode의미평가 목적
no_fdpFDP placement hint 없음baseline
mixedFDP on, 여러 workload가 같은 RUH pool 공유FDP on이지만 분리 정책 없음
separatedworkload class별 data/metadata RUH 분리lifetime 분리 효과 확인

현재 harness의 placement 기준

현재 PoC harness는 원문 PoC의 per-prompt, phase-aware, per-vLLM worker 중 하나를 그대로 구현한 형태가 아니다. 실제 구현은 workload class 기반 RUH 분리다.

즉 prompt id, prefill/decode phase, vLLM worker/rank 번호를 직접 보지 않는다. Synthetic trace/config에 부여된 workload class를 lifetime proxy로 보고 RUH를 배정한다.

원문 시나리오와 현재 harness의 대응 관계:

원문 placement 시나리오현재 harness 해당 여부이유
Per-Prompt Data Placement아님prompt_id % num_placement_handles 같은 prompt id 기반 매핑이 없다
Phase-aware Data Placement부분적으로 가까움prefill/decode phase는 보지 않지만, hot/cold/metadata/large/small workload class를 lifetime proxy로 분리한다
Per-vLLM Worker Data Placement아님worker0→RUH0, worker1→RUH1 같은 rank/worker별 고정 분리가 아니다

현재 8-RUH target에서 mixedseparated의 실제 RUH 구성:

Workload의미Classseparated data RUHseparated metadata RUH
llama8b_chat_chunk256small/chat 계열, churn 큼hot_churn 또는 small_model 계열[0,1][2]
random_prompts_chunk128random prompt, low reuse/churnhot_churn 계열[0,1][2]
llama70b_longctx_chunk1024large model / long contextlarge_model[3,4][5]
rag_shared_prefix_chunk512RAG/shared-prefix, reuse 가능성 높음cold_rag[3,4][5]
metadata_heavy_small_objectsmetadata/small object가 많음metadata_heavy[6][7]

Mode별 배치 의미:

Mode기준RUH 배정 의미
no_fdpFDP offRUH hint 없음
mixed모든 workload를 같은 pool에 섞음data [0,1,3,4,6,7], metadata [2,5]를 모두 공유
separatedworkload class별 분리hot/small/random, cold/RAG/large, metadata-heavy를 서로 다른 RUH 그룹으로 분리

그림처럼 보면:

mixed
모든 workload
-> data RUH [0,1,3,4,6,7]
-> metadata RUH [2,5]

separated
hot/small/random
-> data RUH [0,1]
-> metadata RUH [2]

cold/RAG/large
-> data RUH [3,4]
-> metadata RUH [5]

metadata-heavy
-> data RUH [6]
-> metadata RUH [7]

따라서 mixed vs separated 비교는 "FDP를 켰을 때 그냥 섞는 것"과 "lifetime이 비슷하다고 가정한 workload class끼리 분리하는 것"의 차이를 보는 실험이다. 현재 harness가 검증하는 것은 per-prompt나 per-vLLM-worker 정책이 아니라 class/lifetime-aware placement 정책이다.

비교 기준:

  • no_fdp vs separated: FDP 분리 정책의 메인 효과
  • separated vs mixed: 효과 원천이 FDP 자체인지, lifetime/RUH 분리인지 확인

현재 코드 기반 확인

현재 stress trace 기준 harness가 잡는 raw-device worker capacity는 총 약 9.5 GiB다.

WorkloadConcurrencyworker capacitytotal capacity
llama8b_chat_chunk25621GiB2GiB
llama70b_longctx_chunk102412GiB2GiB
rag_shared_prefix_chunk51221GiB2GiB
random_prompts_chunk12831GiB3GiB
metadata_heavy_small_objects10.5GiB0.5GiB
합계9 workers9.5GiB

stress trace의 estimated store demand는 약 48 GiB다.

Workloadestimated store bytes
llama8b_chat_chunk25610GiB
llama70b_longctx_chunk102410GiB
rag_shared_prefix_chunk51212GiB
random_prompts_chunk1288GiB
metadata_heavy_small_objects8GiB
합계약 48GiB

따라서 현재 stress 설정은:

raw window capacity: 약 9.5GiB
measurement store demand: 약 48GiB

즉 harness는 window보다 큰 write demand를 만들어 churn이 생기도록 설계되어 있다.

Test Environment

Full audit: 02_smrc_env/smrc_env_report.md

ItemValue
SSDSamsung PM9D3 (MZOL63T8HDLT-00AFB, SN: S77UNG0TC00101)
Controller / Namespace/dev/nvme0 / /dev/nvme0n1 (/dev/ng0n1 for io_uring_cmd)
Capacity3.76 TB (3,760,740,458,496 bytes)
LBA format4 KiB
FDP endurance group1
RUH count8 (0..7, Initially Isolated)
nvme-cli2.15 (libnvme 1.15)
OS / kernelLinux 6.17.0 (dsksh805, x86_64)

Vendor WAF Counter

정식 WAF 계산식:

WAF = media_write_bytes_delta / host_write_bytes_delta

현재 target SSD에서는 OCP SMART log가 media-write counter를 제공한다.

사용 command:

nvme ocp smart-add-log /dev/nvme0n1 -o json

확인된 field:

"Physical media units written": {
"hi": 0,
"lo": 2114796921614336
}

LMCache-fdp-poc-src/benchmarks/fdp_waf_stress/run_fdp_waf_stress.py는 이 OCP JSON/text 형식을 파싱하도록 보정되어 있다.

선택한 1차 평가 시나리오

현재 1차 평가는 원문 기준을 우선하여 window-local R0 precondition을 먼저 적용하고, 실행 파라미터는 README 예시값인 warmup 2회 + measurement 8회를 사용한다.

이유:

  • harness가 실제 쓰는 raw-device capacity는 약 9.5GiB
  • 기본 PRECONDITION_SIZE_GB=32는 이 window를 약 3.4배 덮는다
  • clean window 상태를 피하고, 측정 대상 span에 sequential fill + random overwrite를 넣을 수 있다
  • PoC README의 3모드 비교 예시값인 --warmup-iterations 2 --iterations 8을 그대로 반영한다
  • full-device precondition보다 시간이 짧아 PoC harness 자체의 1차 WAF 비교에 적합하다

단, 이 결과는 다음처럼 표현해야 한다.

원문 기준 window-local preconditioned PoC WAF result

아래처럼 표현하면 안 된다.

full-device sustained-state WAF result

정식 실행 순서

각 mode 전에 R0를 수행한다.

R0 window-local precondition
→ R1 no_fdp
→ R0 window-local precondition
→ R2 mixed
→ R0 window-local precondition
→ R3 separated
→ parse_results

세 mode는 같은 trace, 같은 raw window start offset, 같은 vendor counter, 같은 settle 설정을 사용한다.

정식 1차 조건:

항목
trace scalestress
warmup iterations2
measurement iterations8
R0 span32GiB
R0 offset2199023255552 bytes
mode window shiftdisabled
replay settle30s
post-measure settle360s

실행 명령

주의:

  • destructive command다.
  • /dev/nvme0n1 namespace를 blkdiscard한다.
  • 다른 benchmark/write workload와 동시에 실행하면 전역 SMART/OCP counter가 섞인다.
cd /home/ny/work/fdp/04_measure

for mode in no_fdp mixed separated; do
sudo env \
HOME=/home/ny \
NVME_DEV=/dev/nvme0 \
NVME_NS=/dev/nvme0n1 \
FDP_ENDGRP_ID=1 \
OUT=/home/ny/fdp_measure_waf_r0_window32g \
R0_CONFIRM=YES \
PRECONDITION_OFFSET_BYTES=2199023255552 \
PRECONDITION_SIZE_GB=32 \
PRECONDITION_RANDOM_OVERWRITE=1 \
PRECONDITION_RANDOM_PASSES=1 \
VENDOR_MEDIA_WRITE_COMMAND="nvme ocp smart-add-log /dev/nvme0n1 -o json" \
bash run_R0_precondition.sh

sudo env \
HOME=/home/ny \
REPO=/home/ny/work/LMCache-fdp-poc-src \
NVME_DEV=/dev/nvme0 \
NVME_NS=/dev/nvme0n1 \
NVME_IO_DEV=/dev/ng0n1 \
FDP_ENDGRP_ID=1 \
FDP_RUH_COUNT=8 \
TRACE_SCALE=stress \
WARMUP_ITERATIONS=2 \
MEASUREMENT_ITERATIONS=8 \
REPLAY_SETTLE_SECONDS=30 \
POST_MEASURE_SETTLE_SECONDS=360 \
VENDOR_MEDIA_WRITE_COMMAND="nvme ocp smart-add-log /dev/nvme0n1 -o json" \
DISABLE_MODE_WINDOW_SHIFT=1 \
WINDOW_START_OFFSET_BYTES=2199023255552 \
OUT=/home/ny/fdp_measure_waf_r0_window32g \
bash run_poc_harness.sh "$mode"
done

/usr/bin/python3 parse_results.py /home/ny/fdp_measure_waf_r0_window32g \
> /home/ny/fdp_measure_waf_r0_window32g/results_summary.csv

/usr/bin/python3 write_report.py /home/ny/fdp_measure_waf_r0_window32g \
> /home/ny/fdp_measure_waf_r0_window32g/report.md

빠른 smoke/debug만 필요할 때는 위 명령에서 아래 두 값만 낮춘다. 이 결과는 README 기준 정식 결과로 쓰지 않는다.

WARMUP_ITERATIONS=0
MEASUREMENT_ITERATIONS=1

유효성 판정 기준

각 mode가 아래 조건을 만족해야 한다.

조건기준
recordsmeasurement 구간 records가 0보다 크고 세 mode가 같은 조건에서 생성될 것
failures0
host_write_bytes_delta> 0
media_write_bytes_delta> 0
waf_statusavailable
fdp_hbmw_delta> 0

하나라도 실패하면 해당 mode는 invalid로 분리한다. 특히 host_write_bytes_delta=0이면 WAF 계산 대상이 아니다.

참고: results_summary.csvreport.md의 records/p99는 worker_logs/*/measurement_*/records.jsonl만 집계한다. warmup records는 WAF 계산과 동일하게 정식 결과에서 제외한다.

생성 산출물

README 기준 3모드 batch가 끝나면 아래 파일이 생성된다.

산출물위치의미
harness run summaryR_<mode>_*/summary.mdPoC harness가 mode별로 직접 생성하는 기본 summary
harness run JSONR_<mode>_*/summary.jsonWAF, host/media write delta, worker 결과의 machine-readable 원본
parsed CSVresults_summary.csvparse_results.py가 3모드 결과를 한 CSV로 집계
batch reportreport.mdwrite_report.py가 생성하는 팀 공유용 batch report

report.md에는 각 mode의 summary.md 링크가 포함된다. 따라서 공유 시에는 report.md를 진입점으로 두고, 세부 harness 원본은 링크된 R_<mode>_*/summary.md에서 확인한다.

결과 해석 지표

1차 PoC harness에서 볼 지표:

지표의미결론 방향
WAFmedia write / host write낮을수록 좋음
host write deltahost가 SSD에 요청한 write 총량낮을수록 write pressure 낮음
media write deltaOCP physical media written delta낮을수록 media write pressure 낮음
FDP HBMW/MBMW/MBEFDP stats 기반 host/media/erase proxy낮을수록 GC/erase pressure 낮음
write p99storage replay write tail latency낮을수록 좋음

이번 PoC harness에서는 TTFT와 실 workload hit ratio는 측정하지 않는다. 그 지표는 2차 tensormesh 통합 단계에서 측정한다.

확장 시나리오

32GiB window-local R0 결과가 유효하면 다음 단계는 precondition span을 키워 결과가 유지되는지 확인한다.

권장 순서:

단계R0 설정목적
APRECONDITION_SIZE_GB=32빠른 PoC WAF 검증
BPRECONDITION_SIZE_GB=256더 큰 local span에서 재현성 확인
CPRECONDITION_SIZE_GB=512device-level GC pressure에 더 가까운 결과 확인
DPRECONDITION_OFFSET_BYTES=0 PRECONDITION_SIZE_GB=auto원문 sustained-state 의도에 가장 가까운 full-span precondition

full-span R0 예:

sudo env \
HOME=/home/ny \
NVME_DEV=/dev/nvme0 \
NVME_NS=/dev/nvme0n1 \
FDP_ENDGRP_ID=1 \
OUT=/home/ny/fdp_measure_waf_r0_full \
R0_CONFIRM=YES \
PRECONDITION_OFFSET_BYTES=0 \
PRECONDITION_SIZE_GB=auto \
PRECONDITION_RANDOM_OVERWRITE=1 \
PRECONDITION_RANDOM_PASSES=1 \
VENDOR_MEDIA_WRITE_COMMAND="nvme ocp smart-add-log /dev/nvme0n1 -o json" \
bash run_R0_precondition.sh

현재 target에서 PRECONDITION_SIZE_GB=auto dry-run은 namespace 크기를 약 3.76TB로 읽고, offset 0 기준 약 3501GiB span을 구성했다. 이 경로는 시간이 오래 걸리므로 최종 평가용으로 분리한다.

현재 결과와 비교

현재까지 나온 결과는 두 종류로 분리한다.

결과위치성격원문/README 기준 판단
separated WAF probe/home/ny/fdp_measure_waf_probe/R_separated_20260615T103716WAF counter 동작과 separated mode 실행 가능성 확인WAF 산출은 유효하지만 warmup=0, measurement=1, R0 미명시라 정식 1차 결과는 아님
3-mode final comparison/home/ny/fdp_measure_3mode_finalno_fdp/separated/mixed 같은 조건 비교3-mode 비교는 유효하지만 vendor media counter 없이 실행되어 정식 WAF는 unavailable

다른 사람 separated 결과표와 1:1 비교

비교 대상:

다른 사람: /home/ksy/waf-fdp-separated
우리 probe: /home/ny/fdp_measure_waf_probe/R_separated_20260615T103716
항목다른 사람 separated우리 separated WAF probe일치도
Modeseparatedseparated일치
Device path/dev/ng0n1/dev/ng0n1일치
Block device path/dev/nvme0n1/dev/nvme0n1일치
Workers99일치
Warmup iterations20불일치
Measurement iterations81불일치
Total replay processes909run 길이 차이
Process failures00일치
Replay record failures00일치
Host write bytes delta269,856,256,00044,993,024,000run 길이 차이
Host write delta251.32GiB41.90GiBrun 길이 차이
Media write bytes delta274,253,004,80045,707,427,840run 길이 차이
Media write delta255.42GiB42.57GiBrun 길이 차이
WAF1.01631.0159거의 일치
WAF statusavailableavailable일치
FDP logsxnvme unavailablexnvme unavailable일치
R0 precondition size미기재미기재/미적용 probe둘 다 원문 기준으로 불충분

해석:

  • WAF 산출 방식과 separated mode의 WAF 비율은 잘 재현됐다. 1.0163 vs 1.0159로 차이는 매우 작다.
  • 다른 사람 결과는 README 예시 run shape(warmup=2, measurement=8)을 따른 것으로 보인다.
  • 우리 separated WAF probe는 WAF counter 확인용 짧은 실행이다. 원문 기준 정식 평가 결과로 쓰려면 R0 precondition을 명시하고 README run shape으로 재실행해야 한다.

Workload pressure 비교

WorkloadWorkersClassFDP data RUHsFDP metadata RUHs다른 사람 measurement logical store우리 probe measurement logical store
llama8b_chat_chunk2562hot_churn0,12160GiB20GiB
llama70b_longctx_chunk10241large_model/cold_rag3,4580GiB10GiB
rag_shared_prefix_chunk5122cold_rag3,45192GiB24GiB
random_prompts_chunk1283hot_churn0,12192GiB24GiB
metadata_heavy_small_objects1metadata_heavy6764GiB8GiB
합계9688GiB86GiB

다른 사람 결과의 workload pressure는 우리 probe의 정확히 8배다. 이는 다른 사람 결과가 measurement=8, 우리 probe가 measurement=1이기 때문이다. 따라서 WAF ratio는 비교할 수 있지만, total host/media write volume과 log warning count는 직접 비교하면 안 된다.

현재 결과의 기준 충족도

평가 기준다른 사람 결과표우리 separated WAF probe우리 3-mode final
원문 목표: lifetime 분리separated mode만 확인separated mode 확인3-mode 중 separated 확인
원문 목표: WAF 산출availableavailableunavailable
원문 목표: clean-state 회피/R0precondition 정보 없음precondition 정보 없음precondition 정보 없음
README: stress scale충족으로 보임충족충족
README: warmup=2, measurement=8충족미충족미충족
README: 3-mode 비교미충족미충족충족
failure-free replay충족충족충족
p99 latency표에는 없음추출 가능추출 완료
xnvme FDP logsunavailable 명시unavailable 명시unavailable

결론적으로, 다른 사람 결과표는 README run shape과 WAF available 측면에서는 더 완성도가 높지만, 원문 기준의 preconditioning 정보는 빠져 있다. 우리 probe는 WAF ratio 재현성은 좋지만 짧은 실행이다. 우리 3-mode final은 모드 비교는 좋지만 정식 WAF가 빠져 있다.

다음 실행 우선순위

원문 우선순위와 README 실행 기준을 모두 만족하려면 다음 순서가 맞다.

순서실행목적
1R0 window-local 32GiB → separated, warmup=2, measurement=8다른 사람 결과표와 1:1 비교 가능한 separated WAF 결과 확보
2같은 R0 조건으로 no_fdp, mixed 실행원문 가설 검증을 위한 3-mode WAF 비교 완성
33-mode 결과 유효 시 R0 span을 256GiB/512GiB로 확장window-local 결과가 span에 민감한지 확인
4필요 시 full-span R0device-wide sustained-state 주장 강화

결론

현재 코드와 스크립트로 원문 PoC가 의도한 평가 흐름은 실행 가능하다.

현재 채택할 원문 우선 1차 시나리오는:

R0 window-local precondition 32GiB
→ no_fdp / mixed / separated, each with warmup=2 and measurement=8
→ 정식 WAF + FDP proxy + p99 비교

이 시나리오는 원문 HTML의 clean-state 회피 요구를 window-local R0로 반영하고, PoC harness README의 3모드 비교 조건을 따른다. 실제 사용하는 9.5GiB raw window를 32GiB R0로 덮으므로 1차 PoC WAF 검증에는 충분하다. 다만 device-wide sustained-state 결론은 아니므로, 최종 주장에는 더 큰 span 또는 full-span R0 결과가 필요하다.