并行类加载——让tomcat玩转双十一 @双十一实战

简介: 今年双十一,是应用容器的最新版本Ali-tomcat 7.0.59.x应对的第一次双十一。这个版本包含的一个主要功能是并行类加载,本文主要对并行类加载在双十一期间的支持做一个总结。 并行类加载在双十一期间最主要的业务系统,在双十一期间支撑了每秒14w订单创建,是一个非常了不起的成绩!

今年双十一,是用容器的最新版本Ali-tomcat 7.0.59.x应对的第一次双十一。个版本包含的一个主要功能是并行,本文主要并行在双十一期的支持做一个总结

并行在双十一期最主要的业务,在双十一期支撑了每秒14w订单创建,是一个非常了不起的成

 

业务背

由于各种原因,该业务较庞大,依赖较为了解决业务性,用引入了模化系,通化的方式抽象出一系列的bundle,而bundle互相隔离,享有独立的器。

由于bundle相互隔离,我自然就会想到,是否能用启动时线程并行的初始化bundle呢?

原来的用运行在JDK6上,Tomcat候,用的Classloader(WebappClassLoader)候是序加的,因JDK6Classloader.loadClass(String name)个方法是synchonized的,如果用里面有多个线程在同时调loadClass方法,那么争将会非常激烈。

大家知道在JDK7上,如果Classloader.registerAsParallelCapable方法,会开启并行功能,把级别ClassLoader象本身,降低要加级别话说只要多线程加的不是同一个loadClass方法都不会住。憾的是,开启并行要求一个路上所有器都registerAsParallelCapable,但tomcat7WebappClassLoader并没有registerAsParallelCapable,所以老版本的tomcat7即使运行在JDK7上,也无法利用并行的特性。

 

实现原

Ali-tomcat 7.0.59.2版本开始解决了问题,支持在WebappClassLoader中打开registerAsParallelCapable方法。但是情况没有那么简单需要解决的一个问题是如何兼容JDK6问题,因tomcat7.x版本是基于JDK6编译,同运行在JDK6JDK7+以上的。JDK6下是没有Classloader.registerAsParallelCapable个方法的,所以JDK6下必保持原有的行,在JDK7下才能支持并行功能。也就是,即使用配置了并行,那么tomcat也必根据运行JDK版本来决定是否开启并行功能。Ali-tomcat反射机制解决了问题,在运行对应用的WebappClassLoader尝试注册并行功能,当发现没有个方法,会自fall back到普通的,也就是线功能。

 

并行体系

aeea0b80848c211238cffb8fd8ad06ae58e3e2a0

可以看到,实际运行程中,tomcat会自根据JDK版本来选择是否启用并行功能。当然这项功能默是关的,需要用配置文件示开启。

 

双十一实际运行数据

84ba9197edc66785dd84b71fd7acd9e5fcfbb6ac

看到在实际线上机器的启动时间上,当开启并行功能后,模化系的启动时间提升了47%用整体启动时间提升了29%

 

配置方式

  1. tomcat的运行境是JRE7及以上。
  2. 安装ali-tomcat 7.0.59.3版本
    sudo yum install -b current taobao-tomcat-7.0.59.3
  3. 修改/home/admin/$APP/conf/tomcat/context.xml,如果个文件不存在,/opt/taobao/tomcat/conf/context.xml一份。添加如下配置:


    <Loader loaderClass="org.apache.catalina.loader.ParallelWebappClassLoader" />
  4. 重启Tomcat

  5. 成功启后,应该会在控制台看到似如下的日志:

    6.	2015-10-12 14:22:50,444 org.apache.catalina.loader.ParallelWebappClassLoader <clinit>

    INFO: ParallelWebappClassLoader registration succeeded.


开源社区

并行功能已在捐献Apache tomcat社区,并且被社区接受,在最新的Apache tomcat 7.0.65版本中已包含该项功能。

34c7d4c5112e7f5585e3f4da4a60b4b228e98206


结语

并行功能在模业务应用,以及合并部署等等景下于性能有大提升。后Ali-tomcat会在开断等方面继续发力,帮助业务提升开发诊断效率!




相关文章
|
6月前
|
Java 应用服务中间件 Apache
企业实战(2) 项目环境搭建之Tomcat部署
企业实战(2) 项目环境搭建之Tomcat部署
|
4天前
|
运维 Java 应用服务中间件
Tomcat详解(七)——Tomcat使用https配置实战
Tomcat详解(七)——Tomcat使用https配置实战
12 4
|
8月前
|
域名解析 运维 负载均衡
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
251 1
|
9月前
|
Java 应用服务中间件 Docker
Docker从入门到精通——实战Dockerfile构建Tomcat镜像
Docker从入门到精通——实战Dockerfile构建Tomcat镜像
121 0
|
11月前
|
Java 应用服务中间件 Docker
Docker Review - dockerfile 实战_使用dockerfile制作tomcat镜像
Docker Review - dockerfile 实战_使用dockerfile制作tomcat镜像
99 0
|
11月前
|
XML Java 应用服务中间件
【JavaWeb篇】快速上手Tomcat|实战项目详解
【JavaWeb篇】快速上手Tomcat|实战项目详解
180 0
|
Java 应用服务中间件 容器
springboot原理实战(15)--springboot优化和定制tomcat
springboot原理实战(15)--springboot优化和定制tomcat
452 0
springboot原理实战(15)--springboot优化和定制tomcat
|
Cloud Native 安全 应用服务中间件
【云原生 | 从零开始学Docker】三、Docker实战之安装Nginx和Tomcat
通过前面两章的学习,相信各位朋友们都在自己的服务器上安装了docker了,也熟悉了一些常用的指令,这里我带着大家去做一些简单的实战来让各位更熟悉这些指令!接下来的内容最好跟着敲一遍,记一下步骤,能让你更深刻理解!
154 0
【云原生 | 从零开始学Docker】三、Docker实战之安装Nginx和Tomcat
|
NoSQL 关系型数据库 MySQL
Docker容器实战【二】使用Docker初次部署Tomcat
初次使用Docker的同学都会使用一个已有的基础镜像作为学习练手的工具,可以是mysql、nginx、redis,这里我们部署一个tomcat来进行docker基础命令的学习
186 0
Docker容器实战【二】使用Docker初次部署Tomcat
|
应用服务中间件 Linux 网络安全
Docker实战:Linux环境安装Tomcat安装步骤
今天给大家分享docker安装Tomcat安装说明,服务器版本为Centos8,安装的tomcat版本为tomcat:8.5.38。
Docker实战:Linux环境安装Tomcat安装步骤