并行类加载——让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到普通的,也就是线功能。

 

并行体系


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

 

双十一实际运行数据


看到在实际线上机器的启动时间上,当开启并行功能后,模化系的启动时间提升了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版本中已包含该项功能。



结语

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




相关文章
|
5月前
|
XML 前端开发 Java
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
这篇文章是SpringMVC框架的入门教程,详细指导了如何在IDEA中使用Maven和Tomcat创建SpringMVC工程,包括添加依赖、配置web.xml、编写控制器、创建配置文件、配置Tomcat服务器以及进行基本的测试,展示了一个简单的Hello SpringMVC示例。
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
|
Java 应用服务中间件 Apache
企业实战(2) 项目环境搭建之Tomcat部署
企业实战(2) 项目环境搭建之Tomcat部署
|
4月前
|
监控 Java 应用服务中间件
部署tomcat部署实战案例
本文是关于Tomcat部署实战案例的教程,包括通过yum和二进制方式部署Tomcat的详细步骤,以及如何监控Tomcat服务。
222 84
部署tomcat部署实战案例
|
5月前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
8月前
|
运维 Java 应用服务中间件
Tomcat详解(七)——Tomcat使用https配置实战
Tomcat详解(七)——Tomcat使用https配置实战
1270 4
|
8月前
|
运维 应用服务中间件 Linux
Tomcat详解(九)——Tomcat虚拟主机配置实战
Tomcat详解(九)——Tomcat虚拟主机配置实战
198 1
|
8月前
|
Java 关系型数据库 应用服务中间件
Tomcat详解(五)——jforum论坛部署实战
Tomcat详解(五)——jforum论坛部署实战
99 2
|
域名解析 运维 负载均衡
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
423 1
|
Java 应用服务中间件 Docker
Docker从入门到精通——实战Dockerfile构建Tomcat镜像
Docker从入门到精通——实战Dockerfile构建Tomcat镜像
369 0
|
Java 应用服务中间件 Docker
Docker Review - dockerfile 实战_使用dockerfile制作tomcat镜像
Docker Review - dockerfile 实战_使用dockerfile制作tomcat镜像
132 0
下一篇
开通oss服务