尾部延迟是什么?如何避免尾部延迟?
性能优化 缓存 面试 About 779 words概念
有1%
的请求耗时高于99%
的请求耗时,影响用户体验,甚至拖垮服务。
可能原因
- 磁盘空间不足/老化
- 负载高/过载
- 频繁垃圾回收
- 请求数据库或第三方资源超时
解决方案
- 对于磁盘写满需要增加服务器监控,排查磁盘老化需要运维关注。
- 对于过载需要排查是否并发大需要扩容,或者排查代码问题。
- 对于频繁垃圾回收,排查是否存在内存泄漏问题。
- 对于请求资源超时可以增加缓存。
缓存重计算
提前对于热点数据进行缓存更新,避免出现请求资源为热点数据时出现超时问题,导致尾部延迟。
预先重计算
对于热点数据,在缓存失效前提前更新缓存。可使用另外一个服务进行cron
周期性的更新。
理论简单,但不足之处在于必须确切的知道有哪些热点数据。
扩展:对于Redis 4.0.3
后采用LFU
淘汰策略,可使用redis-cli --hotkeys -i 0.1
查看热点数据。
概率性预先重计算
最优概率性缓存踩踏预防算法:
currentTime - ( timeToCompute * beta * log(rand()) ) > expiry
currentTime
是当前时间戳。timeToCompute
是重新计算缓存值所花费的时间。beta
是一个大于0
的非负数,默认值为1
,是可配置的。rand()
是一个返回0
到1
之间随机数的函数。expiry
是缓存值未来被设置为过期的时间戳。
其思想是,每当线程从缓存中获取数据时,都会执行这个算法。如果返回 true,那么该线程将重新计算这个缓存值。离过期时间越近,这个算法返回 true 的几率就会显著增加。
虽然这个策略不是最容易理解的,但执行起来相当简单,不需要任何额外的组件,也不需要重新计算缓存中所有的值。
参考
Views: 6,050 · Posted: 2021-03-25
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...