今年双十一,是应用容器的最新版本Ali-tomcat 7.0.59.x应对的第一次双十一。这个版本包含的一个主要功能是并行类加载,本文主要对并行类加载在双十一期间的支持做一个总结。
并行类加载在双十一期间最主要的业务系统,在双十一期间支撑了每秒14w
订单创建,是一个非常了不起的成绩!
业务背景
由于各种原因,该业务系统比较庞大,依赖较为复杂。为了解决业务复杂性,应用引入了模块化系统,通过模块化的方式抽象出一系列的bundle,而bundle之间互相隔离,享有独立的类加载器。
由于bundle之间相互隔离,我们自然就会想到,是否能够在应用启动时多线程并行的初始化这些bundle呢?
原来的应用运行在JDK6上,Tomcat启动的时候,应用的Classloader(WebappClassLoader)在进行类加载的时候是 顺序加载的,因为JDK6上Classloader.loadClass(String name)这个方法是synchonized的,如果应用里面有多个线程在同时调用loadClass方法进行类加载的话,那么锁的竞争将会非常激烈。
大家知道在JDK7上,如果调用Classloader.registerAsParallelCapable方法,则会开启并行类加载功能,把锁 的级别从ClassLoader对象本身,降低为要加载的类名这个级别。换句话说只要多线程加载的不是同一个类的话,loadClass方法都不会锁住。 遗憾的是,开启并行类加载必须要求一个类加载器继承链路上所有类加载器都调用registerAsParallelCapable,但tomcat7自带 的WebappClassLoader并没有调用registerAsParallelCapable,所以老版本的tomcat7即使运行在JDK7 上,也无法利用并行类加载的特性。
实现原理
从Ali-tomcat 7.0.59.2版本开始解决了这个问题,支持在WebappClassLoader中打开registerAsParallelCapable方法。但 是情况没有那么简单,还需要解决的一个问题是如何兼容JDK6的问题,因为tomcat7.x版本是基于JDK6编译,同时运行在JDK6和JDK7+以 上的。JDK6下是没有Classloader.registerAsParallelCapable这个方法的,所以JDK6下必须保持原有的行为,在 JDK7下才能支持并行类加载功能。也就是说,即使用户配置了并行类加载,那么tomcat也必须根据运行时的JDK版本来决定是否开启并行类加载功能。 Ali-tomcat通过反射机制解决了这个问题,在运行时刻对应用的WebappClassLoader尝试注册并行类加载功能,当发现没有这个方法 时,会自动fall back到普通的类加载,也就是线性类加载功能。
并行类加载体系结构
可以看到,实际运行过程中,tomcat会自动根据JDK版本来选择是否启用并行类加载功能。当然这项功能默认是关闭的,需要用户通过配置文件显示开启。
双十一应用实际运行数据

我们看到在实际线上机器的启动时间上,当开启并行类加载功能后,模块化系统的启动时间提升了47%,应用整体启动时间提升了29%!
配置方式
- 确认tomcat的运行环境是JRE7及以上。
- 安装ali-tomcat 7.0.59.3版本
<code>sudo yum install -b current taobao-tomcat-7.0.59.3</code>
- 修改/home/admin/$APP/conf/tomcat/context.xml,如果这个文件不存在,则从
/opt/taobao/tomcat/conf/context.xml
拷贝一份。添加如下配置:<code><Loader loaderClass="org.apache.catalina.loader.ParallelWebappClassLoader" /></code>
- 重启Tomcat
- 成功启动后,应该会在控制台看到类似如下的日志:
<code>2015-10-12 14:22:50,444 org.apache.catalina.loader.ParallelWebappClassLoader <clinit> INFO: ParallelWebappClassLoader registration succeeded.</code>
开源社区贡献
并行类加载功能已经在捐献给Apache tomcat社区,并且被社区接受,在最新的Apache tomcat 7.0.65版本中已经包含该项功能。
结语
并行类加载功能在模块化业务应用,以及合并部署等等场景下对于性能有较大提升。后续Ali-tomcat会在开发体验,监控诊断等方面继续发力,帮助业务系统提升开发诊断效率!!
http://jm-blog.aliapp.com/?p=3721
相关推荐
本资料“高性能计算之并行编程技术—— MPI并行程序设计”深入探讨了如何利用MPI进行高效的并行程序设计。 MPI(Message Passing Interface)是一种编程模型,允许程序员在不同进程间传递消息,从而实现并行计算。...
高性能计算并行编程技术——MPI并行程序设计,
高性能计算并行编程技术——MPI并行程序设计2
高性能计算之并行编程技术—— MPI并行程序设计
高性能计算并行编程技术——MPI并行程序设计3
并行数据库——刘冠并行数据库——刘冠
并行计算是现代科学计算领域中的重要技术,它允许我们利用多核处理器或者分布式计算资源来加速复杂的计算任务。在MATLAB中实现并行计算,一个常见的方式是使用MATLABMPI(Message Passing Interface)工具箱,这个...
本书介绍目前最常见的并行程序—MPI并行程序的设计方法它适合高校三四年级本科生非计算机专业研究生作为教材和教学自学参考书也适合于广大的并行计算高性能计算用户作为自学参考书使用对于有FORTRAN和C编程经验的...
本书以并行计算为主题,主要讨论并行计算的硬件基础——当代并行计算机系统及其结构模型,并行计算的核心内容——并行算法设计与并行数值算法以及并行计算的软件支持——并行程序的设计原理与方法。本书强调融并行机...
并行计算是计算机科学中的一个...综上所述,这份“并行计算——结构·算法·编程习题答案”资料将全面覆盖并行计算的核心概念,通过习题解答帮助学习者巩固理论知识,提升实践技能,为进入并行计算领域打下坚实基础。
在《并行计算——结构·算法·编程》这本书中,作者深入探讨了这一主题,提供了丰富的习题来帮助读者理解和掌握相关概念。现在,我们来详细探讨这些习题答案中可能涵盖的知识点。 首先,结构方面,可能包括以下内容...
目前,绝大多数的高性能计算都是依赖于图形处理器(GPU)的强大的并行处理能力,并以GPU/CPU协同并行计算构架为基础来实现相关算法。GPU,也就是图形处理器,能够在单一芯片上集成大量的核心,从而在处理图像、图形...
《并行计算——结构·算法·编程》一书由陈国良教授撰写,旨在深入探讨并行计算的基本原理、算法设计以及编程实践。以下是对这本书中涉及的知识点的详细说明: 1. **并行计算基础**: - 并行计算的概念:指同时在...
本实验"多核并行实验——Ubuntu"专注于利用Ubuntu操作系统进行多核并行计算的实践与学习。 **一、多核并行计算基础** 多核并行计算是指通过利用计算机中的多个处理器核心同时执行不同的计算任务,以达到提高整体...