把你的Java后端经验重新编译一次:当Netty/Epoll/JVM映射到AI Infra

翻译:你的Java后端经验,就是AI Infra最好的预习材料。 一、你先要理解一件事 AI Infra 不是什么全新的知识体系。它是一个同构系统,只是运行在 GPU 上。 你的舒适区 AI Infra 的真相 ─────────────────────────────────────────────────────── Netty EventLoop 接收请求 SM(Streaming Multiprocessor)接收 Warp ByteBuf 池化管理内存 PagedAttention 分块管理显存 epoll 事件驱动 IO CUDA Stream 异步执行 JVM 的 GC 分代回收 KV Cache 的 Block Eviction Kafka 的分区与批量 NCCL 的 Ring AllReduce Tomcat 的连接池 Triton Server 的 Request Queue Spring 的 AOP 代理 CUDA Graph 的 Kernel 捕获 CompletableFuture 异步编排 CUDA Stream 的依赖管理 JMX / Metrics 监控 Nsight Systems 性能分析 一模一样的问题,一模一样的抽象层次,区别只在 Scale 和物理介质。 ...

May 22, 2026 · 11 min · 2328 words · WY

系列01:内存管理——当你在管理 ByteBuf 时,你已经在管理 KV Cache 了

这篇讲什么 这是个系列的第一篇。我选"内存管理"作为开篇,因为: 你最熟——Netty ByteBuf、JVM 堆、堆外内存,你每天都在打交道 映射最直接——ByteBuf 池化 = KV Cache Block 管理 = GPU 显存池 代码最少——核心逻辑 100 行就能说清原理 读完这篇,你会理解: ByteBuf 的引用计数为什么等于 vLLM Block 的 refcount JVM 的 G1 Region 为什么等于 PagedAttention 的 Block GPU 显存池为什么是你的 PooledByteBufAllocator 在另一个地址空间的翻版 并且,你可以亲手写一个"Java 版显存管理器" 一、问题本质 内存管理要解决的只有三个问题: 1. 分配——如何快速找到一块可用的内存 2. 回收——用完后如何归还,确保不漏 3. 碎片——如何避免小块空隙越积越多 你在 Java 后端看到过这些方案的演进: JVM 堆管理: Serial GC → 标记-整理(压缩碎片) CMS → 标记-清除(不压缩,碎片多) G1 → Region 分区(固定大小,消除碎片) ZGC → 染色指针 + 读屏障(几乎无停顿) Netty 堆外内存管理: UnpooledByteBufAllocator → 每次分配新 DirectBuffer PooledByteBufAllocator → 预分配 Arena + Chunk + Page 分三级管理 AI Infra 的显存管理(正在发生和你一模一样的事情): PyTorch 默认(CUDACachingAllocator)→ 有缓存但碎片严重 vLLM PagedAttention → Region 分块(和 G1 一样的思路) 这不是类比,这是同一个问题在不同约束下的工程演化。 ...

May 22, 2026 · 8 min · 1693 words · WY