Skip to content

缓存

关于系统的性能

系统性能的指标一般包括响应时间、延迟时间、吞吐量,并发用户数和资源利用率等几个方面

响应时间是指系统对用户请求作出响应的时间,与人对软件性能的主观感受是非常一致的,它完整地记录了整个系统处理请求的时间。
由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同,甚至同一功能在不同输出数据的情况下响应时间也不相同。 输入数据的情况所以,响应时间通常是指该软件系统所有功能的平均响应时间或者所有功能中的最大响应时间。
当然,有时候也需要对每个或每组功能讨论其平均响应时间和最大响应时间。

在讨论软件性能时,我们更关心所开发软件本身的“响应时间”。
也就是说,可以把用户感受到的响应时间划分为“呈现时间”和“系统响应时间”,前者是指客户端在接收到系统数据时呈现页面所需的时间,而后者是指客户端接收到用户请求到客户端接收到服务器发来的数据所需的时间。
还可以把“系统响应时间”进一步分解为“网络传输时间”和“应用延迟时间”,其中前者是指数据在客户端和服务器端进行传输的时间,而后者是指系统实际处理请求所需的时间。

吞吐量是指系统在单位时间内处理请求的数量。
对于无并发的应用系统而言,吞吐量与响应时间成严格的反比关系,实际上此时吞吐量就是响应时间的倒数。
无并发的应用都是单机应用,对于互联网或者移动互联网上的产品而言,并发用户数是指系统可以同时承载的正常使用系统功能的用户数量。
与吞吐量相比,并发用户数是一个更直观但也更笼统的性能指标。
而资源利用率反映的是在一段时间内资源平均被占用的情况。

从浏览器到网络,再到应用服务器,甚至到数据库,通过在各个层面应用缓存技术,整个系统的性能将大幅提高。
例如,缓存离客户端更近,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,系统就显得更灵敏。
缓存数据的重复使用,大大降低了用户的带宽使用,其实也是一种变相的省钱(如果流量要付费的话),同时保证了带宽请求在一个低水平上,更容易维护。
所以,使用缓存技术,可以降低系统的响应时间,减少网络传输时间和应用延迟时间,进而提高了系统的吞吐量,增加了系统的并发用户数。
利用缓存还可以最小化系统的工作量,使用了缓存就可以不必反复从数据源中查找,缓存所创建或提供的同一条数据更好地利用了系统的资源。

因此,缓存是系统调优时常用且行之有效的手段,无论是操作系统还是应用系统,缓存策略无处不在。

如果说音乐是时间的艺术,那么,缓存就是软件系统中关于时间的艺术。“缓存为王”本质上是系统性能为王,对用户而言就是用户体验为王。

从网站的架构发展看缓存

最初的网站可能就是一台物理主机,放在IDC或者租用的是云服务器,上面只运行着应用服务器和数据库,LAMP(Linux Apache MySQL PHP)就是这样流行起来的。
由于网站具备了一定的特色,吸引了部分用户的访问,逐渐会发现系统的压力越来越大,响应速度越来越慢,而这个时候比较明显的往往是数据库与应用的互相影响,
于是将应用服务器和数据库服务器从物理上分离开来,变成了两台机器,
这个时候技术上没有什么新的要求,系统又恢复到以前的响应速度了,支撑住了更高的流量,并且不会让数据库和应用服务器互相影响。

随着访问网站的人数越来越多,响应速度又开始变慢了,可能是访问数据库的操作太多,导致数据连接竞争激烈,因此缓存开始登场。
若想通过缓存机制来减少数据库连接资源的竞争和对数据库读的压力,那么可以选择采用静态页面缓存,这样程序上可以不做修改,就能够很好地减少对Web服务器的压力以及减少对数据库连接资源的竞争。
随后,动态缓存登场,将动态页面里相对静态的部分也缓存起来,因此考虑采用类似的页面片段缓存策略。

随着访问量的持续增加,系统又开始变慢,怎么办?数据缓存来了,将系统中重复获取的数据信息从数据库加载到本地,同时降低了数据库的负载。

随着系统访问量的再度增加,应用服务器又扛不住了,开始增加Web服务器。
那如何保持应用服务器中数据缓存信息的同步呢?例如之前缓存的用户数据等,这个时候通常会开始使用缓存同步机制以及共享文件系统或共享存储等。

在享受了一段时间的访问量高速增长后,系统再次变慢。
开始数据库调优,优化数据库自身的缓存,接下来是采用数据库集群以及分库分表的策略。
分库分表的规则是有些复杂的,考虑增加一个通用的框架来实现分库分表的数据访问,这个就是数据访问层(Data Access Layer,DAL)。
同时,在这个阶段可能会发现的之前的缓存同步方案会出现问题,因为数据量太大,导致现在不太可能将缓存存储在本地后再同步,于是分布式缓存终于来了,将大量的数据缓存转移到分布式缓存上。

至此,系统进入了无级缩放的大型网站阶段,当网站流量增加时,应对的解决方案就是不断添加Web服务器、数据库服务器、以及缓存服务器了。