Facebook 已将 HHVM/JIT 用于其开发和产品中

  • Abel Avram
  • 臧秀涛

2012 年 12 月 3 日

话题:PHPFacebook性能调优DevOps架构

Facebook 宣布,他们已经在产品中使用了HHVM这款支持 JIT 编译的 HipHop 虚拟机,这种方案统一了开发和部署两种环境,同时为开发者带来了显著的性能收益。

因为页面加载的性能问题,Facebook 决定实现一套从 PHP 向 C++ 转换的工具链, 该工具链即HipHop PHP,已于 2010 年开源,其中的编译器称为 HPHPc。该工具将 PHP 转化为一种抽象语法树(Abstract Syntax Tree,AST),之后 AST 被转化为 C++ 代码,最后静态编译为 x64 二进制代码。虽然这种方案能够加速 Web 页面,但是也给开发带来了一个问题,由于 Facebook 的所有开发者都有网站代码的一份完整拷贝,在开发时他们必须等待整个代码库编译完成。Facebook 的工程总监 David Mortensen 在QCon SF 2012 上讨论 HPHPc 时提到,因为网站以很高的速率持续增长,编译阶段延长到了十分钟左右,大量开发人员都要等待。

为了解决该问题,Facebook 做出以下决定:在产品代码中仍然使用编译器,同时为开发代码创建一个解释器(HPHPi),希望此举能消除编译停滞时间。这又使产品环境与开发环境出现了差异,其中存在一个问题,出于性能考虑两种环境使用了不同的 AST,而且据 Facebook 的工程师Drew Paroski介绍,HPHPi 甚至比引入 HipHop 之前的原始 Zend 引擎还要慢

面对这个新问题,Facebook 的一个工程师小团队设计了一款名为 HHVM(HipHop VM)的虚拟机,而且自 2011 年起就将其应用于开发中了。在对 JIT 进行了几个月的调校之后,HHVM 被引入了产品中,用于执行已部署的代码。Paroski 宣布,HHVM 的性能已经赶上了 HPHPc,甚至在页面加载时间上的表现还要好一点。这意味着,在 Facebook 开发和部署可以使用统一的环境了;而且随着 JIT 引擎的进一步调校,性能还有改进空间。Paroski 指出:

利用 HHVM,从运行时和基本库,到生成的裸机机器代码,我们能够为 PHP 开发栈选择范围更广的优化策略了。在未来几年,我们计划利用这种灵活性让 Facebook 的 Web 层更为高效。

能够持续改进 HipHop 的开发体验,我们也非常兴奋。改进主要体现在两个方面,一个是安装和开发流程更容易且更灵活了,另一个是支持的流行 PHP 应用和框架越来越多了。

目前 HipHop 是一种混合环境,其中部分代码解释执行,但大部分代码以 JIT 方式编译执行。据 Paroski 介绍:

HHVM 这样运行 PHP 程序,先将 PHP 源代码转换为 HipHop 字节码(HHBC),然后使用字节码解释器和 x64 JIT 编译器来执行字节码。这里的解释器和编译器可以无缝地进行互操作。HHVM 会尽可能使用 JIT,万不得已时才将解释器作为执行引擎。

Facebook 现在已将HHVM 开源,同时弃用了 HPHPi 并移除了对它的构建支持。到 2013 年中期,他们将不再支持 HPHPc。HHVM 提供了支持 Ubuntu 12.04 的预构建包以及支持 CentOS 6.3 的构建说明,而对 FreeBSD 9 和 Mac OS 的支持将于明年 HPHPc 退役之后再提供。

查看英文原文Facebook Now Uses HHVM/JIT both in Development and Production

PHPFacebook性能调优DevOps架构