尾部延迟是什么?如何避免尾部延迟?

性能优化 Cache 大约 779 字

概念

1%的请求耗时高于99%的请求耗时,影响用户体验,甚至拖垮服务。

可能原因

  1. 磁盘空间不足/老化
  2. 负载高/过载
  3. 频繁垃圾回收
  4. 请求数据库或第三方资源超时

解决方案

  1. 对于磁盘写满需要增加服务器监控,排查磁盘老化需要运维关注。
  2. 对于过载需要排查是否并发大需要扩容,或者排查代码问题。
  3. 对于频繁垃圾回收,排查是否存在内存泄漏问题。
  4. 对于请求资源超时可以增加缓存。

缓存重计算

提前对于热点数据进行缓存更新,避免出现请求资源为热点数据时出现超时问题,导致尾部延迟。

预先重计算

对于热点数据,在缓存失效前提前更新缓存。可使用另外一个服务进行cron周期性的更新。

理论简单,但不足之处在于必须确切的知道有哪些热点数据。

扩展:对于Redis 4.0.3后采用LFU淘汰策略,可使用redis-cli --hotkeys -i 0.1查看热点数据。

概率性预先重计算

最优概率性缓存踩踏预防算法:

currentTime - ( timeToCompute * beta * log(rand()) ) > expiry
  • currentTime是当前时间戳。
  • timeToCompute是重新计算缓存值所花费的时间。
  • beta是一个大于0的非负数,默认值为1,是可配置的。
  • rand()是一个返回01之间随机数的函数。
  • expiry是缓存值未来被设置为过期的时间戳。

其思想是,每当线程从缓存中获取数据时,都会执行这个算法。如果返回 true,那么该线程将重新计算这个缓存值。离过期时间越近,这个算法返回 true 的几率就会显著增加。

虽然这个策略不是最容易理解的,但执行起来相当简单,不需要任何额外的组件,也不需要重新计算缓存中所有的值。

参考

缓存踩踏:Facebook 史上最严重的宕机事件分析

Tail Latency Study

阅读 61 · 发布于 2021-03-25

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批