AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

JVM虚拟化 重新定义Java容器热部署的资源管理机制

发布者 java
发布于 1481867547433  浏览 6507 关键词 Java 
分享到

第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



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。