[转帖]Tail Latency学习
https://www.cnblogs.com/Rohn/p/15123758.html
Latency,中文译作延迟,Tail Latency即尾延迟。
实际生产中的Latency是一种(概率)分布,实际上被描述为百分位数。 延迟可以在 75% 百分位处翻倍,在 99% 之后高出 100 倍。
什么导致了尾延迟
- 磁盘老化。Disk just get slowdown time to time for no reason. The Tail at Store gives more in-depth analysis. Also, disks may degrade significantly when they get old.
- 超时。Failure tolerance and retry is a common design pattern in distributed systems. But one retry is enough to send current request to latency tail. Google SRE Book chapter 21 to 22 discuss it in detail, such as,
- Reduce remaining timeout quota and pass it down each layer of the request processing chain.
- Be aware of the chained retry amplification (layer1 3 retries, layer2 3*3 retries, …).
- 后台任务。Almost every services, from software to even hardware/firmware, have backgroud tasks. Background task may temporarily slowdown the world. The most notorious one is GC (garbage collection,垃圾回收).
- 超负载运行。The customer may be sending you too many/big requests, and upper layer throttling is not working well. Overprovisioned customer VMs may compete with each other resulting slow experience. Some small piece of data may be extremly hot, e.g. many OS images are forked from a small shared base. A large request may be pegging your CPU/network/disk, and make the others queuing up. Or something went wrong, as a dead loop stuck your cpu.
缓解尾延迟
延迟可以分为low、middle和tail。控制和缓解延迟方法总结:
- 缓解low, middle部分:P提供更多资源、削减和并行化任务、消除 “head-of-line” 阻塞和缓存将有所帮助。这是我们应用于横向扩展分布式系统的常用技术。
- 缓解tail部分:基本思想是hedging。 即使我们已经并行化了服务,最慢的实例也将决定我们的请求何时完成。 您可以使用概率数学对组合延迟分布进行建模。
- 发送比必要更多的请求,只收集最快的返回,有助于减少尾部。Send 2 instread of 1. Send 11 instead of 10 (e.g. in erasure-coding 10 fragment reconstruct read). Send backup requests at 95% percentile latency.
- 金丝雀请求,,i.e. send normal requests but fallback to sending hedged requests if the canary did’t finish in reasonable time.
- 通常,较小的任务分区(微分区)将有助于实现更平滑的延迟分布百分位数。
- 减缓 head-of-line blocking. 少量开销较大的查询可能会增加大量并发开销较低的查询的延迟。Uniformly smaller tasks partitioning camn help.
- 处理超时
- 首先尝试a non-block try 读取(读取但不等待),然后进行尽力读取(读取并等待超时)。
- 当发现超时时,将相关资源标记为known slow。 并告知其他请求绕过这个资源。
- 要设置合适的超时值,我们可以设置为99.9% ,并动态调整它。 任意超时值可能有害。
- 更细粒度的调度,甚至是平衡延迟和成本的管理框架。(e.g. Bing’s Kwiken, also attached below.)
监控
有两种监控指标:
- Single operation
- Percentile statistics
监控应该能够:
- 提供可以从用户请求入口跟踪到硬件操作的trace id
- 涵盖每个级别的细分
- 覆盖容易出问题的地方
有几个方面需要监控:
- 与故障直接相关的错误,例如虚拟机停止/重新启动
- 直接影响用户体验的超时错误计数和自动限制
- Operation slowdown
- 典型的硬件性能,如CPU、网络、磁盘
- 提供从用户进入的跟踪、每个级别的细分以及最终到硬件的跟踪
其他参考资料
- Latency Numbers Every Programmer Should Know: Give you the basic latency numbers of each level of a storage system
- Disks for Data Centers: Google’s disk experience, which covers some aspect of disk tail latency.
[转帖]Tail Latency学习的更多相关文章
- 【转帖】Git学习笔记 记录一下
本文内容参考了廖雪峰老师的博文,并做了适当整理,方便大家查阅. 原帖地址 https://wangfanggang.com/Git/git/ 常用命令 仓库初始化 - git init 1 git i ...
- [转帖]Hyperledger Fabric 学习一:简介
Hyperledger Fabric 学习一:简介 https://www.jianshu.com/p/f971858b70f3?utm_campaign=maleskine&utm_cont ...
- [转帖]java基础学习总结——多态(动态绑定)
https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态
- 开个帖,开始学习shell编程
恩,就这么开始了 首先说一下这个小小的插曲...写着写着,它就崩溃了,然后我也崩溃了...崩溃的我到处找一个不会让我崩溃的工具,然后找来找去就找到了scribefire. 1. 关于从Command ...
- 科普帖:深度学习中GPU和显存分析
知乎的一篇文章: https://zhuanlan.zhihu.com/p/31558973 关于如何使用nvidia-smi查看显存与GPU使用情况,参考如下链接: https://blog.csd ...
- [转帖]Google Chrome 解决 “您的连接不是私密连接”
Google Chrome 解决 “您的连接不是私密连接” 和被毒霸劫持 自己搭建了 k8s的 dashboard 结果 chrome 最新版本的打不开了.. 百度了下 园友的解决方案很完美 这里面转 ...
- Revisiting Network Support for RDMA
重新审视RDMA的网络支持 本文为SIGCOMM 2018会议论文. 笔者翻译了该论文.由于时间仓促,且笔者英文能力有限,错误之处在所难免:欢迎读者批评指正. 本文及翻译版本仅用于学习使用.如果有任何 ...
- 史上最全面的Neo4j使用指南
Neo4j图形数据库教程 Neo4j图形数据库教程 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章:安装 1.环境 2.下载 3.开启远程访问 4.测试 第三章:CQL 1 ...
- 史上超全面的Neo4j使用指南
Create by yster@foxmail.com 2018-7-10 我的博客:https://blog.csdn.net/yueshutong123 W3Cschool文档:https://w ...
- Neo4j图数据库从入门到精通
目录 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章:安装 1.环境 2.下载 3.开启远程访问 4.启动 第三章:CQL 1.CQL简介 2.Neo4j CQL命令/条款 ...
随机推荐
- 微服务下,使用 ELK 进行日志采集以及统一处理
摘要:微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等. 微服务各个组件的相关实践会涉 ...
- SparkSQL的入门实践教程
摘要:Spark SQL是用于处理结构化数据的模块.与Spark RDD不同的是,Spark SQL提供数据的结构信息(源数据)和性能更好,可以通过SQL和DataSet API与Spark SQL进 ...
- Hive查看表/分区更新时间
1.查看分区 hive> show partitions table_name; 2.查看分区更新时间 获取hdfs路径 hive> desc formatted table_name; ...
- 电子签章Java后端与前端交互签名位置计算
电子签章过程中存在着在网页上对签署文件进行预览.指定签署位置.文件签署等操作,由于图片在浏览器上的兼容性和友好性优于PDF文件,所以一般在网页上进行电子签章时,会先将PDF文件转换成图片,展示给用户. ...
- SAP发布HTTP接口
1.创建类 引用标准接口 改写集成的接口方法 此处仅实现POST方法,将传入的JSON报文转为函数传入参数,调用获取物料接口,并将返回的物料信息,转换为JSON报文返回 METHOD if_http_ ...
- C# Task 多任务:C# 扩展TaskScheduler实现独立线程池,支持多任务批量处理,互不干扰,无缝兼容Task
先上源码: https://gitee.com/s0611163/TaskSchedulerEx 为什么编写TaskSchedulerEx类? 因为.NET默认线程池只有一个线程池,如果某个批 ...
- sprint-boot 存储图片的base64
需求:将前端上传的图片转换成base64码发送到后端存储到数据库中(oracle或者mysql) 问题:当图片大小比较大(大概是超过1M)后端接收到的数据就会有错误. 解决方法: sprint-bo ...
- 【调试】kdump原理及其使用方法
kdump机制 简介 Kdump是在系统崩溃.死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的cras ...
- CommonJS 和 ES6 Module 究竟有什么区别?
https://juejin.im/post/5e5f10176fb9a07cd443c1e2
- 【Qt】开源一键代码开光神器,一行代码给你的项目施加祝福,减少Bug
年底啦,没什么项目,想摸鱼划水没见到什么好玩的东西,看到有人分享这个,直接做个库来玩下,之后说不定会嵌到公司的项目里面去.... 效果如下,佛光普照! 输入也只需要一行命令 magic_spells: ...