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 了,该补什么"决策树
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)+ COW | prefix caching(block 引用计数共享) |
| 物理内存压力 | swap to disk | swap to host RAM / 或 preempt + recompute |
4.2 进程调度 ↔ Continuous Batching
| 问题 | OS 解 (CFS) | vLLM 解 |
|---|---|---|
| 多任务公平共享 CPU/GPU | time slice,每次 ~10ms | token 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 Cache | vLLM Prefix Cache |
|---|---|---|
| 同一资源被反复读 | (file, offset) → 内存中的页 | (token chain) → 显存中的 block |
| 查找命中 | radix tree of inodes + offset map | chain hash → cached_block dict |
| 命中粒度 | 4KB 页 | 16-token block |
| 失效 | file 写 / unlink | 显存压力下被 evict |
| 替换策略 | active/inactive LRU | FreeKVCacheBlockQueue (LRU 双链表) |
4.4 IPC / RPC ↔ ZMQ engine link
| 问题 | OS / 分布式解 | vLLM v1 解 |
|---|---|---|
| 跨进程通信 | pipe / socket / message queue | ZMQ socket (PUSH/PULL or DEALER/ROUTER) |
| 消息序列化 | protobuf / msgpack / pickle | msgpack (or pickle) |
| backpressure | queue size limit + flow control | ZMQ HWM + bounded queue |
| fault tolerance | heartbeat + reconnect | (单机进程对,崩了直接退出) |
05vLLM 没有 OS 直接对应的地方
不是所有 vLLM 概念都能在 OS 找到对应。这几条是 GPU/LLM 特有的,要单独补:
| vLLM 概念 | 性质 | 怎么补 |
|---|---|---|
| CUDA Graph | GPU 特有的"批量 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 SRAM | GPU 内存层级,对 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 decoding | draft model + verify 加速 | Medusa / EAGLE 论文 |
| NCCL collective | GPU 间通信原语 | NCCL docs + Megatron paper |
| Attention sink | 长 context 的偏置项 | StreamingLLM 论文 |
06常用补充材料 (优先级)
🔴 必装备
- OSTEP (Operating Systems: Three Easy Pieces) · 免费在线 — 计算机操作系统首选教材,写得轻松易读。
- vLLM 官方架构 blog · blog.vllm.ai — 看最新的 v1 架构、性能、新特性文章。
- PagedAttention 论文 · SOSP 2023
🟡 当需要补
- MIT 6.S081 (视频 + lab) · pdos.csail.mit.edu/6.S081/ — OS 视频替代,xv6 lab 实操。
- CMU 15-418 Parallel Computing · 15418.courses.cs.cmu.edu — GPU 架构 + 缓存层级深入。
- PMPP (Programming Massively Parallel Processors) · NVIDIA 的 CUDA 圣经,第 3 版 PDF 网上有。看 ch 1-5 + 8。
- Berkeley AISys Fa2024 · schedule — 现代 LLM 系统论文地图。
- Triton tutorial · triton-lang.org — kernel 入门。
- CUDA C++ Programming Guide ch 4-6 · NVIDIA 官方,下午翻完。
🟢 偶尔翻翻
- "Designing Data-Intensive Applications" · 分布式部分跟 vLLM TP/PP 调度相通。
- "Database Internals" · LSM tree / page replacement 跟 KV cache 相通。
- Linux 内核源码 · mm/ 目录,不是用来读完的,是用来 grep 类比的。
07反原则 · 别这么干
- ❌ 不要先把 OSTEP 整本刷完再来读 vLLM。不学到具体用处的概念都会忘。
- ❌ 不要按 AISys schedule 顺序读 24 篇论文。它是给学生一学期的,不是给你 6 个月的。
- ❌ 不要把笔记做成 PPT。每篇论文一段话 + 跟 vLLM 源码哪一行对得上,比精美笔记有用 10 倍。
- ❌ 不要等"准备好"才提 PR。Month 1 就交第一个,哪怕是 typo。
- ❌ 不要先建仓库再写代码。先在 single file 里把 mini-vLLM 跑起来,再切模块。
- ❌ 不要追新 paper 追到忘了读 OSTEP。基础概念是杠杆,新论文是兵器,没有杠杆,兵器再多也举不动。
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 个月里你会回来很多次。每次回来,对照表里你能"看懂"的格子会变多。 这是进步的真实度量。