缓存与性能的一些思考

作者:蔡舒

导语

身为码农,缓存大概是我们接触最频繁的概念之一了。 当读写性能不达标,我们也许会脱口:做缓存策略吧,性能会大幅提升的; 当发现缓存命中率不足时,我们也许会脱口而出:提升命中率吧,性能会大幅提升的; 但事实确实如此吗?会不会其他方法会工作的更好?下面是我的一些数据分析,希望能给大家带来一些灵感与思考。

公式

命中率 = 缓存命中次数/请求总数 时延 = 命中率×缓存时延 (1-命中率)×(缓存时延 失效时延) QPS = 线程数/时延

一个例子

假设我们运行了一个单线程的数据服务,单请求的延迟为 100ms,qps 为 10;做了缓存策略之后,命中缓存的情况下,单请求的延迟为 0.1ms,qps 为 10000。我们用服务的平均 qps 来代表其性能,下表为性能和缓存命中率的关系:

缓存命中率

性能(QPS

0%

9.99

20%

12

50%

19

70%

33

90%

99

92%

123

95%

196

96%

243

97%

322

98%

476

99%

909

100%

1000

从表格中,可以发现一些有趣的现象:当我们把缓存命中率从 20%提升到 50%,带来的性能提升还不到 60%。而当命中率从 98%提升到 99%,仅仅一个百分点,性能提升就达到了近一倍!

缓存与性能的关系

上面的分析,说明了缓存命中率和性能并不是一个线性关系。缓存与性能的关系曲线如下图所示。当缓存层级间速度差异越大,此曲线越陡峭。

指导意义

  • 只有当缓存命中率达到 80%以上,才会有明显的性能提升。命中率为 80%,性能提升约 3~5 倍;命中率为 90%,性能提升约 5~10 倍;
  • 缓存命中率与业务场景有关,局部性越强,缓存性能提升越大。对于完全随机的业务,缓存策略提升不大,甚至拖累性能;
  • 对于特定业务,如果缓存命中率达到 80%甚至 90%以上,优化缓存命中率可以得到巨大的性能提升;
  • 对于特定业务,如果缓存命中率不到 70%,优化未命中缓存时的业务性能更靠谱。比如换 SSD,优化算法等;
  • 高性能存储系统,比如数据库服务,一定要预留大量可用系统内存以供页缓存使用。一旦内存不够,则性能将会大大折扣。比如系统内存不足,导致页缓存命中率从 99%跌到 95%,性能会下降五倍之多;
  • SSD 是个好东西。对于纯随机的读写服务,SSD 比缓存要靠谱得多;
  • 对于局部性不太强的业务,二级缓存、三级缓存也是有用的,如果一级缓存命中率不高,多加几层缓存也可使得每一层缓存间的命中率达到 90%以上。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4425
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5248
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3025
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

5637
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5488
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

39410
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2832
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8838
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2980

扫码关注云+社区