home/tutorial/OS 速查

OS ↔ vLLM 速查

遇到 vLLM 某模块卡住?反查这张表 → 找对应 OS 概念 → 用 OSTEP / 6.S081 补 → 回来继续读。

这页是常驻参考。不需要从头到尾读—— 当你在 vLLM 源码里看到某个陌生模块时,回到这页查它在 OS 里对应什么,然后去补那一块。 把它收藏,6 个月里你会回来很多次。

01核心对照大表

vLLM 模块 / 概念 OS 对应 学习材料 vLLM 源码
PagedAttention KV cache 虚拟内存 + 分页 OSTEP 13 / 15 / 18 vllm/v1/core/kv_cache_manager.py
Block table Page table OSTEP 18 / 19 vllm/v1/core/block_pool.py
Block allocator (free list) Physical frame allocator / buddy OSTEP 17 FreeKVCacheBlockQueue in block_pool.py
Prefix caching Page cache + COW OSTEP 39 (file system intro) cached_block_hash_to_block in block_pool.py
Prefix cache eviction Page replacement (LRU / Clock) OSTEP 22 BlockPool.get_new_blocks() 从 free_queue 尾
Chain hash (Merkle-like) Hash chain · content-addressed OSTEP 40-43 (FS basics) hash_block_tokens() in kv_cache_utils.py
CPU offload / swap-out Swap to disk OSTEP 21 vllm/v1/worker/cache_engine.py · swap_in / swap_out
Continuous batching Process scheduler · time-sharing OSTEP 7 / 8 / 9 vllm/v1/core/sched/scheduler.py
Preemption (recompute) Process termination + resubmit OSTEP 7 Scheduler._preempt() · 把 request 放回 waiting
Preemption (swap-out) Process context switch + swap OSTEP 21 cache_engine.swap_blocks()
Token budget Quantum / time slice OSTEP 8 (MLFQ) SchedulerConfig.max_num_batched_tokens
Chunked prefill Coarse-grained CPU sharing (无直接 OS 对应) scheduler.py · num_computed_tokens
Engine main loop Kernel main loop / event loop OSTEP 6 EngineCore.run_busy_loop() in core.py
HTTP server async I/O multiplexing (epoll / async) OSTEP 39 · UNIX I/O models vllm/entrypoints/openai/api_server.py
SSE streaming Pipe (chunked stream) chat_completion_stream_generator() in serving_chat.py
Multi-process workers Process · fork / exec OSTEP 4 / 5 vllm/v1/executor/multiproc_executor.py
ZMQ engine ↔ API IPC IPC (pipe / socket / message queue) OSTEP 50 AsyncLLM in v1/engine/async_llm.py
Scheduler 主锁 Lock / monitor pattern OSTEP 28 / 30 scheduler.py · 主要靠 Python GIL + 单线程模型
Multi-GPU (TP / PP) 分布式系统 · RPC OSTEP 48 (RPC) + Megatron 论文 vllm/distributed/ · NCCL allreduce
Multi-LoRA 多租户隔离 · 进程间内存共享 OSTEP 4 + S-LoRA 论文 vllm/lora/
Weight loading (mmap) mmap · demand paging OSTEP 22 · 39 vllm/model_executor/model_loader/
CUDA graph capture (无直接 OS 对应) · 接近 batch syscall CUDA docs · stream graph vllm/v1/worker/gpu_model_runner.py · capture_model()
FlashAttention IO-aware 缓存友好的算法设计 / 数据局部性 CMU 15-418 lec 2 · OSTEP 40 外部依赖 flash-attn
NCCL allreduce Barrier + tree reduction OSTEP 31 (semaphore) 外部依赖 NCCL,vLLM 调用
Pinned memory Locked / non-pageable memory OSTEP 17 实际 PyTorch tensor.pin_memory()

02OS 章节优先级

OSTEP 全书 700+ 页,但你只需要下面这些:

🔴 必读 (~150 页)

  • Ch 4-5 · 进程与 API(fork/exec/wait)
  • Ch 7-10 · 调度(FCFS/RR/MLFQ/CFS)
  • Ch 13-22 · 虚拟内存(选读 13/15/18/21/22)
  • Ch 28-30 · 同步原语(lock/CV/monitor)

🟡 用到再翻

  • Ch 39-40 · 文件 I/O 与 page cache 类比
  • Ch 48-50 · RPC / 一致性(多卡时)
  • Ch 6 · 系统调用机制(async 心智模型)
  • Ch 26-27 · 并发引论

🟢 略过

  • 设备驱动、bootloader
  • FAT / ext2 内部结构
  • 安全 / 权限子系统
  • C 内存安全 lab
  • shell 实现 lab

📺 视频替代

看不进书时:MIT 6.S081 视频选这几节:

  • Lec 4 · Virtual memory
  • Lec 9-10 · Scheduling
  • Lec 12 · Locking
  • Lec 15 · COW fork

03"我看到 X 了,该补什么"决策树

读 vLLM 代码卡住 是关于"内存 / 块"? → OSTEP 13/15/18/21/22 + PagedAttention 论文 是关于"调度 / batch"? → OSTEP 7-10 + Orca / Sarathi 论文 是关于"并发 / 锁 / 进程"? → OSTEP 28-30 + 4-5 + Python asyncio docs 是关于"GPU / CUDA / kernel"? → CMU 15-418 lec 1-2 + FlashAttention + Triton 都不对? git grep 关键词 + Slack 问

04四对"完美同构"的对照

下面 4 组在 OS 和 vLLM 里几乎是 1:1 重写。学透这 4 组,60% 的 vLLM 代码你能用 OS 语言重述

4.1 虚拟内存 ↔ PagedAttention KV cache

问题OS 解vLLM 解
程序要的内存大小不确定虚拟地址空间随用随分配(demand paging)KV blocks 随生成 token 翻页时分配
避免连续段碎片固定大小页(4KB)固定大小 block(16 token)
逻辑连续 vs 物理分散页表(page table)block table(每序列一份)
多进程共享代码段共享映射(mmap MAP_SHARED)+ COWprefix caching(block 引用计数共享)
物理内存压力swap to diskswap to host RAM / 或 preempt + recompute

4.2 进程调度 ↔ Continuous Batching

问题OS 解 (CFS)vLLM 解
多任务公平共享 CPU/GPUtime slice,每次 ~10mstoken step,每次 ~20-50ms
新任务进入插入红黑树,等下次 schedule插入 waiting queue,下个 step 招进
任务完成移出 runnable移出 running,发 finish event
资源压力nice / cgroup 限制token budget + KV budget 双约束
实时性RT scheduling class(暂无强保证,priority hint)

4.3 Page Cache ↔ Prefix Cache

问题OS Page CachevLLM Prefix Cache
同一资源被反复读(file, offset) → 内存中的页(token chain) → 显存中的 block
查找命中radix tree of inodes + offset mapchain hash → cached_block dict
命中粒度4KB 页16-token block
失效file 写 / unlink显存压力下被 evict
替换策略active/inactive LRUFreeKVCacheBlockQueue (LRU 双链表)

4.4 IPC / RPC ↔ ZMQ engine link

问题OS / 分布式解vLLM v1 解
跨进程通信pipe / socket / message queueZMQ socket (PUSH/PULL or DEALER/ROUTER)
消息序列化protobuf / msgpack / picklemsgpack (or pickle)
backpressurequeue size limit + flow controlZMQ HWM + bounded queue
fault toleranceheartbeat + reconnect(单机进程对,崩了直接退出)

05vLLM 没有 OS 直接对应的地方

不是所有 vLLM 概念都能在 OS 找到对应。这几条是 GPU/LLM 特有的,要单独补:

vLLM 概念性质怎么补
CUDA GraphGPU 特有的"批量 syscall"机制NVIDIA CUDA Programming Guide ch 4-5 + vLLM capture_model() 代码
SM / Warp / Block 层级GPU 执行模型,跟 CPU 完全不同CMU 15-418 lec 1-2 + PMPP 书 ch 4
HBM 带宽 vs L2 vs SRAMGPU 内存层级,对 kernel 设计是核心FlashAttention paper §2 + CMU 15-418
FP16 / BF16 / FP8 数值训练/推理 dtype 选择HF transformers docs + 任何 ML 训练 blog
Quantization (AWQ / GPTQ / FP8)weight/activation 压缩AWQ paper + vLLM quantization docs
Speculative decodingdraft model + verify 加速Medusa / EAGLE 论文
NCCL collectiveGPU 间通信原语NCCL docs + Megatron paper
Attention sink长 context 的偏置项StreamingLLM 论文

06常用补充材料 (优先级)

🔴 必装备

🟡 当需要补

🟢 偶尔翻翻

07反原则 · 别这么干

08"对照表" 用法 · 三个场景

场景 ① · 看不懂某行 vLLM 代码

读到 block_pool.evict() 不懂为啥这么写?回这页查 "Block allocator" 行 → OSTEP 17 → 看 "free list / buddy allocator" → 半小时回来继续读 vLLM,理解了。

场景 ② · 准备面试

面试官问"vLLM 怎么管 KV cache?" 你能用 OS 语言重述:page table → block table、page fault → 翻页、page cache → prefix cache。这样答案有结构、显出底子。

场景 ③ · 设计自己的项目

写 mini-vLLM 时想:我要不要支持 swap?看 OS 怎么权衡 swap vs OOM kill → 知道 swap 复杂但灵活 → 决定 v0.1 先 recompute,v0.5 加 swap。

场景 ④ · 读新论文快速定位

看一篇新的 KV cache 论文(如 Mooncake),先在脑里走对照表:它在哪个 cell 创新?是改 page table 还是改 page cache?立刻能定位作者贡献。


这页是常驻参考。书签它,6 个月里你会回来很多次。每次回来,对照表里你能"看懂"的格子会变多。 这是进步的真实度量。