[转帖]高并发系统中的尾延迟Tail Latency

并发,系统,延迟,tail,latency · 浏览次数 : 0

小编点评

**Heracles高并发系统尾延迟解决方案** Heracles是一个针对大规模分布式系统优化尾延迟的开源框架,它通过多种隔离机制降低了IO、CPU和内存之间的争抢,从而有效降低了尾延迟。 **CPU隔离** * 借助cpuset和cgroups,Heracles将LC和BE型任务限制在不同的Core上运行。 * 采用Intel CPU上的CAT技术,可以定义缓存分区,确保缓存不会相互污染。 **内存隔离** * 由于目前并不存在硬件的隔离机制,Heracles实现了一个软件层面的监控机制,定期检查内存带宽使用情况并估计LC和BE的带宽使用。 **网络隔离** * 使用Linux流量控制机制——qdisc调度器,确保BE任务的吞吐量和配额。 * 定期更新调度策略以保持高效的网络传输。 **功耗监控** * 基于现有硬件支持的特性,Heracles实现了主频监控,以降低功耗。

正文

开发和运维高并发系统的工程师可能都有过类似经验,明明系统已经调优完毕,该异步的异步,该减少互斥的地方引入无锁,该减少IO的地方更换引擎或者硬件,该调节内核的调节相应参数,然而,如果在系统中引入实时监控,总会有少量响应的延迟高于均值,我们把这些响应称为尾延迟(Tail Latency)。对于大规模分布式系统来说,尾延迟的影响尤其严重,例如大规模搜索引擎,单个请求可能就会发送到上万台服务器,系统不得不等待尾延迟响应返回之后才能返回给用户。

尾延迟可能是程序设计本身导致的毛病,但是,即便程序设计完全无误,尾延迟依然可能存在。华盛顿大学的Jialin Li等人经过研究发现,硬件,操作系统本身,都可能导致尾延迟响应,例如:主机系统其他进程的影响,应用程序里线程调度,CPU功耗设计等等。


在本公众号之前提到的数据中心操作系统设计中,我们提到了Distributed OS设计的核心挑战——如何让延迟敏感性任务和批处理型任务混跑,这个核心挑战,就在于如何对付尾延迟。我们在当时提到了Google最新的成果Heracles,在国内还没有造出Borg类似机制的框架时,Heracles已经可以让Google数据中心的资源利用率达到90%以上。那么我们也就顺道来介绍一下Heracles以及它是如何对付尾延迟的。


Heracles把数据中心运行的任务分为两类:BE(Best Effort Batch)和LC(Latency Critical),LC型任务运行依赖严格的SLO(Service Level Objectives,包含CPU缓存,主存,IO,以及网络等主机物理资源)。混排时,由于物理资源的SLO冲突导致LC任务会有更多的尾延迟发生。Heracles的目标在于提供对这些共享资源更好的隔离机制,尽可能避免SLO冲突。下边分别谈谈这些引起SLO冲突的共享资源:


CPU方面:
操作系统的资源调度,不能简单地给LC任务分配更高的优先权来达到目标,通常的Linux内核调度算法CFQ(公平调度器)在LC和BE混跑时,会轻易导致大量SLO冲突。实时调度算法如SCHED_FIFO则会导致很低的资源利用率。CPU设计中的超线程机制,也会给问题带来更多的复杂性,例如:一个超线程在执行BE任务时,会从CPU指令带宽,共享L1/L2缓存,TLB等方面影响另一个超线程执行的LC任务。


内存方面:
大多数LC型任务都会依赖巨大的内存,例如搜索,内存KV等等,因此,这些任务的延迟对于内存的带宽非常敏感。目前并不存在硬件机制来确保内存带宽隔离,而在多CPU机器上简单地采用NUMA机制又会导致不能充分使用内存,或者访问远端CPU Socket内存区域而带来更大的延迟。


网络方面:
大多数数据中心都会通过精细设计拓扑图来确保机器之间双向通信的带宽。在单机情况下,可以通过修正一些协议栈确保LC型的短消息能够比BE的大型消息有更高的优先权


功耗是另外一个不得不考虑的因素:
大多数CPU都有节能设计,系统会根据平均负载来动态调整CPU的主频,因此混跑时的负载取决于LC和BE的平均负载,当CPU主频降低时,LC型任务的延迟也会受到影响。

Heracles在设计上引入多种隔离机制,在确保SLO时尽可能提升资源使用负载:


CPU方面:Heracles会借助cpuset和cgroups尽可能让LC和BE型任务不在同一个Core上运行。此外,Heracles采用了目前Intel CPU上的CAT(Cache Allocation Technology)技术,这是个硬件机制。CAT可以在共享的L1/L2缓存上定义分区,确保缓存不会相互污染。


内存方面:由于目前并不存在硬件的隔离机制,因此Heracles实现了一个软件层面的监控机制,定期检查内存带宽使用情况,并估计LC和BE的带宽使用,如果LC没有获得足够的带宽,Heracles会减少BE使用的CPU Core数目。


网络方面:Heracles使用了Linux流量控制机制——qdisc调度器,确保BE任务的吞吐量和配额,并频繁更新调度策略。


功耗方面:Heracles基于现有硬件支持的特性实现了主频监控。

通过这些工作,Heracles让Google数据中心的集群资源使用率达到了惊人的90%。在思路上,Heracles的实现并不复杂,但它是跟Borg一体化的系统,我们不能说实现了这些资源隔离手段就能解决了尾延迟,因为单机的资源管理与隔离跟数据中心操作系统是一体化的。

实时上,除了依赖于复杂的Heracles和Borg机制,Google之前也曾经公开了另一种简单有效的策略对付尾延迟:在12年左右我们曾经看到过Google基础架构之神Jeff Dean的一篇Slide,里边提到了Google分布式系统响应的概率延迟分布。在该Slide发布的时候,并没有引起本人的关注,因为当时并没有猜透这些概率分布的背后代表了什么意义。结合尾延迟,我们终于可以更好的了解这些意图:尾延迟的发生可以看作是随机行为,引入多副本,任何一个请求,都会多次发送到多副本之上,系统会选择延迟最短的响应返回,就可以大大降低尾延迟对于最终响应的影响,十分简单有效的思路。至于发送多少次,就是这些概率延迟分布数字本身的意义了。


可能这个思路对于大多数基础架构开发者来说,是更加简单有效的策略,与其试图从操作系统内核和Distributed OS来解决这个挑战,不如放到应用层,多副本多次发送单个请求。在复杂与简单上,Google都是我们重点学习的对象。


</article>

与[转帖]高并发系统中的尾延迟Tail Latency相似的内容:

[转帖]高并发系统中的尾延迟Tail Latency

开发和运维高并发系统的工程师可能都有过类似经验,明明系统已经调优完毕,该异步的异步,该减少互斥的地方引入无锁,该减少IO的地方更换引擎或者硬件,该调节内核的调节相应参数,然而,如果在系统中引入实时监控,总会有少量响应的延迟高于均值,我们把这些响应称为尾延迟(Tail Latency)。对于大规模分布

[转帖]浅谈系统稳定性与高可用保障的几种思路

https://segmentfault.com/u/dewujishu 一、前言 高并发、高可用、高性能被称为互联网三高架构,这三者都是工程师和架构师在系统架构设计中必须考虑的因素之一。今天我们就来聊一聊三H中的高可用,也是我们常说的系统稳定性。 本篇文章只聊思路,没有太多的深入细节。阅读全文大概

[转帖]Redis线程模型的前世今生

https://www.jianshu.com/p/ea83267db47a 一、概述 众所周知,Redis是一个高性能的数据存储框架,在高并发的系统设计中,Redis也是一个比较关键的组件,是我们提升系统性能的一大利器。深入去理解Redis高性能的原理显得越发重要,当然Redis的高性能设计是一个

[转帖]Redis的高并发及高可用,到底该如何保证?

https://zhuanlan.zhihu.com/p/404481762 一、redis如何通过读写分享来承载读请求QPS超过10万+ 1、redis高并发跟整个系统的高并发之间的关系 redis,你要搞高并发的话,不可避免,要把底层的缓存搞得很好 mysql,高并发,做到了,那么也是通过一系列

[转帖]架构修炼-10:高并发设计

一、如何衡量高并发的系统性能 1.吞吐量Throughput: 2.响应延迟Response Delay: 二、性能优化目标 1.缩短响应时间 2.提高系统并发数(提升吞吐量) 3.系统处理合理状态(机器利用率) 随着系统压力增加(X坐标:在线业务人数), Y坐标:绿色机器利用率,紫色并发数,蓝色:

[转帖]性能案例-Linux下解决time_wait连接过多(Linux内核优化)

一、性能测试的主要概念和计算公式 系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。 单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。 系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间

[转帖]Nginx 服务并发过10万的Linux内核优化配置

https://www.shuzhiduo.com/A/6pdDejeXzw/ 以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一下,如有那位高人看到配置上有问题,请给与指出! # Controls the use of TCP syncook

[转帖]新一代垃圾回收器ZGC的探索与实践

1. 引入 1.1 GC之痛 很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰。GC停顿指垃圾回收期间STW(Stop The World),当STW时,所有应用线程停止活动,等待GC停顿结束。以美团风控服务为例,部分上游业务要求风控服务65ms内返回结果,并且可用性要达到99.99%。

[转帖]线上Java 高CPU占用、高内存占用排查思路

一、前言 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。 二、分析

[转帖]高可用高并发系统设计概念学习 二

高可用高并发系统设计概念学习 二 前言一、隔离术线程隔离进程隔离集群隔离机房隔离读写隔离动静隔离爬虫隔离 二、超时与重试机制代理层超时与重试客户端超时设置client_header_timeout timeclient_body_timeout timesend_timeout timekeepal