【IT168 评论】MapReduce、BigTable 等系统的创造者 Jeff Dean 于 2013 年 1 月 19 日在斯坦福大学演讲的内容纵贯系统软件与机器学习两大领域。通过对资源共享及其带来的响应时间波动问题、异步分布式随机梯度下降算法及其应用这两块主要内容的介绍,Jeff Dean 深入展示了通用、简洁、Just Works 系统的强大魅力。同时演讲中展示的在深度学习领域取得的突破尤其振奋人心。
在 Google 众多杰出的计算机科学家中,Jeff Dean 可能是最知名的。这不仅是因为 Jeff Dean 设计的 MapReduce 和 BigTable 等系统人尽皆知,开风气之先,也因为 Jeff Dean 比较喜欢做技术演讲。虽然只涉及 Google 强大技术的只鳞片爪,Jeff Dean 的每次演讲都足以成为我们学习模仿的对象。
2013 年 1 月 19 日,Jeff Dean 在斯坦福大学做了题为“Large-Scale Data and Computation: Challenges and Opportunities”的演讲,从系统领域讲到机器学习领域,内容同样让人耳目一新,非常值得细细学习。
在这次演讲中,最核心的内容有两点:一是资源共享及其带来的响应时间波动问题;二是异步分布式随机梯度下降算法及其应用。
资源共享及其带来的响应时间波动问题
首先介绍资源共享及其带来的响应时间波动问题。为提高硬件资源利用率,Google 的每台服务器可能同时承担很多种任务(看来 Google 虽然财大气粗,也是非常关注节约硬件成本的)。如图 1 所示,一台服务器可能既负责存储 GFS 中的某些 chunk 和 BigTable 中的某些 tablet 及承担一些 CPU 密集型的计算,又可能动态按需执行一些 MapReduce 的任务或应用逻辑。
资源共享,虽然能极大提升资源利用率,但同时也会导致操作响应时间变得不稳定。这是因为资源利用率越高,业务负载波动导致系统局部过载的概率就越大。
对于 Google 这样的复杂系统,基础操作的响应时间波动带来的影响更大。如图 2 所示,一次 Google 搜索需要通用 Web 搜索、广告、新闻等众多服务的配合,这些服务又需要存储等基础服务的支持。这样,一次搜索就会产生极大量的基础操作,这些基础操作的响应时间波动带来的影响就会被层层放大。为理解这一点,Jeff Dean 做了一个简单的计算。假设 1 次基础操作的平均响应时间是 10ms,99% 响应时间是 1 秒。
如果 1 个业务操作需要做 100 次这样的基础操作,那么它的平均响应时间是 1 秒。这看起来似乎可以接受,但如果更仔细地计算一下会发现,实际上高达的情况下某些基础操作的响应时间将超过 1 秒,从而导致业务操作的整体响应时间将超过 2 秒。
实际上,其中有两次基础操作的响应时间超过 1 秒,导致业务操作的整体响应时间超过 3 秒的概率仍高达。因此,业务操作的响应时间分布将呈现出显著的长尾现象,大量业务的服务质量将不尽如人意。
因此,保证基础操作的响应时间尽可能稳定变得异常重要。实现这一点的常用方法是定期调整负载均衡策略来减少系统局部过载的概率(如果全局过载那只能扩容了),当然 Google 也这样做了。除此之外,Jeff Dean 在演讲中还重点介绍了一种称为关联请求(Tied Request)的通用策略。
关联请求的原理是把操作请求发给两个都可独立完成服务的子系统,并告知对方的信息。如果在一个子系统中操作请求完成排队开始执行,就通知对方取消执行。对方收到通知后,如果操作请求还在排队,则取消执行。当然,如果操作也已经开始执行了,则不一定能取消,这时将带来额外的系统开销。
Google 的经验是在数据中因为有低延迟的通信网络,这种操作在两个子系统都执行的最差情况发生的概率可以降到很低。
关联请求策略在降低 GFS 读操作响应时间上取得了非常好的效果。在处理 GFS 读请求时,GFS 客户端首先发送关联请求到其中一个复本,如果 2ms 之后该复本上的读操作还没有开始,则再发送关联请求到另一复本。
表 1 显示了使用关联请求策略改善 GFS 读操作响应时间的显著效果。可以看到,无论是空闲还是繁忙的系统,关联请求策略都可以将 90%~99.9% 响应时间降低 40% 左右。
▲表 1 使用关联请求策略改善 GFS 读操作响应时间的显著效果
同时也可以看到,优化后,繁忙系统的响应时间基本与优化前基本空闲的系统相当。关联请求策略似乎“神奇”地消除了负载增加对响应时间带来的负面影响。当然,读者可能会担心这一策略是否增加了大量额外的读操作。关于这一点,Jeff Dean 透露为此增加的读操作只有约1%,非常低。
实际上,关联请求策略在降低 GFS 读操作响应时间中体现的效果还不是最显著的,Jeff Dean 在另一个题为“Achieving Rapid Response Times in Large Online Services”的演讲中还讲到一个效果更显著的测试结果。在这个测试中,使用关联请求优化后,每千次 BigTable 内存读操作的平均和 99% 响应时间降低了约 60%,99.9% 响应时间更是降低了约 95%。
通过如下的简单计算就可以说明关联请求策略为什么有效。同样用上述平均响应时间 10ms 而 99% 响应时间 1 秒的例子。如果不用关联请求策略,那么1% 的情况下响应时间会超过 1 秒,但如果用了关联请求策略,由于两个子系统是独立的,那么超过 1 秒的概率就只有 0.01%。