第1页
JVM虚拟化
重新定义Java容器热部署的资源管理机制
陆传胜
第2页
– 2009~2015 IBM Java Technology Center
– 2015~ now 阿里巴巴基础架构 事业群JVM组
– chuansheng.lcs@alibabainc.com
第3页
“双十一”就要到了,您准备好了吗? • 如果Java应用突然就…
第4页
回滚
分发旧版本
下线新版本
部署旧版本
上线旧版本
× N ≈ *小时!
都是你想要的吗?
第5页
换个思路 • 如果同时保留两个版本
用户请求
Tomcat
切换
App-v1
App-v2
JVM
第6页
发布方式变化
发布第1批
发布第2批
发布第3批
……
发布第N批
重启到旧版本
重启到旧版本
重启到旧版本
……
重启到旧版本
传统的发布方式 保留两个版本时的发布方式
发布新版本
第1批切流
第1批切流
第N批切流
……
切流回滚
切流回滚
……
切流回滚
第7页
热部署并不新鲜
BUT:
– Note that this(Tomcat hot deployment) is obviously aimed at the
development environment, and is unsuitable for production.
---- MuleSoft
– Important: Do not use hot deployment to update
components in a production deployment manager managed cell. Hot deployment is well-suited for development and testing, but
poses unacceptable risks to production environments.
---- IBM WAS官方文档
我们想把热部署带到生产环境!
第8页
资源回收——热部署应用于生产环境的最大障碍
CPU
第9页
JVM 虚拟化
高密度 低密度
app app JVM虚拟化 容器化 硬件虚拟化
app
第10页
热部署 + JVM虚拟化 = 多版本发布
部署
应用 v3
应用v2
应用v1
tomcat
租户3 租户2 租户1
退部署
AJDK
Memory
CPU
Operating System
I/O
第11页
快速发布&回滚
更快的发布速度
10 分钟灰度发布 300+台机器!
更快的回滚速度
300+台机器 秒级回滚!!
不中断服务
OS, JVM 都不用重启
第12页
AJDK 阿里巴巴定制版JDK
AJDK
多租户
Coroutine
JWarmup
Advanced profiling
……
第13页
JDK对热部署支持的比较
Tomcat
完整的线程生命周期管理
内存管理
应 用 CPU资源管理 热 部 署 I/O 资源管理
AJDK
✗✔
✔✔ ✗✔ ✗✔
第14页
按租户资源管理的关键技术
T
安全的外部线程终⽌止
M
租户内存隔离 I/O
租户I/O管理
第15页
外部线程终止
T • 问题的边界 – 并不可以安全终止JVM里所有的线程 – 需要JVM标识出来可以安全结束的线程集合 • 退栈
M – 完全退到线程入口 – 或者指定的目标方法
I/O
第16页
强迫退栈
T
M
I/O
外部终止
Method-1 Method-1 Method-3 Method-2 Method-1
TenantContainer.run()
Method-0 Method-X Thread.run()
Stack of Java thread
Java Thread
Special pending exception
解释器 JIT Code
第17页
效率
T
M
I/O
第18页
租户内存管理
T • 基于G1 GC算法
• 按租户分配内存、GC • 清除到退部署应用对象的引用
M – Org.apache.catalina.core.JreMemoryLeakPreventionListener – “静态”变量 • 退部署时回收租户所有内存 – Java heap,Metaspace,Code cache,C heap
I/O
第19页
G1内存分配改造
T Java Heap
Code Cache
Metaspace VM C Heap
M
Old Eden Survivor Old
Free Survivor
Old
Free
I/O
Old Eden Survivor Eden Free Survivor Old Eden
Tenant-1
Root-Tenant
Tenant-2
第20页
GC时按移动租户对象
T
M
Tenant-1
Root-Tenant
Tenant-2
Old
Eden Survivor Eden
Free Survivor
Old
Eden
Survivor Free
Free
Free
Free
Old
Free
Old
I/O
Tenant-1
Root-Tenant
Tenant-2
第21页
跨租户引用的问题
• GC只能回收不可达对象
T
SRC
租户A
Object-1
租户B
M
I/O
public class DriverManager { …… // List of registered JDBC drivers private final static CopyOnWriteArrayList<DriverInfo>
registeredDrivers = new CopyOnWriteArrayList<>(); ……
}
• 效果上的“静态”变量
– Static field
– ThreadLocal
– System properties
第22页
隔离静态变量消除跨租户引用
T
M
JDK
DriverManager registeredDrivers
应用
registeredDrivers MyJDBCDriver
Obj Obj …
Class
I/O
DirectBuffer
第23页
租户I/O管理
T • 拦截所有FD的创建、销毁动作
• 退部署应用时清理其FD
FileChannel.open()
M JVM FD记录 JNI
I/O
JVM wrapper OS: open()
第24页
1:16:55PM 1:17:14PM 1:17:33PM 1:17:52PM 1:18:11PM 1:18:30PM 1:18:49PM 1:19:08PM 1:19:27PM 1:19:46PM 1:20:05PM 1:20:24PM 1:20:43PM 1:21:02PM 1:21:21PM 1:21:40PM 1:21:59PM 1:22:18PM 1:22:37PM 1:22:56PM 1:23:15PM 1:23:34PM 1:23:53PM 1:24:12PM 1:24:31PM 1:24:50PM 1:25:09PM 1:25:28PM 1:25:47PM 1:26:06PM 1:26:26PM 1:26:45PM 1:27:04PM 1:27:23PM 1:27:42PM 1:28:01PM 1:28:20PM 1:28:39PM 1:28:58PM 1:29:17PM 1:29:36PM 1:29:55PM 1:30:14PM 1:30:33PM 1:30:52PM 1:31:11PM 1:31:30PM 1:31:49PM 1:32:08PM 1:32:27PM 1:32:46PM 1:33:05PM 1:33:24PM 1:33:43PM 1:34:02PM 1:34:21PM 1:34:40PM 1:34:59PM 1:35:18PM
- QPS - RT
多版本发布系统对应用性能的影响
450 400 350 300 250 200 150 100
50 0
1200 1000
800 600 400 200
0
1:16:55PM 1:17:14PM 1:17:33PM 1:17:52PM 1:18:11PM 1:18:30PM 1:18:49PM 1:19:08PM 1:19:27PM 1:19:46PM 1:20:05PM 1:20:24PM 1:20:43PM 1:21:02PM 1:21:21PM 1:21:40PM 1:21:59PM 1:22:18PM 1:22:37PM 1:22:56PM 1:23:15PM 1:23:34PM 1:23:53PM 1:24:12PM 1:24:31PM 1:24:50PM 1:25:09PM 1:25:28PM 1:25:47PM 1:26:06PM 1:26:26PM 1:26:45PM 1:27:04PM 1:27:23PM 1:27:42PM 1:28:01PM 1:28:20PM 1:28:39PM 1:28:58PM 1:29:17PM 1:29:36PM 1:29:55PM 1:30:14PM 1:30:33PM 1:30:52PM 1:31:11PM 1:31:30PM 1:31:49PM 1:32:08PM 1:32:27PM 1:32:46PM 1:33:05PM 1:33:24PM 1:33:43PM 1:34:02PM 1:34:21PM 1:34:40PM 1:34:59PM 1:35:18PM
第25页
展望
• 多版本合并部署 • JVM-as-a-Service
第26页
THANK YOU!
第27页
backup
第28页
技术栈细节
AliOS
Tengine Tomcat
用户请求
AJDK-8 租户-1
租户-2
租户-3
租户-4
CPU
内存
文件句柄
其他资源
AJDK-8
JavaSE 类库
Java 虚拟机
Java Heap
租户-1 租户-2
租户-3 租户-4
OS Wrapper
JIT GC RT
Code Cache metaspace