The Tail At Scale & HotRing 论文分享

The tail at scale by jeff dean dean 大神 写的关于大规模服务系统的设计思路,来自于google实践,不得不看 立即下载

简介

在分布式系统中会存在耗时过长的请求,或者服务本身也需要进行相关的耗时优化,本期给大家带来的是两篇耗时优化相关的论文,《The Tail At Scale》是Google发布的关于分布式系统中关于在不可靠的系统中打造一个可靠的整体耗时模型的论文,《HotRing》是阿里发布的关于服务本地缓存优化的论文。

The Tail At Scale

论文简介

在下游众多的系统中,由于我们无法预测下游正在发生或者将要发生的事情,有的时候会因为下游服务的一些异样操作而导致耗时上涨,即便这个比例是很低的,但是在大型的分布式系统上,一个请求可能会经过成百上千个模块,这样就会导致耗时增长的可能性大大增加。下游有可能出现的情况有:

  • CPU过载降频
  • LSM-TREE compation操作
  • 网络缓存过载
  • GC

由于下游的情况是不可预测的,所以我们不能期待于下游提供100%稳定的服务,在这个前提之下,我们能不能够建立稳定的模型呢。

对冲请求

论文中提到的解决方法是,评估出下游服务p95的耗时,在一次请求已经超过这个时间的时候就再发送一次相同的请求,取最新返回的一次来做结果返回,耗时长的结果就丢弃掉。这样做为什么能降低P99耗时呢,下面我们建立一个数学模型来解释这个问题。

在这里插入图片描述

图中横轴表示的请求中分位的耗时,纵轴表示的是对应P(X)分位的耗时。此图中基于一些假设:

  • 下游会出现一些问题导致P9x耗时过高
  • 当前监控时刻与下一个监控时刻的请求量与耗时情况大致相同
  • 新增的对冲请求的qps不会对下游造成影响
  • 大多数对下游的请求都是良好的,能正常返回,耗时远远低于异常的时候。
  • 各个阶段的耗时模型拟合成一次函数。

模型解读:

  • 任意x1 > x2, f(x1) >= f(x2),其实这个很好理解,99分位耗时是不会比95分位耗时低的。
  • 由于会下游会出现一些异样的操作,那么存在x1,x2, x2 = x1 + 1,使得P(x1) << P(x2)。 在这个时刻两个点之间的图像并没有什么意义,所以图中并没有绘制

模型推论:

  • 令x2 = x1 + 1, P(x1) = t1, P(x2) = t2, 且t1 << t2, 0 - x1分位的耗时模型为 f(x) = k1x + b1, x2 - 100 分位耗时模型为f(x) = k2x + b2
  • 假定我们选择在t1时刻发送对冲请求,由于我们假定流量是均匀的,那么这个对冲的请求有x1/100 的概率落在0 - x1的耗时区间,有1-x1/100的概率落在x2 - 100的耗时区间。那么我们只需要比较0 - x1和原请求在x2-100的时间长短就可以了,因为对冲请求落在后半区间的耗时肯定是比原请求要大的。
  • 那么我们能得到的x2-100区间段的耗时模型就变成了min(t1 + x1/100 * (k1x1 + b1), k2x + b2)

实操的考量

经过上面的推论之后,我们可以看下如果要落地这个东西需要考量的东西有哪些:

  • 这个模型适合那些场景?
  • t1时刻怎么选取和评估?
  • 放大的流量怎么评估?

1.实际上这个模型适合在后半段分位耗时远远比前半段大的情况,如果整个下游耗时都是平缓稳定的,在发一次请求只会增大调用量和下游压力,不会对耗时有任何优化。

2.关于t0时刻可以建立一个反馈机制,选取一个单位时间内的流量来做流量耗时的评估,因为流量段时间内是均匀的,取上一个时刻的流量对当前的评估不会有太大的问题,并且可以设置兜底的配置,如果不大于兜底的值,就不会重新发送请求。

3.关于放大的流量实际上是耗时大于t0的流量,实际上比1 - x1/100 占比的流量少很多。

4.对冲请求只适用于读取操作,写操作不适合重新发送,很难消除两个写请求的影响。

HotRing

简介

关于缓存大家一定不陌生,如codis这样的缓存组件,还有应用内的缓存。缓存从某种意义上来说是符合28定律的,也就是说80%的流量访问20%的缓存数据。这就涉及到一个热点数据的问题,当一些数据被集中访问的时候,我们怎么做优化的处理,市面上常见的优化策略都是针对codis样的缓存组件做的优化,比如一致性hash策略,但是对应用内缓存的优化确实极少的。这里介绍的HotRing就是对应用内缓存做的优化。

论文又一些前置的知识在里面有大量的使用,分别是:

  • RCU机制
  • map原理
  • CAS

在服务本地缓存中绕不开用map来作为缓存的数据结构,我们这里举go的map为例,java的HashMap原理也差不多:

初始化的map

面对热点现象这样的数据结构会有一些问题,

1.无法感知到热点,获取缓存的时候是线性访问链表,会存在多余的内存操作。

2.缓存miss,我们在获取缓存的时候key的hash值命中某个bucket,会遍历bucket上的每一个元素,没有匹配的key才会返回miss。这里其实可以通过在最外层加一个布隆过滤器解决。

那么如何解决这个问题呢, 第一个问题最直观的解法就是把最热的数据放在链表的前面,这样就可以做到尽量少的操作就可以拿出热点数据。第二个问题可以构造一个有序的链表,这样可以根据链表节点的key的大小来判断key是否存在,从而做到减少内存访问的效果。

img

如上图所示,就是HotRing的数据结构。Head节点可以指向有序冲突环中的任意一个节点,并且有相关热点切换事件的时候Head会改变指向。

这样的模型我们需要考虑的是

  • 热点转移怎么操作?
  • 怎么做到无锁操作?

1.论文中关于热点转移提供了两种方案:

  • 随机切换,如果我们的流量中存在热点事件,那么在流量中随机取一个流量的缓存访问,大概率会取到热点,Head切换到这个节点就好了。但是如果流量中存在多个热点或者不存在热点,那么这种策略就会带来频繁的Head切换的问题。
  • 经过统计计算的热点切换,统计整个环和环上每一个节点的访问次数,然后通过下面这个公式计算Head如果移动到每个节点带来的收益。n代表每个节点的访问次数,N表示环的总访问次数。后面代表的的(i-t)mod k代表如果head移动到t节点,从t访问环上每个节点需要做的内存访问次数。由此我们得出将Head移动到T节点上带来的收益。

img
2.通过RCU和CAS机制做到无锁操作。详情可以看参考资料中的文章。

实操考量:

这个模型要是投入使用,要考虑什么东西呢?

  • 系统本地缓存中存在热点问题吗?
  • 投入产出比?
注释

由于在参考资料中HotRing的文章已经把这些都介绍的很详细了,所以就不再展开篇幅对一些细节进行讲解了。感兴趣的读者可以去看参考资料中关于HotRing的文章。

参考资料

  • The Tail At Scale论文:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.732.6087&rep=rep1&type=pdf
  • HotRing相关博客:https://www.cnblogs.com/helloworldcode/p/13022166.html
  • HotRing论文:https://www.usenix.org/system/files/fast20-chen_jiqiang.pdf
  • Map原理:https://blog.youkuaiyun.com/weixin_42767757/article/details/112007958
  • Linux RCU机制:https://zhuanlan.zhihu.com/p/30583695
The Tail at Scale Google Jeffrey Dean大神的关于分布式系统调用延迟的论文 立即下载

相关推荐

DETRs with Collaborative Hybrid Assignments Training论文阅读与代码

在这篇论文中,作者观察到在DETR中将过少的 Query 分配为正样本,采用一对一的集合匹配,会导致对编码器输出的监督稀疏,严重损害编码器的区分特征学习,反之亦然,也会影响解码器中的注意力学习。为了缓解这个问题,作者提出了一种新颖的协同混合分配训练方案,名为Co-DETR,以从多样的标签分配方式中学习更高效、更有效的基于DETR的检测器。这种新的训练方案可以通过训练多个并行辅助 Head ,以一对多的标签分配方式(如ATSS和Faster RCNN)进行监督,轻松增强端到端检测器中编码器的学习能力。

qingjing0413的博客 1156

《The Tail At Scale》论文详细解读

简介 ​ 用户体验与软件的流畅程度是呈正相关的,所以对于软件服务提供方来说,保持服务耗时在用户能接受的范围内就是一件必要的事情。但是在大型分布式系统上保持一个稳定的耗时又是一个很大的挑战,这篇文章解析的是google发布的一篇论文《The Tail At Scale》,里面讲述的是google内部的一些长尾耗时优化相关的经验,以及我个人的一些思考。 服务耗时为什么会产生抖动 ​ 在目前大规模的分布式系统中,服务与服务之间的调用关系可以呈现为下图的形式,服务A,B都有多个实例,服务A实例通过服务发现模块找到下

专注做分享 1253

TikTok Shop API密钥获取与PHP实战对接指南

本文详细介绍了TikTok Shop API密钥的获取流程与PHP实战对接方法。从开发者后台创建应用、获取核心的API密钥开始,逐步解析OAuth 2.0授权机制,并提供了完整的PHP封装类示例,涵盖签名生成、API调用、令牌刷新及错误处理,帮助开发者快速实现与TikTok Shop的数据对接与自动化操作。

weixin_29300241的博客 401

the Tail at Scale

原文:https://cacm.acm.org/magazines/2013/2/160173-the-tail-at-scale/fulltext 知乎整理: https://zhuanlan.zhihu.com/p/39373401?edition=yidianzixun&amp;utm_source=yidianzixun&amp;yidian_docid=0JZ8dxDU 另一篇相关论文...

kevin_darkelf的专栏 388

保姆级避坑指南:在NVMe SSD上安装Ubuntu 24.04,搞定RST错误和分区方案

本文提供在NVMe SSD上安装Ubuntu 24.04的详细指南,解决RST错误和分区方案问题。从BIOS设置到分区策略优化,帮助用户充分发挥NVMe固态硬盘性能,避免常见安装陷阱,实现无痛安装和后期调优。

weixin_26976635的博客 560

ST7789P3初始化配置

【代码】ST7789P3初始化配置。

zqq_1314的博客 4153

关于性能,我们在谈些什么?

当我们在说性能的时候,我们在谈些什么? 衡量性能有两个指标: 在保持服务器资源配置不变的情况下,增加额定的访问量,会给系统带来多大的影响,比如影响了读取时间,写入时间等等。 在增加额定的访问量的情况下,要增加多少服务器资源,才能使其保持平日里的性能 这两个指标是基于服务架构来衡量的,要么在现有技术服务架构下,提出的衡量标准,要么基于未来的访问量,提出的架构设计。所以暂时这两个都不谈,也没...

wujiandao的专栏 1265

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

各位FPGAer周末愉快,今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。

haoxingheng的专栏 1445

Jeff Dean at Stanford

Jeff Dean Stanford http://video.sina.com.cn/v/b/42305207-1605976542.html

牧之-_- 784

AI上推荐 之 多任务loss优化(自适应权重篇)

1. 写在前面 在多任务学习中,往往会将多个相关的任务放在一起来学习。例如在推荐系统中,排序模型同时预估候选的点击率和浏览时间。相对于单任务学习,多任务学习有以下优势: 多个任务共享一个模型,占用内存量减少; 多个任务一次前向计算得出结果,推理速度增加; 关联任务通过共享信息,相互补充,可以提升彼此的表现。 前面的一篇文章,主要是从模型结构的角度聊了下多任务学习,介绍了工业界非常经典也常用的MMOE模型,然而,对于多任务学习, Loss的优化也非常重要, 因为我们知道通过多个目标去指导网络进行统一的训练

Miracle8070 1万+

【数据集7】全球人类住区层GHSL数据详解

全球人类住区层GHSL数据详解

WW、forever的博客 2253

HotRing论文阅读笔记

一、主要思想 Rating这篇论文主要引入了缓存中热点数据的高效查找。对于一般的系统而言,热点数据一般都会放在Redis等缓存中间件中。但是当热门数据中存在着一些更热门的数据,即缓存的这些热门数据中,有一些数据的访问量大,其他的少一点。面临严重的数据访问倾斜时,如何提高热点的访问效率呢? Rating提出了"热环"的概念。即将原始的哈希表使用拉链法来解决冲突的方式改为将链表构造成一个循环链表。同时设置一个head指针指向当前环上的最热门数据。 这样更改结构后,就会容易造成查找某个元素,如果查找不到会形成无限

sinat_38705282的博客 635

PDF格式分析(一)简介

概述 PDF文件是一种编程形式的文档格式,它所有显示的内容,都是通过相应的操作符进行绘制的。 PDF基本显示单元包括:文字,图片,矢量图,图片 PDF扩展单元包括:水印,电子署名,注释,表单,多媒体,3D PDF动作单元:书签,超链接(初学者可以简单这么理解,对于研究比较深入的人员来说,拥有动作的单元有很多个,包括电子署名,多媒体,3D等等) 优势 一致性: 在所有可以打开PDF的机...

steve_cui的博客 2万+

深度 | HotRing: 阿里缓存系统Tair的自感知热点数据子组件

写在前面:本文参考阿里发表的关于HotRing的英文论文,论文地址:https://www.usenix.org/system/files/fast20-chen_jiqiang.pdf...

技术原始积累 3201

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HotRing冷热页面识别论文解读

前言 这篇论文的读后感是我作为本科课程期间的一门大作业课程所需要完成的课外实践内容。如果能够对大家有所帮助就好,不过这一篇主要作为个人的小总结。提前告知,还望海涵。 HotRing策略背景 哈希索引是当前阿里公司在KVSes的中使用的最流行的内存结构,特别是当范围查询不需要上层应用程序时,由于原有哈希表的设计,访问此时应该是: N(总数)=1+L/2 //L是链表长度 L=N/B //N是总的item数目,B是哈希桶数目 其次,由于同样也要寻找响应items前提下的哈希桶,所以要在最前面+1。所以在已

server643的博客 1272

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex&trade;-M4F 内核的信息,请参见《Cortex&trade;-M4F 技术参考手册》。

实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑

商品详情服务,要求:商品基础信息走缓存,减少 DB 查询;典型:AI 只贴注解,忽略 AOP 代理、key 设计、缓存穿透/击穿/过期、序列化、同步刷新,本地单测正常,上线后缓存脏数据、命中率异常、雪崩。如果业务在事务中,@CacheEvict / @CachePut 如果在事务提交前执行,一旦事务回滚,缓存已经被删掉/更新,数据不一致。• 如果在同一个类里用 this.xxx() 调用带缓存注解的方法,不走代理,缓存直接失效;// 更新商品:先更新 DB,再删除缓存,而不是直接 @CachePut。

2401_89363342的博客 453

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

DNS 不是把域名翻译成 IP:递归解析、TTL 缓存、CNAME 与报文排错实战

本文通过离线Python实验,拆解DNS递归解析、缓存机制与报文结构,揭示“DNS不是全局映射表”的本质。重点解析递归器角色、TTL衰减、CNAME链处理、负缓存隔离及修改记录延迟生效等核心问题,结合实战排错案例,阐明缓存层级、事务匹配、截断处理与安全边界,强调从应用到权威的逐层排查逻辑,实现可复现、可验证的DNS教学系统。

此人很懒,什么都没有写~~ 348

Spring Boot 工程通用能力建设:声明式事务定制与 Redis 缓存实践

本文探讨Spring Boot中声明式事务的进阶实践,通过解耦“切点”与“事务属性”,实现灵活控制。核心包括:基于方法名的只读规则(如get*、find*自动设为只读),组合事务属性源确保@Transactional注解优先于命名规则,以及自定义切点实现事务统一织入。该方案提升代码可维护性,避免误写,同时支持特殊场景覆盖,构建更健壮的事务治理体系。

BADAO_LIUMANG_QIZHI的博客 247

输送线节拍与缓存设计:线体平衡计算、积放系数与上下游能力匹配方法

输送系统的能力由瓶颈段决定,设计目标是让各段节拍匹配并留出可控缓存。三个核心计算:①段能力 C = 3600·v/(s + l)(件/h,v 线速度 m/s,s 货物间距 m,l 货物长度 m);②上下游匹配要求 C下游 ≥ 1.1·C上游;③缓存容量 B ≥ (Q峰 - C下游)·t,用于吸收短时高峰。缺了缓存,短时波动会直接转化为上游停线与货物顶推。

NaiLiShuXie的博客 227

Token工厂技术拆解(11月9日)|多付218块的那个月:提示词开头写了日期,缓存一次没命中

6 万字里只留真正被问到的 2 万字,约 13,000 个 token,其余做成按需检索。每次 0.039 元,一天 330 次是 12.87 元,月 283 元。注意,283 元和第二条的 287 元差不多,可它花的人力是第二条的好几倍。这条最贵,要搭检索、要试两周,人比钱贵。别踩的三个坑:坑一,以为开关一开就有缓存。多数平台要你在内容里标出"从哪断开",不标就整段硬碰,碰不上就是零。坑二,忘了 5 分钟就过期。隔半小时再问,等于重新写一次,还是 1.25 倍。坑三,把用户的问题也塞进缓存段。

李文慧 中国开源充电桩平台第一人;李文慧 国内知名开源工作者 全栈工程师 华为云最具价值专家 22

WooCommerce 运费不显示或结账运费为 0:先核配送区域与运费类,再查缓存与主题/插件覆盖

—购物车能加购、结账表单也能填,就是算不出该有的运费——这和今日写过的 Cloudflare Flexible SSL /、后台极慢 Heartbeat / 修订 / autoload、

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 261

WooCommerce 优惠券输入后提示无效或不打折:先核使用限制与商品适用范围,再查缓存与插件冲突

后台明明建好了优惠券,前台结账输入券码却提示,或显示已应用却——这和今早写过的 WordPress 站点地图404/空白、体验版白屏 /,以及昨日的 Cloudflare Flexible SSL /、Allowed memory size exhausted、Shopify 库存售罄、、小程序支付回调、WXR、REST 401、无法创建目录、

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 369

Unity 数据存储指南:本地存储、个性化设置、缓存与 Resources/StreamingAssets 的区别

在 Unity 开发中,“数据存到哪里”、“缓存能不能清”、“打包后资源有什么区别” 是新手最容易混淆、老手也经常踩坑的问题。Unity 本地存储机制(包括 Unity 放在 C 盘的内容);Unity 个性化设置(编辑器首选项 Editor Preferences);Unity 缓存的打开、关闭与清理;打包后 Resources 与 StreamingAssets 的区别;其他可自定义存储的内容汇总。为方便理解,本文配有一个可直接运行的演示工程,所有代码见文末"配套工程说明"。

zhchyun 59

阿里云ESA缓存自动刷新的WordPress插件(含手动刷新)

WordPress用户若使用阿里云ESA缓存,常遇内容更新后页面未刷新问题。推荐免费插件“阿里云ESA缓存刷新插件”,支持发布/编辑文章时自动刷新文章页、首页、分类页、标签页(可自选),并可手动或批量刷新指定URL。安装启用后,在设置中填写ESA凭证,开启自动刷新,保存配置即可。验证方式:发布文章后查看阿里云ESA控制台刷新记录,确保缓存及时更新,提升网站访问效率。

boke112的博客 438
上一篇: 如何在go中执行shell命令
下一篇: 《The Tail At Scale》论文详细解读
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值