BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Azul Systems将要开源Managed Runtime Initiative中的重要技术

| 作者 Charles Humble 关注 900 他的粉丝 ,译者 张龙 关注 14 他的粉丝 发布于 2010年6月22日. 估计阅读时间: 8 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

现在有越来越多的产品服务器在运行着托管代码,无论是Java、.NET、Ruby还是Python,然而无论是硬件还是操作系统,其基本设计上都没有考虑到对这种情况进行优化。这导致的一个问题就是在垃圾收集(GC)时所产生的停顿现象。

对于众多的企业架构师和开发者来说,一方面越来越多的程序被放在了内存当中,另一方面GC会产生停顿现象,如何权衡这两者已经成为一个棘手的问题。在企业级Java中,这种停顿所带来的影响可以通过分布式程序(降低堆的大小)来缓解,或是通过其他技术解决,譬如在吞吐量比响应时间更为重要的情况下,可以通过异步调用以“批处理”的方式解决。

虽然从工程角度来看,这些解决方案是合情合理的,但结果却并不理想。在与Azul Systems技术副总裁兼CTO Gil Tene的对话中,他对目前的情况和DOS时代的核心与扩展、增强的内存模式进行了比对,后者的设计目的是在PC支持的情况下,充分利用640KB限度之上的内存。

我们的经验与推测表明在运行普通的企业负载的情况下,单核的至强可以产生~0.5GB/sec的新对象。由于现在每个Socket可以持有6~8个核心,因此$20K以下的系统可以持有12~48个核心,这样在现代系统(假设CPU的实际处理能力都用在了有用的地方)上就会达到5-15GB/sec的分配率。

上面提到的~0.5GB/sec有些主观臆断,说的不太清楚,我们所看到的实际范围(每个核心从150MB到1+GB/sec不等)取决于工作负载。如果主要工作是“转换型”负载(比如消息总线、Web应用、集成服务器、DB为中心的事务性负载、数据缓存等等),那么分配率就会高一些;如果主要工作是数字计算型负载(比如蒙特卡罗模拟、加密、压缩、有限元分析等等),那么分配率就会低一些。可以通过常见的工业基准找到一些支撑数据,但我并不热衷于这些基准,主要是因为他们都忽略掉了真实世界的GC效应。关于GC,这些基准普遍存在的一个盲点是他们都是人们刻意制造出来的,但在运行时却忽略掉了GC效应,没法填满一台现代服务器并进行度量。通过与假设保持紧密的一致性并避免长期的堆搅动问题(会在运行期导致实际的压缩GC事件),他们可以长时间维持基准以度量吞吐量,接下来在包含的时间窗口之外产生完整的GC事件时有意忽略掉不可避免的失败情况。然而,就像这些基准没法推断负载下真实世界的应用行为一样,可以在每个OP分配时(几个调查已经做过这些事情了)度量其工作量,之后的数据就可以用于表示这些负载上的对象分配率了(以及生成的垃圾)。

举个例子吧:

JOP是SPECjAppServer2004基准中的操作度量(我想它代表的应该是Java操作),请查看www.spec.org来了解详情。这是一个单元数,表示没有什么东西超出了度量,但可以比较基于同样基准的结果。

编辑注:

这些OP数来自于

Azul Systems通过内置于硬件中的对写与读屏障的直接支持来解决垃圾回收问题。Dr. Cliff Click最近曾向InfoQ解释过

...可以切换到更简单的GC算法上:简单的算法更易于达到并行、可伸缩、并发以及健壮的要求。我们早就转换算法了,相比于其他竞争者来说,GC所能处理的堆容量(以及分配率)要超出一个数量级。

Tene说到即便是硬件,尤其是Intel和AMD最新的芯片都对托管负载提供了良好的支持,这样Azul GC算法就能同时应用在这两家处理器上了:

特别地,对于Intel来说,这意味着芯片包含了EPT(Extended Page Table)特性(首度出现在Intel的至强55xx中,后来的至强56xx、65xx和75xx也都加入了);对于AMD来说,芯片包含了NPT(又叫做AMD-V Nested Paging)。这些新的虚拟内存架构特性(EPT和NPT)都支持我们的GC算法,同时在x86平台上还有读屏障和高持久性的虚拟内存映射变化率。Vega处理器包含了一个客户化的读屏障指令,它具有字段检查元数据和针对GC压缩页面的特殊的虚拟内存保护。我们基于x86的JVM使用多种x86指令执行与Vega读屏障操作相对应的语义,还使用了x86虚拟内存子系统来重新映射并保护GC压缩页面,这也达到了同样的读屏障效果,同时对于Pauseless GC算法来说也保证了算法的不变性。“读屏障”指令集是由JIT编译器发出的,并有效地融入到了正常的指令流当中(在这些现代的x86-64核心管道中拥有足够的空间来容纳他们),虚拟内存操纵使用了新的OS API以追上大量虚拟内存映射变化率的步伐(超出大多数OS所能保持的100多倍)。好处是借助于现代的x86核心中的EPT/NPT和健壮的TLB(translation look-aside buffer)支持,我们可以轻松保持GB/sec的分配率:这仅仅是对软件所作的修改(比如OS内核),也是我们的Managed Runtime Initiative的用武之地。

Managed Runtime Initiative目标是采取整体研究的方法。它关注可伸缩性和响应时间的改进,旨在增强垂直组件和系统堆栈(比如运行时、内核、OS及管理程序)的接口。该项目有一个参考实现,包含了对OpenJDK(Java 6)和可加载的Linux内核对象(LKO)的增强,还有一些模块提供了新的功能与接口,他们都基于GPLV2许可。

Azul为Linux内核发布了一个针对GC优化过的内存管理、策略增强组件和新的资源调度程序,该程序兼容于Red Hat Enterprise Linux 6、Fedora C12和Suse。对于OpenJDK来说,该发布包含了一个新的JIT编译器,不会停顿的垃圾收集器和可伸缩的运行时。Azul systems说JVM与Linux的组合对运行时的增强是现在的100倍,对象分配率也提升了两个数量级(以及支持的堆大小)。

该项目还得到了Java编程语言的发明者James Gosling的支持。新闻如是说:

我对Managed Runtime Initiative以及Azul对开源社区的贡献感到兴奋。管理运行时由来已久,可以追溯到上世纪90年代。然而,系统堆栈的其他部分尚无法满足这些普适应用环境的要求。该项目会给系统栈带来很多新功能,这样管理运行时就会继续其成长和变革之路了。

开源知识产权的关键部分是个大胆的决定。Azul Systems发展迅速,上个季度的收益比第一季度提高了64%。他们希能从合作者、ISV和厂商那里获得支持以转向其他平台和运行时,比如Windows上的.NET,还有Ruby、Python等。Azul的第二个目标是希望能有商业产品使用优化的Linux和OpenJDK,但这取决于厂商的参与和支持。

查看英文原文:Azul Systems To Open Source Significant Technology in Managed Runtime Initiative

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

Great News! by Fan Cary

以前研究 JikesRVM 这个开源的Java虚拟机的时候,就了解这方面的需求。没想到真的有企业已经去做了。开源至少对学术领域是件大好事。偶尔也可以下载代码来学习一下。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT