본문으로 건너뛰기

upstream dev 기반 발굴 후보 풀 (2026-06-25)

우선순위 정렬 전 버전. 목적은 후보를 먼저 넓게 펼치고, 각 항목이 기존 private 문서에 있던 것인지 아니면 이번 upstream/dev 코드와 최근 GitHub PR/issue 검토로 새로 잡힌 것인지 구분하는 것이다.

표기:

  • NEW: 기존 private task/status/discovery 문서에서 같은 항목을 찾지 못한 후보
  • 기존: 이미 private 문서에 있던 후보. 기존 문서 링크를 같이 둔다.
  • 점유/중복: 최근 열린 PR이 이미 같은 핵심 영역을 다룸. 직접 착수 금지 또는 후속만 가능.

Mode:

  • MP: multiprocess mode L2/MP server 경로
  • In-process: embedded / legacy non-MP 경로
  • Both: 공유 core 또는 양쪽에 별도 구현이 모두 있는 항목

0. 검토 범위

  • 현재 GitHub dev와 로컬 /home/ny/LMCache dev는 같은 HEAD: 26cd49937aba.
  • GitHub public API로 updated:>=2026-06-01 기준 raw_block, storage, io_uring, l2 관련 PR/issue를 훑었다.
  • 주요 PR refs를 fetch해서 dev...refs/tmp/pr-* diff를 확인했다: #3636, #3812, #3835, #3841, #3519, #3226, #3272, #3689, #3796, #3859, #3854, #3686, #3634 등.
  • gh auth status는 유효하지 않아 authenticated GitHub 조회는 사용하지 못했다. 공개 API와 git refs 기준으로 확인했다.

1. 점유 / 중복 회피

영역최근 PR/issue판단
raw_block put_many io_uring submit batching#3636이미 진행 중. 후속은 padded O_DIRECT(P0-B)나 writev/F1만 가능.
raw_block recovery validation#3835, #3753이미 진행 중. uring_cmd 제외 gap만 별도.
raw_block read batching / uring_cmd temp buffer#3812, #3841일부 점유. multi-page uring_cmd read 정렬/bounce gap은 남음.
startup BLKDISCARD#3519init-time discard 점유. runtime discard는 직교하지만 owner 조율 필요.
checkpoint format / compression#3226, #3449checkpoint format/overflow 영역은 중복 위험.
fs L2 capacity-aware eviction#3859FS L2 eviction base 기능 점유. 후속 검증/확장만 가능.
MP raw_block multi-device sharding#3689private MP-C 빈틈을 이 PR이 점유. base sharding 직접 착수 금지.
CacheGen serde for FS L2#3796FS/mock exact-size hook 점유. S3/HFBucket/native 확장은 후속 후보.
GCS/Azure remote connector#3854, #3686non-MP connector 점유. MP L2 parity는 별도 gap.
store-side CPU admission retry#3634admission retry/counter 점유. LocalCPU batched eviction accounting은 별도 gap.

2. 발굴 후보 풀

표시후보Mode근거 / 남은 gap기존 문서 또는 최근 PR
NEWP2P read-only adapter의 store success semantics 정리MPP2PL2Adapter.submit_store_task()는 실제 저장 없이 L2StoreResult(True, 0)를 즉시 반환한다. default store policy가 모든 adapter를 store target으로 쓰고, skip_l1 정책은 성공 후 L1 삭제를 수행하므로 read-only adapter capability가 필요할 수 있다. 다만 P2P는 storage/NVMe 주력 영역은 아니다.코드: lmcache/v1/distributed/l2_adapters/p2p_l2_adapter.py:186, lmcache/v1/distributed/storage_controllers/store_policy.py:144. 관련 최근 PR: #3740, #3762
NEWL2 adapter capability bit / descriptor 확장MPAdapterDescriptor는 index/config만 제공한다. store 가능, lookup-only, capacity-aware, latency class 같은 capability를 policy가 볼 수 없어 P2P 같은 read-only adapter를 정책적으로 제외하기 어렵다.코드: lmcache/v1/distributed/storage_controllers/store_policy.py:22
기존F2 uring_cmd multi-page read alignment/bounce 근본 수정Both#3812/#3841이 read batching과 temp buffer 일부를 다루지만 recovery _load_meta_payload와 일반 multi-page read의 비정렬 PRP/EINVAL gap은 남아 있다.status snapshot F2, follow-up, #3812, #3841
기존B1 L2/TTFT runtime latency histogramMP현재 L2MetricsSubscriber는 counters 중심이고 L2ThroughputSubscriber는 GB/s histogram이다. #3272는 offline flamegraph profiling이라 runtime latency/TTFT 증명과 구분된다.tasks/index B1, latency plan, #3272
기존Task5 device-aware store/prefetch policyMP현재 store policy는 모든 adapter에 저장하고, prefetch policy는 lowest-index adapter를 고른다. 최근 Q2 roadmap도 advanced L2 policy / dynamic prefetch admission을 요구한다. B1 telemetry가 선행이면 효과를 증명하기 쉽다.tasks/index Task5, #2923, 코드: prefetch_policy.py:129, store_policy.py:144
기존A3 RU-aligned raw_block slot geometryBothRawBlockCore layout은 metadata 뒤에 slot_bytes 단위로 연속 배치한다. FDP RU/erase block boundary 정렬 config는 없다. #3689 multi-device sharding과 별개다.nvme discovery A3, 코드: lmcache/v1/storage_backend/raw_block/core.py:1438
기존N1 runtime discard/TRIM on slot freeBoth현재 delete_many()는 index에서 제거하고 free slot list에 넣을 뿐, free된 device byte range에 discard를 발행하지 않는다. #3519는 init-time discard만 다룬다.nvme discovery N1, #3519, 코드: core.py:836
기존P0-B padded O_DIRECT write도 batched_write 사용Both#3636은 submit batching만 다루고 padded O_DIRECT는 Rust API가 payload_len을 모르는 문제로 per-entry fallback을 둔다. P0-B local 구현 완료로 기록됨.tasks/index P0-B, #3636
기존F1 write coalescing / writevBoth#3636 이후에도 header/payload는 key당 2 SQE다. writev로 key 내부 header+payload를 2 commands에서 1 command로 줄이는 후속.status snapshot F1, coalescing plan
NEWVariable-size serde exact-size support를 FS/mock 밖으로 확장MP#3796은 CacheGen serde와 get_object_sizes() hook을 FS/mock에 추가한다. S3/HFBucket/native connector exact-size reporting은 후속으로 남는다.#3796, 코드: serde_wrapper.py:241, s3_l2_adapter.py:427
NEWGCS/Azure MP L2 adapter parityMP#3854와 #3686은 non-MP remote connector만 추가하고 MP GCS/Azure L2 adapter는 명시적으로 follow-up으로 남긴다. 현재 MP object-store L2는 S3만 first-party로 보인다.#3854, #3686, 코드: s3_l2_adapter.py:427
기존 / 점유MP raw_block multi-device shardingMPprivate MP-C로 추적하던 빈틈이지만, #3689가 device_paths와 per-rank sharding을 구현 중이다. base sharding은 중복이다.nvme discovery MP-C, #3689
NEWraw_block multi-device 후속: per-device health/capacity/latency-aware shardingMP#3689는 kv_rank.local_rank % len(device_paths) 형태의 단순 sharding이다. PR merge 후 장치별 capacity, latency, health, queue-depth를 반영한 routing/rebalance가 후속 gap으로 남는다.#3689
기존MP raw_block fixed-buffer registration hookMPRawBlockL2Adapter는 io_uring이어도 fixed-buffer registration이 disabled라고 warning한다. MP allocator path와 연결되는 zero-copy hook이 남아 있다.status snapshot G3/G4, 코드: raw_block_l2_adapter.py:347
NEWio_uring queue depth / sysfs autotune 또는 preflightBothRawBlockCoreConfig.iouring_queue_depth는 수동 config이고 Rust ring도 전달값 그대로 build한다. device queue depth, MDTS, sysfs limits를 읽어 추천/검증하는 preflight는 없다. M2 setup flag와 인접하지만 autotune/preflight는 별도 후보로 볼 수 있다.코드: core.py:149, rust/raw_block/src/lib.rs:965
기존fs_connector O_DIRECT + save_chunk_meta paddingIn-processsave_chunk_meta가 true이면 metadata가 block size에 맞지 않아 O_DIRECT를 꺼버린다. SSD real-disk benchmark에 직접 영향이 있다.tasks/index Task3, 코드: fs_connector.py:100
NEWLocalCPU batched_allocate eviction accounting gapBothbatched_allocate eviction path에 "batched allocate is not supported through batched_remove; usage tracking not supported" TODO가 있다. #3634의 admission visibility와 인접하지만 직접 중복은 아니다.#3634, 코드: local_cpu_backend.py:788
기존H1/H2 free slot set/FIFOBoth_free_slots는 list membership O(n)과 LIFO reuse를 유지한다. FDP/wear 관점의 작은 선행 작업.tasks/index H1/H2, 코드: core.py:1478

3. 우리 storage/NVMe 목표와의 적합성 메모

후보군적합성메모
raw_block / io_uring / uring_cmd / O_DIRECT / TRIM / RU geometry높음우리 핵심 레인. Samsung storage SW 목표와 직접 연결된다.
B1 latency / TTFT telemetry높음PoC 성능 주장과 device-aware policy의 근거가 된다.
MP L2 policy / sharding health중간~높음raw_block/NVMe와 결합하면 의미가 크다. 일반 MP policy만으로는 storage 직접성은 낮아진다.
P2P read-only semantics중간 이하correctness gap으로는 유효하지만 우리 storage/NVMe 핵심 영역은 아니다. 작은 upstream hygiene 후보로만 보는 편이 낫다.
GCS/Azure MP parity낮음~중간upstream storage diversity에는 좋지만 NVMe/FDP/HC-SSD 목표와 직접성은 낮다.
LocalCPU accounting중간안정성/observability 후보. storage device 최적화라기보다는 메모리 계층 정합성이다.

4. 모드별 빠른 보기

Mode후보
MPP2P store semantics(NEW), L2 capability bit(NEW), B1 latency, Task5 device-aware policy, variable-size serde exact-size 확장(NEW), GCS/Azure MP parity(NEW), raw_block multi-device sharding 점유/#3689, raw_block multi-device health follow-up(NEW), MP raw_block fixed-buffer hook
In-processfs_connector O_DIRECT metadata padding, GCS/Azure non-MP connector는 #3854/#3686이 점유, LocalDisk/file 실배칭은 별도 기존 discovery 노트 참고
BothF2 uring_cmd alignment, A3 RU geometry, N1 runtime discard, P0-B, F1 writev, io_uring queue-depth autotune(NEW), LocalCPU batched eviction accounting(NEW), H1/H2 free slot

5. 후속 사용법

  • 이 문서는 우선순위 정렬 전 후보 풀이다. 착수 순서를 정할 때는 /home/ny/AGENTS.md의 Item Discovery 기준대로 blocking → impact → scope/risk 순서로 별도 정렬한다.
  • 중복 회피가 필요한 PR은 반드시 최신 상태를 다시 확인한다. 특히 #3689, #3796, #3859, #3636, #3812, #3841은 빠르게 변할 수 있다.
  • 우리 storage/NVMe 목표 기준으로는 P2P/GCS/Azure는 후보 풀에 남기되, 주력 후보로 삼기 전에는 영역 적합성을 다시 확인한다.