AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

Jeff Dean 谈如何在大型在线服务中做到快速响应

  • 2014-07-13
  • 本文字数:2644 字

    阅读完需:约 9 分钟

6 月于硅谷举行的 Velocity 2014 大会上,Google 首席科学家 Jeff Dean 做了一场题为《Achieving Rapid Response Times In Large Online Services》的主题演讲,分享了让大型系统运行更加流程以便改善用户体验的种种方法。

Jeff 首先以 Google 的搜索服务为例,说明了何为大扇出服务(Large Fanout Service),即一个搜索请求需要有大量子系统(Web、新闻、图像、视频、博客等等)参与其中,以便提供更丰富的搜索结果。在 Google,基本不会为特定的服务提供特定的机器,而是将服务都部署在一个机器池中,这被称为共享环境(Shared Environment),Google 的共享环境大致会包含以下几个部分——Linux、调度系统、文件系统 ChunkServer、多种其他系统服务、Bigtable Tablet Server、随机 MapReduce 任务、CPU 密集型任务以及随机应用。它的好处是可以极大地提升利用率,但同时也会带来诸多无法预测的问题,比如网络拥塞等等。尤其是响应时间的长尾现象比较明显,一次请求的平均响应时间是 10 毫秒,但是却有 99%ile 的响应时间大于 1 秒,在大扇出服务中,如果需要调用 100 台服务器获得最终结果,那有 63% 的请求耗时会大于 1 秒。

针对延时问题,有些基本的降低延时的技术:

  • 定义不同的服务级别,针对服务器上的请求队列和网络流量设定优先级。
  • 减少线头阻塞(head-of-line blocking),将大的请求打散成一系列小请求;比如,一个读请求需要读取 64MB 数据,而另有一个 100KB 的读请求必须等前者完成了才能得到处理,此时可以将大请求分为多个小请求,以便 100KB 的那个请求能及时得到处理。
  • 管理好昂贵的后台活动,比如分布式存储系统中的日志压缩就算昂贵的后台活动,此类活动可以考虑在负载低峰期去执行。

Jeff 指出,我们要做的事就是基于一堆不可靠的资源打造一个可靠的整体,基于一堆无法预估的资源打造可以预测的整体。在延时处理方面,Jeff 将对应的技术分为两大块:

  • 跨请求适应(cross request adaptation),通过检测最近的行为,采取一些措施来优化后续的请求处理,通常会和负载均衡有关,生效时间大约是十几秒到几分钟。
  • 同请求适应(within request adaptation),在当次请求中,对响应较慢的子系统采取一些措施,以改善本次请求的整体响应时间,通常是立刻生效的。

随后,他分别就两类技术进行具体展开说明。

1. 跨请求适应

可以通过细粒度的动态分区,将大数据集或大型计算拆分到多台服务器上,一般一台服务器上会分到 10 到 100 个块,BigTable 和 GFS 就是这么处理的。

这么做的好处是显而易见的,比如,当一台机器负载过重时,可以将其中的一部分内容移动到另一台上;可以加速故障恢复,多台服务器分别恢复不同的数据块;实现选择性复制,针对重度使用的内容可以动态或静态地生成更多副本。

当服务器的响应变慢时,有可能这和当时发送的数据有关,但更多情况下是受到干扰的影响,比如共享服务器上其他任务造成的 CPU 或网络尖刺。此时可以选择将部分负载移动到其他服务器上以便改善延时情况,也可以在其他服务器上创建更多该分区的副本,继续给这台服务器发送请求(正常请求发给其他服务器了,发给本服务器的请求只是一份镜像)持续观察延时情况,待延时正常后再让其提供正常服务。

2. 同请求适应

同请求适应的目标是在不会增加太多资源消耗的情况下减少整体延时,同时还要保障系统安全运行。

有时一些失败是和请求数据有关的,比如一些测试过程中没有发现的“奇怪数据”会造成系统宕机等等,如果一次性将有问题的请求发给所有节点,那么所有节点就都出问题了。在 Google 会使用一种名为 Canary Requests 的请求,即把请求先发给一个节点,收到响应后,基本可以证明这个查询是可行的,随后再将其发给其他节点。

Jeff 在随后的时间里详细介绍了他们使用的另一项技术——备份请求(Backup Requests),大致的思路是先把请求发给一个副本,请求会被放进队列;随后再给另一个副本发送相同请求,如果第二个副本处理地很快,处理完毕后发回结果,客户端再给第一个副本发送取消任务请求。

以 In-memory BigTable Lookups 为例,数据存储了两份,将在 100 个 Tablet 中发送 1000 个键查询,统计最后一个键返回的总耗时。在没有备份请求时,平均耗时 33 毫秒,99%ile 为 52 毫秒,99.9%ile 高达 994 毫秒;当在 10 毫秒后发送备份请求时,平均耗时降为 14 毫秒,99%ile 和 99.9%ile 分别降到了 23 毫秒和 50 毫秒,此外还测试了在 50 毫秒后发送备份请求的情况,耗时同样比没有备份要好,但较前者表现略逊一筹。本案例中,延时 10 毫秒的备份请求仅增加了不到 5% 的额外请求负担,在延时 50 毫秒的情况下,更是下降到不足 1%。可见备份请求能在很大程度上改善延时的长尾效应,同时并未增加太多开销。

备份请求技术还可进一步优化,在发送请求时将处理请求的另一台服务器信息也纳入请求中,一旦一台服务器开始执行,就直接通知另一台取消执行,这项优化称为跨服务器取消。Jeff 同样提供了一个例子,在分布式文件系统客户端中发送读请求,等待 2 毫秒后发送备份请求,耗时情况如下:

  • 集群处于空闲状态
    • 没有备份请求,50%ile 为 19 毫秒,90%ile 为 38 毫秒,99%ile 为 67 毫秒,99.9%ile 为 98 毫秒
    • 有备份请求,50%ile 为 16 毫秒,90%ile 为 28 毫秒,99%ile 为 38 毫秒,99.9%ile 为 51 毫秒
  • 集群正在进行大量排序
    • 没有备份请求,50%ile 为 24 毫秒,90%ile 为 56 毫秒,99%ile 为 108 毫秒,99.9%ile 为 159 毫秒
    • 有备份请求,50%ile 为 19 毫秒,90%ile 为 35 毫秒,99%ile 为 67 毫秒,99.9%ile 为 108 毫秒

两种情况下,使用备份请求延时都有显著改善,99%ile 分别下降了 43% 和 38%,在第二种情况下备份请求只引入了大约 1% 的额外磁盘读请求。如果没有备份请求,集群需要一直处于低负载状态,而使用了备份请求,集群则可处于相对较高的负载,同时还能有相对较好的响应延时。

对于备份请求而言,最坏的情况即是两台机器几乎同时收到请求,并且都处理了请求,这会带来一定的资源浪费。当然,也可以引入第三个请求,但通常情况下向两台服务器发送请求就已经足够了。在演讲后的 Office Hour 中,Jeff 表示备份请求也不是万能的,对于一些不可重复执行得请求,比如在线交易,就不能使用备份请求,以免造成数据不一致等情况。

在本次 Velocity 大会上,Jeff Dean 的演讲时间较短,如果您对他的具体演讲内容感兴趣,可以观看官方视频。同时,也推荐您去阅读 2013 年 Jeff Dean在斯坦福的演讲还有一篇更早的材料。我们希望有一天能够邀请到 Jeff 到国内现场为广大 InfoQ 的读者做一次分享,到时您会来参加么?

2014-07-13 08:487236
用户头像

发布了 135 篇内容, 共 64.2 次阅读, 收获喜欢 43 次。

关注

评论

发布
暂无评论
发现更多内容

【干货】常见库存设计方案-各种方案对比总有一个适合你

Java你猿哥

Java 架构 微服务 系统设计 后端

前端进阶:在 Web 中使用 C++,我让学妹另眼相看 | 技术分享

LigaAI

c++ 程序人生 前端 webassembly 企业号 3 月 PK 榜

中国半导体市场份额进一步提升,2023年将迎全新发展良机

华秋电子

网易携手昇腾AI打造玉知-悟空图文理解大模型,做更“懂你”的产品

极客天地

视频下载软件:MediaHuman YouTube Downloader 中文版

真大的脸盆

Mac 视频下载 Mac 软件 下载视频 视频下载工具

板边器件距离不够,导致元器件无法焊接,怎么办?

华秋电子

openGemini正式加入openEuler SIG-DB ,携手开展全方面技术创新

openEuler

数据库 Linux 开源 操作系统 openEuler

低代码四大典型使用场景,你都知道吗?

飞算JavaAI开发助手

HummerRisk 使用教程:主机检测

HummerCloud

数据湖选型指南|Hudi vs Iceberg 数据更新能力深度对比

袋鼠云数栈

数据湖

Nacos心跳机制实现快速上下线

Java Spring Cloud nacos 心跳机制

深圳.NET线下技术沙龙倒计时一天

MASA技术团队

.net MASA

优秀软件工程师必备的五大技能,快看你还差什么?

飞算JavaAI开发助手

Spring Boot中如何优雅地实现异步调用?

JAVA旭阳

Java springboot

索信达再度打造智能营销标杆案例,这次是头部券商!

索信达控股

cortex ingester 基于 hash ring 进行 token 管理

jupiter

Prometheus 一致性hash Cortex Mimir

瞄准2023教育春招,百度营销多措并举,推出创新型行业营销解决方案

极客天地

"鸿蒙生态专家面对面"三月专场等你前来!

HarmonyOS开发者

【微电平台】-高并发实战经验-奇葩问题解决之旅

京东科技开发者

架构 服务端 js 平台

基于 RocketMQ Connect 构建数据流转处理平台

Apache RocketMQ

“奇遇未来”专访:一个小众、专业的产品经理实训品牌

极客天地

使用 Athena (Presto) 分析本地 Oracle 数据库导出的数据

亚马逊云科技 (Amazon Web Services)

测试的底层逻辑

京东科技开发者

Java 测试 代码 企业号 3 月 PK 榜

Matlab常用图像处理命令108例(七)

timerring

图像处理

MybatisX整合Spring Boot,真香!

Java你猿哥

Java Spring Boot 后端 mybatis ssm

阿里P8裸辞真实心路历程,他底气来源于Java高阶面试合集

Java你猿哥

Java Spring Boot ssm 面经 八股文

windows 系统下 workerman 在同一个运行窗口中开启多个 websocket 服务

江户川码农

windows 经验分享 websocket workerman 多服务

阿里是如何使用分布式架构的?阿里内部学习手册分享

Java你猿哥

Java 分布式 微服务 分布式架构

100Wqps短链系统,怎么设计?

小小怪下士

Java 程序员 后端 QPS

硬核!阿里大佬都在内卷的SpringBoot从入门到实战笔记

程序知音

Java 编程语言 springboot Java进阶 后端技术

官宣:OpenDAL 成功进入 Apache 孵化器

Databend

Jeff Dean谈如何在大型在线服务中做到快速响应_Google_丁雪丰_InfoQ精选文章