Issue #3392 β RawBlock Dynamic Slot Allocation
[!tldr] μ 무 κ΄μ takeaway daegyu94κ° μ μν raw_block μ¬λ‘― λμ ν λΉ. κ³ μ μ¬λ‘― ν¬κΈ° β νμ΄λ‘λ ν¬κΈ° κΈ°λ° λμ ν λΉμΌλ‘ λ΄λΆ λ¨νΈν ν΄μκ° λͺ©ν. HC SSD(15~30TB) νκ²½μμ layerwise / compression μν¬λ‘λ μ¬μ© μ μ€ν¨ μ©λμ΄ ν¬κ² λ μ μλ€. μ°λ¦¬ H1(O(1)) / H2(FIFO) Taskμ λ°©ν₯μ΄ λ€λ₯Έ λ 립 κ°μ β λ¨, ꡬνλλ©΄ μ¬λ‘― κ΄λ¦¬ μ½λ μ λ°μ΄ λ°λλ―λ‘ H1/H2 PR μ°©μ μ μ§ν μν© νμΈ νμ.
- Issue: LMCache/LMCache #3392
- μμ±μ: daegyu94 (2026-05-26)
- λ μ΄λΈ: new feature
- μν: λ Όμ μ€ (2026-05-28 κΈ°μ€)
λ¬Έμ β κ³ μ μ¬λ‘―μ λ΄λΆ λ¨νΈνβ
νμ¬ RawBlockCoreλ λͺ¨λ KV chunkλ₯Ό κ³ μ ν¬κΈ° μ¬λ‘―μ μ μ₯νλ€.
slot_bytes = round_up(header_bytes + full_chunk_bytes, block_align)
νμ΄λ‘λκ° μ¬λ‘―λ³΄λ€ μμΌλ©΄ λλ¨Έμ§ κ³΅κ°μ΄ κ·Έλ₯ λλΉλλ€.
μΌμ΄μ€ 1 β Partial (unfull) μ²ν¬β
save_unfull_chunk=True λλ PD(Prefill-Decode) λͺ¨λμμ λ°μ:
Fixed Slot (512 KiB)
[##########..............................................] 50 KiB payload
[####################################################] 462 KiB λλΉ
μΌμ΄μ€ 2 β μμΆ μν¬λ‘λβ
DeepSeek-V4μ²λΌ λ μ΄μ΄λ³ μμΆλ₯ μ΄ λ€λ₯Έ λͺ¨λΈ:
Slot (512 KiB)
Layer A (low compression): [####################################....................]
Layer B (high compression): [############............................................]
Layer C (very high): [######..................................................]
λ μ΄μ΄ κ° μ΄μ§μ±μ΄ λμμλ‘ λ¨νΈνκ° λμ λμ΄ μ€ν¨ μ©λμ΄ μ€μ΄λ λ€.
μ μ β Dynamic Slot Allocatorβ
daegyu94μ μ΄μ:
- μ€μ νμ΄λ‘λ ν¬κΈ°μ λ§μΆ° μ¬λ‘― ν¬κΈ° κ²°μ
- bump-pointer μ λ΅μΌλ‘ μ©λ μ¬μ μ λΉ λ₯Έ μμ°¨ ν λΉ μ μ§
- power-of-two size classλ‘ ν λΉ λ¨μ λ°μ΄λ©
- size classλ³ segmented free listλ‘ ν΄μ λ μμ μ¬μ¬μ©
- size-aware allocation hintλ‘ ν λΉ-ν΄κ±° λΆμΌμΉ λ°©μ§
Dynamic Allocation (μμ)
[##########] 50 KiB slot
[##############] 80 KiB slot
[########################] 200 KiB slot
λκΈ ν λ‘ μμ½ (DongDongJu β daegyu94)β
DongDongJu μ μ β Slab/Buddy μ€νμΌβ
"μμ λμ ν λΉλ³΄λ€λ Linux slab/slob/slub + buddy allocator λ°©μ":
μ¬λ¬ κ³ μ size class pool μ¬μ ν λΉ
μ: 64KB / 128KB / 256KB / 512KB
β μμ² νμ΄λ‘λλ₯Ό μμ©ν μ μλ κ°μ₯ μμ classμμ ν λΉ
β ν΄μ μ ν΄λΉ class free listμ λ°ν
β μΌλΆ poolμ GPU μΈ‘μ pin β read μ±λ₯ ν₯μ κ°λ₯
μμ κ°λ³ ν¬κΈ° ν λΉλ³΄λ€ λ¨μνκ³ μμΈ‘ κ°λ₯νλ©΄μλ λ¨νΈνλ₯Ό μ€μΌ μ μλ€λ λ Όλ¦¬.
daegyu94 μλ ΄μ (2026-05-28)β
Full chunk: κΈ°μ‘΄ κ³ μ μ¬λ‘― (λͺ¨λΈ μμ‘΄ slot_bytes μ μ§)
Partial chunk: size-class pool (μν νμ΄λ‘λ μ μ©)
μ΄λ¦° μ€κ³ μ§λ¬Έ:
| νλͺ© | λ΄μ© |
|---|---|
| Partial/Full λΉμ¨ | μ: Partial 20% / Full 80% β μ€μ κ°λ₯ν΄μΌ ν¨ |
| size class λ²μ | μ: 64KB ~ 1024KB, λͺ κ° ν΄λμ€? |
| Fallback λ°©ν₯ | Partial β Full fallback νμ©? Full μ©λ μμ½ νμ. Full β Partialμ split/merge 볡μ‘λ λλ¬Έμ νΌν΄μΌ ν¨ |
| eviction μν₯ | ν λΉ μ€ν¨ μ ν΄κ±° μ μ± μ΄ size classλ₯Ό μΈμ§ν΄μΌ ν¨ |
μ°λ¦¬ Taskμμ κ΄κ³β
| νλͺ© | κ΄κ³ |
|---|---|
| H1 (_free_slots O(1)) | κ³ μ μ¬λ‘― ꡬ쑰 μ μ . λμ ν λΉ κ΅¬ν μ _free_slots μμ²΄κ° λ°λλ―λ‘ H1λ³΄λ€ λ¨Όμ #3392 λ°©ν₯ νμ νμ |
| H2 (FIFO deque) | λμΌ. deque κ΅μ²΄λ λ¨μνμ§λ§ μ¬λ‘― ꡬ쑰 λ³κ²½ μ μ¬μμ κ°λ₯ |
| S2 (checkpoint overflow) | μ¬λ‘― μκ° λμ΄λ μ μμ΄ (λμ ν λΉ β μ¬λ‘― μ μ¦κ°) S2 μμ μ°μ μμκ° λ μ¬λΌκ° |
| FDP placement | μ¬λ‘―μ΄ κ°λ³ ν¬κΈ°κ° λλ©΄ placement hint λ¨μλ μ¬κ²ν νμ |
[!note] H1/H2 μ°©μ μ νμΈ ν¬μΈνΈ #3392κ° λΉ λ₯΄κ² ꡬν λ°©ν₯μ΄ μ‘νλ©΄ H1/H2λ₯Ό λ¨Όμ μ¬λ¦¬λ κ² λλΉκ° λ μ μλ€. λ°λλ‘ #3392κ° μ₯κΈ° μ€κ³ λ Όμλ‘ μ΄μ΄μ§λ©΄ H1/H2λ λ 립μ μΌλ‘ μ§νν΄λ 무방. μ΄μ μ§ν μν©μ μ£ΌκΈ°μ μΌλ‘ 체ν¬.
HC SSD κ΄μ β
HC SSD(15~30TB) νκ²½μμ layerwise=True + κ³ μμΆ λͺ¨λΈμ μ°λ©΄ λ¨νΈν μμ€μ΄ λμ λλ€. λμ ν λΉμ΄ ꡬνλλ©΄:
- μ€ν¨ μ©λ μ¦κ° β μΊμ hit rate ν₯μ
- S2(checkpoint overflow) μκ³μ λ μ¬λ‘― μ κΈ°λ°μ΄λ―λ‘ ν¨κ» μ¬κ³μ° νμ
κ΄λ ¨ νμ΄μ§β
- [[raw_block-κ°μ -Task]] β H1/H2 Task (κ³ μ μ¬λ‘― κΈ°λ° κ°μ , #3392μ λ°©ν₯ κ΅μ°¨)
- [[raw_block-λ΄λΆκ΅¬μ‘°]] β νμ¬ κ³ μ μ¬λ‘― ꡬ쑰 μμΈ
- [[S2-checkpoint-overflow]] β μ¬λ‘― μ μ¦κ° μ μν₯ λ°λ λ²κ·Έ