课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在访问互联网的时候一般都是通过浏览器来实现的,而对于用户来说,浏览器的访问速度和加载速度以及安全性成为了考核一个浏览器是否合格的主要标准。
今天,我们就通过将火狐浏览器来作为一个案例进行讲解,下面我们就开始今天的主要内容吧。
使用coarse-grained并行作为基础
为了变得更快,我们要利用在过去10年里硬件的变化。
我们并不是第一个这样做的。Chrome在首次推出时就比Firefox更快,响应速度也更快。其中的一个原因就是Chrome的工程师看到了硬件的变化,并更好的利用了这一点。
一种新型的CPU开始变得流行。这些CPU拥有多个核心,这就意味着它们可以独立完成任务,但同时也是并行的。
这可能会变得棘手。使用了CPU的并行性,可能会产生一些难以查看且难以调试的细微错误。例如,如果两个核心需要在内存中对同一个数组加一,如果没有足够小心,很容易出现一个将另一个覆盖的问题。
一个很简单的方法去避免这些各种各样的Bug就是仅保证两个东西(功能)的运行不会共享内存——在你的程序里把很大的任务拆分为不需要过多(协同)合作(的子任务),这就是粒度并行性。
在浏览器中,可相当容易找到这些粗粒,每一个选项卡都独立地工作。还有围绕该网页的东西——Chrome浏览器——可以独立处理。
这样,页面可以同时工作,而不会互相阻塞。如果在后台选项卡中有长时间运行的脚本,它不会阻塞前台选项卡的工作。
这是Chrome工程师所预见的机会,我们也看到了,但是我们实现它的道路更加颠簸。从我们有现存的代码基础,我们需要计划如何拆分代码库,以利用多个内核。
过了段时间,我们实现了它。随着这个“电解”项目的实现,我们最终实现了为所有用户默认启用多进程。量子(浏览器)已经使用粗粒度的并行性,甚至比其他一些项目更好。
电解
“电解”为量子项目奠定了基础,它引入了一种类似于Chrome的多进程架构。因为这是一个重大的变化,我们和一小部分用户在2016年开始缓慢地引入、测试它,然后在2017年年中推送给所有Firefox用户。
量子合成器
量子合成器把合成器转移到自己的进程中。这里最大的成功是使得Firefox更稳定。有一个单独的进程就意味着一旦图像驱动崩溃,它不仅不会使得所有的Firefox的所有页面崩溃,这个独立的进程使得Firefox更具响应能力。
QuantumDOM
即使在内核之间拆分内容窗口,并为每个内核分配一个主线程,主线程仍然需要执行很多任务。而其中一些比其他更重要。例如,响应按键比运行垃圾收集更重要。QuantumDOM为我们提供了一种优先处理这些任务的方法。这使得Firefox更具响应能力。这项工作大部分已经落地,但是我们仍然计划进一步采取一些称作抢先式调度的方法。
充分利用硬件的fine-grained并行性
然而,当我们展望未来时,我们需要比coarse-grained并行更进一步。
coarse-grained并行更好地利用了硬件...但并没有充分利用硬件。当你把网页分给不同的内核去做时,有些内核可能就没有被分配到工作。因此这些内核就会闲置下来。与此同时,如果CPU是单核的话,由新核心启动新页面的时间就会变得更长。
如果能够使用所有的内核来处理新页面,这将非常好。这样你就可以更快地完成这项工作了。
但是如果使用coarse-grained并行,你不能把任何任务从一个内核分离到另一个内核,任务之间是没有界限的。
通过fine-grained并行,你可以将一个更大的任务分解成更小的单元以便于发送给不同的内核去处理。例如,如果你有类似于Pinterest的网站,你可以把它分成不同的固定模块,将它们发送给不同的内核去处理。
这不仅有助于缓解像粗粒度并行这样的延迟。它也有助于速度的提升。页面会加载得更快,因为计算被分解到了不同的计算内核。随着您添加更多的计算内核,页面会加载越快。
所以我们看到这是未来,但是如何到达那里并不完全清楚。由于要使这种细粒度的并行更快,通常需要在内核之间共享内存。但是这会带来我们之前谈到的那些数据竞争的问题。
但是我们知道浏览器必须做这个转变,所以我们开始投资研究。我们创建了一个没有这些数据竞争问题的语言——Rust。然后,我们创建了一个浏览器引擎——Servo,以充分利用这种细粒度的并行性。通过这,我们证明了这一点可以发挥作用,并且在加快速度的同时可以减少错误的发生。
QuantumCSS(也称作Stylo)
使用Stylo,CSS样式渲染的工作在所有CPU内核中完全并行化。Stylo使用了一个称为“工作窃取(workstealing)”的技术来高效地分离内核之间的工作,使得每个内核都保持忙碌的状态。通过该技术,会得到一个线性的加速效果。可通过使用拥有的所有内核来为CSS的样式渲染分配时间。
QuantumRender(具有WebRender特性)
有关硬件的另一部分是可以高度并行的GPU,它拥有成百上千的内核。即便如此,我们仍然需要确保让GPU的多核尽可能地保持工作状态,从而提升效率,这就是WebRender所做的工作。
WebRender计划于2018年推出,它将充分利用现代GPU。同时,我们也从另一个角度来解决这个问题。高级图层项目修改了Firefox的现有图层系统以支持批量渲染。通过优化Firefox当前的GPU使用模式,我们获得了立竿见影的效果。
QuantumFlow
QuantumFlow的团队是强大的,但他们不关注具体子项目的进度,他们主要关注的是一些特殊的场景,例如,社交媒体的信息流的加载,和研究如何让Firefox加载得更快。
QuantumFlow给我们带来了巨大的性能优势。在此过程中,我们还开发了工具和具体流程为了更容易的找到了追踪类似的问题。
QuantumFlow现在怎么样了?
在这个过程中们非常成功——一次识别并集中在一个关键案例上——并把它变成我们的工作流程的一部分。为了做到这一点,我们将要提高我们的工具,所以我们不再需要一支专门的团队来解决特定的问题,而是更多的工程师追踪这些问题并解决问题。
但是用这种方法有一个难题。当我们优化一个用例时,我们需要逆优化另一个。为了防止这种现象,我们添加了许多新的跟踪,包括改进CI自动化运行性能测试,遥测跟踪用户体验,以及bug内部的回归管理。通过这些举动,我们期望FirefoxQuantum会越来越好。
译作:南宫冰郁,Tot_ziens,public_jian,soaring,局长
来源:开源翻译
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!