JBoss7项目lead Jason Green,最近在他的blog 上,回答了这个问题. 以下是这篇blog的译文:
用Ahmdahl法则(高效并行)而不是Moore定律(等待硬件能有更高的时钟频率)来设计JBoss7. 目前几乎每台台式机,笔记本和服务器都至少有两个CPU核心,而且多核的趋势还在继续。 CPU 时钟频率竞争的时代其实已经终结。所以软件也必须要适应这一趋势,充分利用硬件的计算能力。
JBoss AS进行了一次重大的改变来获得这一关键的演进(evolution).我们重写了AS7,使得它的整个架构是一个全新的,高性能的和可管理的。在令人惊谈的工程师的努力下,我们从在github上一个很小的原型,在一年多的时间里实现了今天看到的具有巨大工作量的遵循Java EE Web Profile标准的J2EE服务器(更不用说我们在这期间发布了AS6,使得JBoss的用户可以早点得到关于EE6的新特性,新技术)。
在开始详细的解释以前,请允许我给出一些背景知识。应用服务器的核心问题是管理服务(service).在现代的应用服务器中几乎所有的部件都有生命周期,那就意味着在特定的时间点上,这个部件必须被启动,在以后的时间点,它必须被停止。 我们将所有具有生命周期的对象都看作是一个service.另外一个service重要的属性是,service和service的之间的依赖关系会影响到相应service的生命周期。举个例子,servlet的service依赖于web server.另外,如果这个sevlet使用到其他的资源,比如数据库连接或者是EJB,那么它也依赖于这些资源,这些依赖的资源可用以后自己才能启动。 但一个应用服务器启动或者部署时,它必须保证它能够按照正确的顺序将各种service启动。进一步,如果任何服务由于某种原因停止了,它必须能停止所有依赖于这个service的其他sevice(以相对于启动相反的顺寻停止).这在单线程的环境下是一个简单的问题。
但JBoss AS7实在并行的启动和部署这些服务。这个复杂的问题通过我们全新的服务容器解决: JBoss Modula Service Container. MSC是一个高级的并行状态机。它在运行中分析服务之间的依赖关系,并且在同一时间尽可能多的启动服务,但同时又遵循服务间的依赖关系。这就意味着不仅能够快速启动,而且能够并行的进行部署。
除了并行的service,JBoss AS7还有类模块化和并行的类加载技术。通过将类划分到恰当的类模块中,应用服务器可以自然地优化访问模式,仅仅查找一个点,就可以获得所需要的类。另外,由于限制了类模块之间的可见性,查找就没有没有那么大的开销。对于JBoss Modules, 类模块解析和查找的时间复杂度是O(1).所有的这些操作都有很高的并行性,甚至大部分的类定义也是并行的。
AS7对部署的处理也是高效的。一个主要的优化是我们通过快速扫描部分class来对annotation信息进行索引。为了取得更好的效率,我们允许模块预先生成空间效率指数(space efficient index)来更快的加载。另外一个部署时的优化,是我们谨慎的缓冲和再使用relection data,因为JVM在这方面不是很有效率。
最后,另一个重要的原因我想强调的是我们已经并且会继续会守护CPU和内存在启动和部署方面的使用情况(尽可能的少占用内存和CPU,做到尽可能的高效)。这就是在设计阶段就作出的好决定。一个有趣的例子是我们不再使用JAXB(或者其他内省机制驱动的绑定器)来解析只读一次的配置文件。JAXB或者其他采用内省机制的绑定器带来的是几乎用和真正做实际解析工作一样或者更到时间来处理如何解析。所有的这些意味着: 在AS5和AS6里处理XML的时间都比AS7的启动时间要长。
希望这些内容能够更好的从大的方面理解AS7如何获得高效性得以快速启动,为什么JBoss7与过去有很大的不同。这篇博客只是一个开始,继续关注我的下一个blog,我将讨论Jboss7的roadmap
转载请注明:IT运维空间 » linux » 为什么JBoss AS7 这么快
发表评论