【转】并行类加载——让tomcat玩转双十一 @双十一实战
原文:https://yq.aliyun.com/articles/4227?spm=5176.100239.yqblog1.20.cfRztB
摘要: 今年双十一,是应用容器的最新版本Ali-tomcat 7.0.59.x应对的第一次双十一。这个版本包含的一个主要功能是并行类加载,本文主要对并行类加载在双十一期间的支持做一个总结。 并行类加载在双十一期间最主要的业务系统,在双十一期间支撑了每秒14w订单创建,是一个非常了不起的成绩!
今年双十一,是应用容器的最新版本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版本
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会在开发体验,监控诊断等方面继续发力,帮助业务系统提升开发诊断效率!
【转】并行类加载——让tomcat玩转双十一 @双十一实战的更多相关文章
- 并行类加载与OSGI类加载
这回来分析一下OSGI的类加载机制. 先说一下OSGI能解决什么问题吧. 记得在上家公司的时候,经常参与上线.上线一般都是增加了一些功能或者修改了一些功能,然后将所有的代码重新部署.过程中要将之前的服 ...
- 转:手把手教你如何玩转Solr(包含项目实战)
原文地址:手把手教你如何玩转Solr(包含项目实战) 参考原文
- java类加载器-Tomcat类加载器
在上文中,已经介绍了系统类加载器以及类加载器的相关机制,还自定制类加载器的方式.接下来就以tomcat6为例看看tomat是如何使用自定制类加载器的.(本介绍是基于tomcat6.0.41,不同版本可 ...
- 手把手教你如何玩转Solr(包含项目实战)
一:Solr简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引 ...
- Docker竟然还能这么玩?商业级4G代理搭建实战!
时间过得真快,距离这个系列的上一篇文章<商业级4G代理搭建指南[准备篇]>发布的时间已经过了两个星期了,上个星期由于各种琐事缠身,周二开始就没空写文章了,所以就咕咕咕了. 那么在准备篇中, ...
- Tomcat类加载器
1JVM类加载机制 JVM的ClassLoader通过Parent属性定义父子关系,可以形成树状结构.其中引导类.扩展类.系统类三个加载器是JVM内置的. 它们的作用分别是: 1)引导类加载器:使 ...
- 深入剖析Tomcat类加载机制
1JVM类加载机制 JVM的ClassLoader通过Parent属性定义父子关系,可以形成树状结构.其中引导类.扩展类.系统类三个加载器是JVM内置的. 它们的作用分别是: 1)引导类加载器:使用n ...
- Tomcat系列(7)——Tomcat类加载机制
1. 核心部分 1. 类加载器: 通过一个类的全限定名来获取描述此类的二进制字节流. 对于任意一个类,都需要由加载他的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一 ...
- 图解Tomcat类加载机制(阿里面试题)
Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给 ...
随机推荐
- [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取
做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...
- Java Web(一) Servlet详解!!
这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...
- 一个Python小白5个小时爬虫经历 【续】
前言 昨天实现了python简单的数据采集之后本来还挺高兴的,结果发现在.NET读取txt文件后反序列化总是报错.具体错误原因好像是从txt读取数据之后会自动加一个隐藏的字符串,没错,肉眼看不见,就导 ...
- VMware虚拟网络连接模式详解(NAT,Bridged,Host-only)
序言 如果你使用VMware安装虚拟机,那么你必定会选择网络连接,那么vmware提供主要的3种网络连接方式,我们该如何抉择呢?他们有什么不同呢?这篇我们就做一个深入. 首先打开虚拟机设置里面的网络适 ...
- 分别用C/C++实现栈
用C语言的方式实现栈: #include <stdio.h> #include<stdlib.h> #include<assert.h> struct Link { ...
- LINQ中,Single()、SingleOrDefault()的解析、示例
LINQ一般查询到的结果是IEnumerable<T>集合类型,想要从中取出单一的元素,可以使用Single.First.Last.ElementAt等方法,以及它们带有OrDefault ...
- 每天一个linux命令(38)--lsof命令
lsof (list open files )是一个列出当前系统打开文件的工具,在Linux 环境下,任何事情都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...
- 每天一个linux命令(32)--/etc/group文件详解
Linux /etc/group 文件与 /etc/passwd 和/etc/shadow 文件都是有关于系统管理员对用户和用户组管理时相关的文件.Linux /etc/group 文件是有关于系统管 ...
- 阿里云开发之OSS数据迁移
最近由于项目需求,需要将一个aliyun账号下的oss数据导入到两一个aliyun账号下的oss,经过一番坎坷,最终搞定. 1.查看oss数据迁移官方文档,我是在本地windows电脑上进行操作的,先 ...
- Android开发,Eclipse创建aidl接口时,出错
Android开发中,当我们需要调用远程Service时,我们一般通过远程接口(RMI)来实现的,而Android的RMI需要AIDL(Android Interface Definition Lan ...