HHVM

突发性,我们会传说关于部分小卖部采取 推特(Twitter卡塔尔国 的开源项目标作业。Box团队新近给我们发送了他们是什么使用 HHVM
的传说,是二个很好的作品。所以大家把她贴在此边,
大家多谢她们以这种措施发给大家.。我们也会谋求反馈意见.。你们能够在Facebook
Engineering 主页
或者在 GitHub沟通来大家。

By Joe Marrama, class=”wp_keywordlink”>软件技术员,Box团队

HHVM

HHVM是什么?

HHVM(HipHop
VM卡塔尔国是Fackbook推出用于在实践PHP代码的虚构机,是二个PHP的JIT编写翻译器,具备发生飞跃代码和及时编写翻译的优点。

HHVM能干什么?

HHVM脚本重要应用服务器端脚本和下令行脚本两大领域,潜心于服务器端脚本,如征集表单数据、生成动态页面、发送采纳首席施行官KIE等。

HHVM为何比ZendEngine快?

HHVM是推特(TWTR.US卡塔尔(قطر‎开荒的高质量PHP虚拟机,宣称比法定Zend快9倍。

PHP使用的Zend虚构机(VM卡塔尔(قطر‎,首先会先将PHP代码编写翻译成二进制指令opcode,然后挨门挨户实行,每条opcode指令都对应三个C函数。对于PHP的客户函数、运维时部分变量、常量会存在二个Hashtable中。

奉行一回C函数的付出

  • 参数的入栈出栈
  • CPU贮存器状态保存

例如:在PHP中执行1000w次累加

<?php
$sum = 0;
// 发生1000w次C函数调用
for($i=0; $i<10000000; $i++){
  $sum += $i;
}

若编写翻译为机器码意况是什么样的呢?

主频2.0GHZ的CPU每秒推行20亿次指令,函数调用则1秒只好运维1000W次。

因而,编写翻译为机器码试行语言如C、C++、Golang…,或有所JIT的言语如Java、NodeJS、LuaJIT、HHVM…,单从指令实施角度上看最少比PHP快几十倍。

对于字符串处理、JSON编码解码、iconv编码解码、数组操作等,
PHP比C++、Java慢呢?

在PHP中此类操作都以C扩展函数实现的,品质与编写翻译型语言相仿。

PHP到底比编写翻译型语言慢的缘由在何地啊?

PHP代码中客户函数、类、对象操作等。

运算密集型 vs IO密集型

运算密集型程序指的是需大批量施行内部存款和储蓄器复制操作、循环、运营指令等,瓶颈在CPU上,提高质量的化解方案正是进步CPU硬件配备、校正算法、进步语言/工具的施行品质。对于此类程序,PHP质量难点很显眼,执行同样的逻辑,比C/C++慢几十倍以致老大,这是不行接收的。

IO密集型程序瓶颈在IO等待,比如HTTP央求实行100ms后赶回,此中90ms查询数据库,8ms读写文件,
那么不论C/C++依旧PHP,央浼响应时间总是100ms左右,语言质量优化唯有2ms的上空。

哪些优化PHP呢

  • PHP语言层面优化
  • 优化PHP官方达成ZendEngine
  • 将PHP编写翻译为别的语言字节码(bytecode卡塔尔国,依赖于其余语言设想机来运营。
  • 将PHP转成C/C++,编写翻译花销地代码。
  • 开采越来越快的PHP设想机

Zend的实行进程可分为四个环节

  • 将PHP编译为opcode
  • 执行opcode

优化opcode可编码重复剖判PHP与静态编写翻译优化,由于PHP的动态性,这种优化措施是有局限,乐观猜度可进级十分之四的习性。

优化opcode布局本人,专业量大投入发生比不高。

优化opcode执行,Zend解释器interpreter在读到opcode后会依据差异opcode调用不一致函数(switch卡塔尔(قطر‎,在函数中实行语言相关的操作。优化空间十分小。

优化Zend试行质量,对于函数调用的开支,通过inline
threading来优化,其原理如C中的inline关键字。

越来越快的虚构机

HHVM 为啥更加快,原因是JIT。

JIT操作本人是耗费时间的,对于简易程序恐怕比interpreter慢。HHVM的向上便是不停优化、优化、在优化。

图片 1

HHVM是何等抢先HPHPc

怎样是JIT,如何兑现一个JIT?

动态语言中挑咸阳都会有贰个eval(卡塔尔国,成效是传播一段字符串来试行。JIT做着相符的事,然则它要拼接的不是字符串,而是差异平台下的机器码,然后实践。在JIT中更要紧的优化是根据项目来扭转特定的下令,进而收缩指令数量和规范化剖断。

花色推导

JIT的重点是估算类型,变量的品种若是老是变就很难优化。HHVM技术员思谋在PHP语法上欺上瞒下,加上项目标支撑,推出Hack。

<?hh
class Point
{
  // 使用静态类型可让HHVM更好的优化性能,不过这也意味着和PHP语法不兼容。
  public float $x,$y;
  public function __construct(float $x, float $y)
  {
    $this->x = $x;
    $this->y = $y;
  }
}

HHVM升高PHP推行品质

HHVM生成和奉行PHP的在中等字节码,试行时通过JIT(Just In
Time即时编写翻译,软件优化本事,指在运维时才会去编译字节码为机器码卡塔尔转变为机器码实施。JIT将大气双重实行的字节码在运维时编译为机器码,到达进步施行成效的指标。常常触发JIT的标准是代码或函数被多次重复调用。

怎么是字节码?

图片 2

字节码

ZendEngine做法是先编写翻译为opcode,逐个推行,每条指令对应的是C语言品级的函数。

HHVM服务器最最初的个别央求会比其余的慢,因为它必需在施行PHP和Hack代码以前将它们编写翻译成机器码,这么些效应是那三个肯定的,所以你不应当马上把贰个新装置的HHVM服务器应用来临蓐条件中。你应有首发送一些人工模拟的央浼到这几个HHVM服务器上,对它实行热身。
实在,服务器运营的时候,并不会编写翻译任何代码。初始的乞请正是在HHVM的字节码解释器下运营的。原理便是:对于叁个web服务器来讲,最先的多少个央浼是不通常的。在这里个之间,先导了初阶化,还对缓存举行填空等等。对那个代码路线的编写翻译对完全质量的表现是那三个不佳的,因为一旦对服务器进行了预热,这一个进度是不会被平时调用的。HHVM还运用那些需要,来搜聚一些代码所用到的数据类型分析的干活。所以它能够稍后越发管用地张开编写翻译。你能够采用选取hhvm.jit_profile_interp_requests 来调动这几个门槛。
对此发送预热供给,颗通过命令行或其余形似的地点,轻易地应用 curl
那个命令功用。为了取得最佳的结果:
动用你愿意在成品中看看的,能够代表最普及的诉求的叶影参差会集。比方,如若您期待所有对那个产品的恳求中的十分之二都以达到index.php 的,那么您的 伍分叁 的预热必要都 应该是到 index.php 的伸手。
防止相互发送八个预热乞求,若你真正相互发送了多少个恳求,那么并不会并发什么难点。单对于JIT编写翻译器来讲,若未有同时工作在多少个央浼上的话,它往往能够转移更加好的代码。
提及底,你最棒有个经过脚本用于服务器热身,这样的话,颗在指令行里仅仅实行贰个指令就能够产生热身了。不过在最先期的时候,你还须求部分人造的涉企,要实际总计出用于热身的须求数量是老大微妙的,
那根本在于你的顺序本人。

调整和收缩延迟和充实大家的底蕴设备的技巧一向是 Box最优先思忖的标题。大家努力以最实用的不二诀要提供最棒的客户体验,而且早先作者们的
PHP
还采取不与那几个目的一致。笔者很高兴地说,对于那五个目的大家前段时间获得了特别显明的上进,成功的布局了
HHVM(HipHop设想机)作为大家 PHP
代码的分级引擎服务;在那篇文章的其他部分,小编将详细介绍怎样使用PHP,如何利用HHVM,我们所直面的挑战是HHVM迁移,和提供一级的本性。

Box中的PHP

在 Box 里,PHP
是开垦栈的主导部分。即便大家在大气的后台服务中使用了广大言语,但是各种后台服务都务求大家第一和
PHP web 应用进行相互作用。从 Box 诞生那一天起始,大家付加物的基本成效都以选用PHP 来兑现的。

暂缓由超越148个活泼贡献者编写的和超过75万行代码组成的还在不停狠抓的
PHP代
码所推动的延期是最大的挑衅。大家不能够对我们提供劳动的好些个页面进行缓冲管理,因为客商平时希望
Box上的多姿多彩的动作都是原子性的。随着大家付加物的持续成长、演化,那本人就能叠合延迟。大家已经一向投入庞大的卖力来压缩延迟,不过就如平素从未找到好的不二秘技。大家重构了旧的、效能低下的代码;把一些自个儿可独自做为组件的领收取来做为
PHP
扩充;那样就能大方地缓冲央浼时可分享的维持不改变的情景,然则,所做的整套都只是有一些地压缩了推迟,所取的成效超轻松由新的效能来代替性的兑现。但是自二零一八年我们花时间对
HHVM 实行完好评估此前,那全部就具有改观。

HipHop 虚拟机(HHVM)

HHVM 是由 脸谱 带头开拓的开源 PHP 解释器。它诞生前期是做为 PHP 到
C++ 的编写翻译器,是对 照片墙 的 PHP
代码库进行大批量的剪裁幼功上爆发的,不过,最近几来它曾经成长为贰个即刻(JIT)编写翻译器。简言之,即时编写翻译器正是以联合的秘技对常常索要实施的
PHP 代码块进行编写翻译并装载。演进为即时编写翻译器也使得 HHVM 获得了与多如牛毛 PHP
解释器大概大同小异的作用,同期 HHVM 现在还帮助越来越多 PHP
语言的动态机制。举个例子,旧的 PHP 到 C++ 的编写翻译器就不能够运营 PHP
的”eval”语句(”eval”是把字符串充作 PHP 代码来推行,而 C++
不辅助那样的机能),而新本子的 HHVM 就能够。由于 HHVM
已经成长为即时编写翻译器,由此它曾经稳步大批量轮番了规范的 PHP 解释器。

一年多原先,我们就在意到 HHVM 团队把大批量的精力都集聚在赢得与普通的 PHP
解释器同样的机能上。过去,大家已经对 HHVM 举办业评比估,不过评释要让 HHVM
精确地运作大家付出的 web
应用特不便。不过,这一次我们再一次招待这一挑衅,对 HHVM
实行周到评估,明显它在延迟地方的功能。把 HHVM 归并到大家的花销栈里和让
HHVM
运转我们有的代码是一项十分关键的职责,可是潜在回报非常快注脚大家的竭力是值得的。大家最先的试验显示:HHVM
运行叁个主干端点要比暗中认可的 PHP 解释器快四倍多。

那标记着为期一年的把我们的成品安全地移植并运维在 HHVM
上的拼搏起先了。在移植进度中,大家在开垦栈的居多地点都遭逢琳琅满指标挑战。我们碰到超越二分一十分重要困难其余人在运作时也会遇见。在接下去的一有的,作者将详细表明运行HHVM 时经常蒙受多少个困难:化解存在在 HHVM
和暗许的解释器之间的意外的不宽容性;回避二者之间可预料的不宽容性;对
PHP 的配备开展缝补;确认保障在这里一掺杂意况下全方位能够特别优秀的运维。

收获同等的功用

PHP
是贰个可怜庞大的言语。仅它的焦点运维蒙受就包涵大量的函数,配置安装和大批量的类,这个都以十多年的组织进献积攒而来的。这照旧还不包蕴大气的
PHP 扩展,全体这么些扩充也亟须移植到 HHVM 上。让 HHVM 具备与默许的
PHP解释器大约完全相近的功效自个儿便是惊人的尤为重要壮举。大家试图求证这两个运维时蒙受行为上的反差。

咱俩发掘一大波的运维时差距是在 PHP
中大概不日常应用的地点。个中有个别差异是极易开采的荒唐,通过单元测量检验就可开掘错误。而一些间距则是东躲西藏很深的漏洞,那些漏洞可引起特别凄惨的后果。HHVM
每一日都会相像 PHP
解释器所提供的成效,但是移植这么高大的代码库必然会使更加的多的表现上的差异浮出水面。自动测验是一种最安全的涵养办法,它能够防除那一个影响到客户成效的运作时差距。要让
HHVM 通过我们的 PHPUnit
测量检验套件是要花大气力的,即要进行过多修修补补工夫赢得同等坚决守住。手工业测量检验则是另一种必得的有限扶持措施,特别能够找到外界服务和
HHVM 之间彼当时现身的谬误。在 HHVM
使用在生育遇到前,大家经过自动测验和手工业测量检验混合的法子开掘了汪洋职能存在差别的地点。

对 HHVM 运维时情形差别的修补进度格外风趣。HHVM
组织非常活跃,在异常的短的时刻内就能够在
GitHub
或者 HHVM 的 IRC
聊天室获取扶助。HHVM
的代码库丰富利用到了现代C++的种种零件,同期了然和给代码库做出进献也相对轻便多了。在发表HHVM 以前,大家贡献了大概 20 个用于解决成效不相同等难点和升高效率的补丁。

陈设方面包车型客车间距

在进行移植时期,大家开掘四个运营时情况几人展览馆现方面不等同的地点,这么些分裂等使得基本的安排有所分化。那可能是内需解决的最棘手的差别化难点。举个例子,HHVM
的多路管理模型(MPM)与原先我们已经采纳过的 Apache prefork
多路管理模型完全两样。HHVM 给每一种央浼提供劳动的是三个劳力线程,而
Apache prefork
则给每一种诉求提供服务的是四个劳重力经过。那对大家的话就有点挑战。一旦开采难点所在,大家率先要做的就是开展相对简单的尾巴修复-大家早已选拔过
PHP 的历程 ID 来分别日志文件和任何一时文件。由于 HHVM
使用的是单纯进度,因而当前的进度 ID
是不可能用来分别并发的多少个央求了。开掘到这些漏洞后,大家对代码库中可能选拔新多路拍卖模块影响的享有效能扩充了叁遍全面的审查批准,例如,设置创立文件的情势的掩码和切换目录。

一个特别令人意想不到的行事上的反差是透过运转 PHP
的”memory_get_usage“函数使本身显揭发来的,那一个函数是用来举报分配给当下倡议的内部存款和储蓄器数量的。对于某种央求流,大家将依照那么些函数陈说的数值准期地刷新内部存储器中的缓冲数据。这些间距影响到
HHVM 的内部存款和储蓄器预分配库
jemalloc。jemalloc
是二个依据 Slab
的分配器,这种分配器分配的是各类大型的内部存款和储蓄器块,超小的内部存款和储蓄器分配则由那几个内部存款和储蓄器块来分配。HHVM的“memory_get_usage”再次来到的是分配给有些央求的兼具
slab
的总的大小,实际不是实在这里个央求正在利用的slab内部存款和储蓄器的数据。当大家世袭以同一的必定要经过之处运转HHVM的“memory_get_usage”时,特定的倡议流就能够身不由己行为错乱,就能在当地缓冲数据区乱冲乱撞,那早晚使得后台系统负荷大大地追加。很幸运,能够完全修补那么些主题素材:通过改换HHVM
陈述的内存机制使得其申报的是该供给实际上利用的本地内部存款和储蓄器数量(即透过安装参数
“$real_usage” 参数为 true 实现)。

由 HHVM
的多路管理模块(MPM卡塔尔国的差距还引起了另多少个更是严重的题目:内部存款和储蓄器泄漏!在
Apache prefork
的多路管理模块(MPM卡塔尔里,缓慢的内部存款和储蓄器泄漏不会太引起大家的钟情,因为工小编经过在服务完点滴的号令后会被回笼。而在
HHVM 里,这种待遇不再有了。大家在多天非规范负载的 HHVM
上碰到了十三分麻烦管理的内存泄漏。经过一大波对 jemalloc
的细心设置,大家追踪到难点是由第三方库引起的,并随时对其打上补丁。打上这几个补丁之后,在无数天服务数百万个诉求的境况下,HHVM
的内部存款和储蓄器消耗始终维持平静。

更正布署

HHVM运转在最好品质时有两点极度的,那八个例外点倒逼大家再次考虑了一下大家PHP应用的配备方式。第三个不一样点是HHVM须要对新编写制定代码“热身”未来本领完成最好质量。由于HHVM是一个即时编写翻译器(JIT卡塔尔国,因而须求对新编写制定的代码运转五回后,本领搜集到丰富的音信,进而对那些代码进行改换,最后到达有效装配。实际上,在对脚下恳请服务早先,那样的转移是发出在curl诉求的多少个主要节点上的。第一个不一样点是规律性地再次起动HHVM以达成最好质量。那使得进级HHVM就轻松多了,同不时候也是三个保持HHVM和其连接库现身内部存储器泄漏的好措施。要满意上面两点需求对Apache经常的PHP陈设稍作调节。

先前笔者们是经过Apache
web服务器单个实例为任何站点提供服务的,同不常间我们因而转移指向当前代码库的标识链接来促成多个代码库之间循环访谈的。今后,我们应用多少个HHVM实例为各样必要提供不间断的劳务。经常景况下,个中一个HHVM实例为当下利用的具备诉求提供服务,此外四个实例做为备用,为以前的运用和原先的早先的运用提供劳动(见下图)。每一个HHVM
web服务器都照准叁个相对路线,因而当我们必要配备新本子的时候,大家假诺停止指向旧版本的web服务器,运转针对新本子的服务器,并利用几个curl央浼对代码库进行热身,再重定向要求就足以了。这种安顿方式满意了上段涉及的多个区别点,那样能够十分轻巧地落到实处回滚和中期测量试验。要回滚到以前版本,大家能够把央求重定向到提供早先版本代码服务的HHVM实例上(注意那些HHVM实例已经在运营)。要对新构造的应用进行中期测量试验,大家即使把一部分央浼路由到新的HHVM实例上,测量试验一向声音在耳边不断鸣响到大家坚信新的安排稳定期结束。这种陈设已注明那么些强大:在生产景况下能够拍卖大体量的央求。

图片 3

常见的HHVM服务器

图片 4

计划代码后的HHVM服务器

现有的交集情形

而不是奇异,迁移到 HHVM
进度中最危急的有的是将其出产使用。没有丰盛的测量检验以保险 HHVM
在临蓐条件中能够圆满处理全部央求并与世襲系统宏观包容。HHVM
在预临盆条件中的重度测量检验中表现可以,可是大家任然对此表示匪夷所思。其他,大家无法提供三个独立的只读坐褥情形供
HHVM 测验,并且大家不能够容许有别的的停机时间。对大家的话,应用 HHVM
独一有效的格局是有所持久,充足观望的试验进程的可控情势。这亟需使 HHVM
运转在与 Apache 和暗中认可 PHP
解释器肖似的处境中。唯有在这里种气象下最终存在,才方可使大家中标放出
HHVM,而不会使 HHVM 对客户有不好的一面影响。

小编们的 PHP
代码库与大气的不如后端系统相互。幸运的是,绝大超级多并行的产生是通过 curl
对在那之中 REST
APIs 的央浼,curl
是通过非常丰富测量检验和安静的 HHVM curl 增添。大家选拔 PDO
扩展来与大家的
MySQL 数据库服务器人机联作,同样显示出了与暗许 PHP
解释器相符的效果行为。大概有神秘麻烦的后端系统是
Memcached,为了保险四个运行时中总体的互操作性,多个运营时都必须要有所坚决守护相等的
Memcached
扩充况且都必须是同样的系列化对象。如若此外叁个运作时的种类化对象有例外行为,在另叁个周转时中从
Memcached
中平复对象系列化在分歧格式时就能够轻易变成严重破坏。我们在混合境遇中张开了无数的实验以作保五个运营时都不会恶化
Memcached
或别的此外后端存款和储蓄。全部工作都展现的很好,除了多少个小标题:ArrayObjects。在正规的
PHP 解释器中,完毕 ArrayObject 的强大定义了八个自定义的队列格式,不过HHVM 中只行使职业的靶子系列。大家需求在大家的使用中禁止使用 ArrayObjects
缓存以有限扶持 Memcached
的互操作性。幸运的是,大家在盛产此前或进度中不会再相见其余其余的互操作性难题。

在上线进程中,贰个特别管用的拍卖工具就是大家简要到爆的主机调换法。纵然使转变来HHVM
的历程尽大概轻易是一件再鲜明可是的事,但它任然值得我们在富有场面拿出来璀璨一下。我们决定通过
puppet 将 HHVM 计划在叁个 host-by-host 功底上,调换进程是透过 puppet
中能够由主机名调度的一个证明调节的。主机转产生 HHVM
和回滚的操作仅仅须要调动标记的规范化,不须求从负载平衡器上移除主机,也无需做任何任何事。完整的回滚操作能够五分钟内到位,多主机三次性连忙迁移和回滚是必得的。

上线进程中咱们具有互连网采取的登入和监督种类是任重(rèn zhòng卡塔尔而道远的,可是有一种样式的监察被申明极其有用;监控HHVM 错误日志以得到新的不当。我们保险了贰当中间数据库,它蕴涵有我们从
Apache 错误日志中观测到的有所极其的 PHP 错误。当上线 HHVM
时,那一个种类报告大家富有发生在 HHVM
上的新错误,通过对错误实行归类,并选用 PHP
错误数据库剖断其是还是不是是叁个事情发生在此以前存在的不当。那使大家越来越多地询问到 HHVM
是还是不是产生了其余新的退化。

大棒末端的胡萝卜:HHVM 的受益

图片 5

绝大大多基本功设备迁移到 HHVM 期间的劳务器端延迟。迁移大约是在 10:50am 到
1:00pm 之间举办的。

与我们最早的估测一致,HHVM
小幅度地裁减了服务器端延迟。上边包车型大巴图纸展现了作者们将超越八分之四生育底子设备迁移到
HHVM 这天的迁移时期服务器端延迟。从图中得以直观地看出,HHVM
分明地减小了劳务器端延迟。HHVM 平均能够将服务器端的推移减少为本来的
2/5,这里的服务器端延迟是伸手步入大家的底工设备到响应离开之间通过的时刻。更令人回想深刻的是,这一个数字包罗等待后端服务响应的日子,本质上,全部的央求都对广大不相同的服务开展了调用。未有HHVM,很明显大家不恐怕有任何艺术得以那样宏大地消减延迟。更珍视的是,HHVM
对延缓的熏陶能够从客户的反响中轻便获得。

图片 6

大大多幼功设备迁移到 HHVM 时期叁个数额主导的 CPU 使用率。

HHVM 也能够大幅度升高功效。上边的图纸是大家超越八分之四服务器迁移到 HHVM
时期的平均前端 CPU 使用率。能够见见,CPU 的使用率约为本来的
54%。那免费地将大家的前端体积扩展了一倍,因为 CPU
使用率是我们前端机器的要害范围因素。在我们的圈子内,那将确定节约服务器的费用、电力消耗和对数据基本体积的急需。

HHVM 在速度和高效性之外还提供多数令人诧异的效果,包涵:

  • 运维 Hack 代码的力量。Hack提供大多大家想要的法力,包涵一个有表现力的项目系统,一个等级次序检查器和对异步推行的扶助。大家认真地评估了在大家的
    PHP 代码库云南中国广播公司大利用 Hack 的势头。
  • 精致的天性解析工具。HHVM 完成了相当多性质解析机制,包蕴那多少个能够在
    XDebug 扩大中找到的,和叁个被誉为 Xenon 基于时间的抽样解析器。HHVM
    还与 jemalloc 的内部存款和储蓄器剖判工具完美结合以提供详细进度规模的气量和解析。
  • 更加大地晋级速度,功效和代码品质的可能性。HHVM
    在这里一领域提供的重大惠及就是“仓库授权”形式,在此地,你能够将 PHP
    预编写翻译成人中学间代码并使其代表运转,仓库授权形式禁用比较多的 PHP
    动态脾气,举个例子将字符串作为 PHP
    代码推行。我们的阅世是,使用它能够坚实 15% 的速度和功能。
  • 一个非常活跃的社区。HHVM 在争取与默许 PHP
    解释器相同地位的征途上比非常快上扬,并扩充质量升高和扩张移植。HHVM
    正处在三个快速的版本迭代进程中,社区对难题和和并乞求的响应极其迅猛。

简单来说,将 PHP 运转时迁移到 HHVM
并不是二个差十分的少的经过,不过是件十一分值得的事。必大家必得小心进行,提前做大量的测量检验况且要时时保持警惕,完全有超大只怕安全且零停机地产生那个历程。须要特意关注的是布署构造,转变方法,对具备运维时的不相配进行修补和督察。HHVM
在没日没夜受 CPU 节制的 PH
P应用时具备非常伟大的潜能,并且它还享有众多任何优点。大家对此 HHVM
以往驱动 Box 感到格外欢喜,並且将为越来越开掘 HHVM 的潜能,使 Box尽恐怕地快速可相信地劳作。

相关文章