InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

通用Ruby多虚拟机API研究开始啦

作者 Werner Schuster 译者 张龙 发布于 2008年3月3日

领域
架构 & 设计,
语言 & 开发
主题
JRuby ,
Ruby ,
性能和可伸缩性 ,
Java
标签
并发 ,
Rubinius ,
多线程 ,
JRuby ,
线程技术

过去Ruby在多核机器下运行是一个大问题 。直到Ruby1.8,Ruby的解释器一直在使用用户空间线程(userspace threading ),这意味着线程是由Ruby解释器调度运行的。Ruby 1.9通过使用内核线程(kernel threads )改变了这一切——除了它使用一个像Python那样的全局解释器锁(Global Interpreter Lock,即GIL)。GIL意味着一次只能运行一个Ruby线程,而本地代码就可以多线程方式运行。

运行在JVM上的JRuby早已开始支持本地线程了。对于多核的一个解决方案是运行多个Ruby进程,这些进程可由操作系统在多核之间调度。而JRuby线程可以使用多核,像Rails之类的应用——并不是线程安全的,他们必须使用JRuby进程——对JRuby来说这也会成为一个合适的解决方案。

使用多个Ruby虚拟机会产生很多部署问题,像如何加载新的Ruby进程、如何与其他进程通信等等。最明显的问题就是加载一个新的Ruby进程。通过下面简单的方式来加载一个新的Ruby进程

system("ruby", file_to_run)  

然而如果上面的代码运行在JRuby下,那么很多时候会产生失败的结果,前提是系统中唯一的Ruby实现就是JRuby,而它则必须由“jruby”加载。性能问题也是值得关注的:使用“'jruby” 命令加载一个或多个JRuby会导致多个JVMs的加载。既然多个JRuby实例可以共享相同的JVM,那么这就是不必要的了。但是,需要特定于JRuby的代码来完成新实例的实例化工作,这会根据主机架构的不同而发生变化,如BSF或者Java6中的实现。

Rubinius是一个Ruby实现,它现在也在使用用户空间线程, 最近它还增加了多虚拟机支持 。通过下面的代码

vm = Rubinius::VM.spawn "blah", "-e", "puts 'hello\n'"  

可以加载一个新的虚拟机。这个方案确实使用了多核,因为每个虚拟机都运行在其本地线程上。这表示所有的虚拟机都驻留在同一个操作系统的地址空间中并且并行运行。但是虚拟机不能共享任何引用,或者说——任何东西;唯一的通信手段是通过一个特定于Rubinius的消息传递API。

所有这些不同的解决方案归纳如下:跨越Ruby实现来编写运行于多核上的代码是不切实际的,因为每个Ruby实现都需要不同的处理。举例来说,如果一个程序想要使用Skynet(MapReduce的Ruby版本 ),还想使用多虚拟机来并行运行任务,那么其必须进行适配以适合每种Ruby实现。

该问题有可能被一个新的研究项目所解决,该项目是由东京大学与Sun的JRuby小组联合发起的,目的在于寻求能工作于所有Ruby实现的解决方案。下面的内容来自新闻

由东京大学信息科学与技术研究所的Ikuo Takeuchi教授领导的小组将联合Sun的Tim Bray(Web技术主管)与JRuby小组成员一起去实现可应用于Ruby与JRuby的多虚拟机(MVM)环境。该MVM环境目的在于使Ruby程序更加高效地运行。按计划,研究成果将通过Ruby社区开源,这会激发更多的创新。

以前,在Ruby上同时运行一个以上应用时需要多个解释器,这造成内存的浪费。MVM环境会在一个解释器上产生多个虚拟机实例,这会让应用的运行效率得到提高。该协作研究的目的在于明确技术问题如使用MVM的通用接口定义,虚拟机实例的并行运行以及内存共享,接下来实现可应用于Ruby与JRuby的技术。因为Ruby已经在商业和其他环境中得到了广泛的应用,所以对MVM的研究将进一步增进Ruby的性能和用途。

简而言之,期望的结果就是产生出可以加载和使用多个Ruby虚拟机的通用API。通过该通用API,每个Ruby实现将有一个后盾以确保提供最有效率的实现。对于Rubinius和JRuby,虚拟机可以共享相同的地址空间;对于老版本的Ruby,可以加载多个进程。

该API的另一个重要方面是定义虚拟机之间如何通信。可以利用Rubinius的消息传递方案,因为像Erlang这样的系统利用它来避免很多共享内存的问题。在JSR-121 Application Isolation API还使用了一个相似的解决方案。

查看英文原文:Common Ruby MVM API research kicked off
译者简介:张龙,同济大学软件工程硕士,现就职于理光软件研究所。主要从事文档工作流和办公自动化解决方案的研发工作。热衷于Java轻量级框架的研究,对敏捷方法很感兴趣。曾有若干年的J2EE培训讲师经历。参与InfoQ中文站内容建设,请邮件至china-editorial[at]infoq.com

译者 张龙 热衷于编程,乐于分享,对新技术有强烈的探索欲,对Java轻量级框架有一定研究。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。