流量预热与冷启动
新启动的实例和扩容后的 Pod,在接收流量的瞬间,性能往往是最差的。
你有没有注意过这种现象:每次发布后,前几个请求总是特别慢?或者 K8s 扩容后,新增的 Pod TP99 延迟是正常实例的 5 倍?这些现象的根源,就是冷启动(Cold Start)。
冷启动的本质
冷启动不是单一问题,而是一系列连锁反应。
冷启动的性能影响
下面是一个典型的冷启动性能曲线:
JVM 冷启动问题
JVM 应用冷启动最慢,因为 JIT 编译器需要「预热」:
JVM 预热时间的经验数据:
预热策略
策略一:预热流量
在 Pod 就绪前,先发送预热流量:
Warmup流量注入.java
策略二:渐进式流量切换
不要一次性把流量切到新 Pod,而是逐步增加:
渐进式流量切换.yaml
策略三:K8s Startup Probe + 延迟就绪
利用 Startup Probe 延迟就绪:
startup-probe-warmup.yaml
策略四:本地预缓存
在 Pod 启动时加载热点数据到本地缓存:
本地缓存预热.java
冷启动优化技术
GraalVM Native Image
GraalVM Native Image 编译后的应用,冷启动时间可以减少 90%:
CRaC(Coordinated Restore at Checkpoint)
CRaC 在应用运行时创建检查点(checkpoint),然后在重启时恢复到这个检查点:
CRaC
质量判断标准
一篇「流量预热与冷启动」的文章是否达标,要看它是否回答了:
- ✅ 什么是冷启动,为什么会发生?
- ✅ 冷启动的性能影响具体是多少?
- ✅ 有哪些预热策略,具体怎么实现?
- ✅ 有什么技术可以减少冷启动时间?
- ❌ 只有概念,没有量化数据——不达标
本章总结
核心要点:
- 冷启动是 JVM/框架类应用的普遍问题:JIT 未编译、缓存未预热、连接池未建立
- 冷启动对用户体验影响大:新 Pod 的 TP99 延迟可能是正常 Pod 的 5~10 倍
- 预热策略是关键:预热流量、渐进流量切换、本地缓存预加载
- K8s Startup Probe 配合就绪探针:给予足够预热时间
- 新技术减少冷启动:GraalVM Native Image、CRaC