缓存研究

1:目的

         用PHP读取缓存,测试PHP读取缓存时,服务器磁盘I/O读取速度.并根据结果估计瓶颈,并且根据不同的缓存类型进行测试.

2:缓存

2.1概念:

缓存是指临时文件交换区,电脑把最常用的文件从存储器里提出来临时放在缓存里,就像把工具和材料搬上工作台一样,这样会比用时现去仓库取更方便。因为缓存往往使用的是RAM(断电即掉的非永久储存),所以在忙完后还是会把文件送到硬盘等存储器里永久存储。电脑里最大的缓存就是内存条了,最快的是CPU上镶的L1和L2缓存,显卡的显存是给GPU用的缓存,硬盘上也有16M或者32M的缓存。千万不能把缓存理解成一个东西,它是一种处理方式的统称!

2.2 缓存的种类:

2.2.1高速缓存: 在计算机存储系统的层次结构中,介于中央处理器和主存储器之间的高速小容量存储器。它和主存储器一起构成一级的存储器。高速缓冲存储器和主存储器之间信息的调度和传送是由硬件自动进行的。某些机器甚至有二级三级缓存,每级缓存比前一级缓存速度慢且容量大。而这时,一开始的高速小容量存储器就被人称为一级缓存。

2.2.1.1 CPU一级缓存: L1 Cache(一级缓存)是CPU第一层高速缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存储器均由静态RAM组成,结构较复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般L1缓存的容量通常在32—256KB

2.2.1.2 CPU二级缓存: L2 Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片。内部的芯片二级缓存运行速率主频相同,而外部的二级缓存则只有主频的一半。L2高速缓存容量也会影响CPU的性能,原则是越大越好,普通台式机CPU的L2缓存一般为128KB到2MB或者更高,笔记本、服务器工作站上用CPU的L2高速缓存最高可达1MB-3MB.

2.2.1.3 CPU三级缓存: L3 Cache(三级缓存),分为两种,早期的是外置,现在的都是内置的。而它的实际作用即是,L3缓存的应用可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能。降低内存延迟和提升大数据量计算能力对游戏都很有帮助。而在服务器领域增加L3缓存在性能方面仍然有显著的提升。比方具有较大L3缓存的配置利用物理内存会更有效,故它比较慢的磁盘I/O子系统可以处理更多的数据请求。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。

2.2.2磁盘缓存: 磁盘缓存分为读缓存和写缓存。读缓存是指,操作系统为已读取的文件数据,在内存较空闲的情况下留在内存空间中(这个内存空间被称之为“内存池”),当下次软件或用户再次读取同一文件时就不必重新从磁盘上读取,从而提高速率。写缓存实际上就是将要写入磁盘的数据先保存于系统为写缓存分配的内存空间中,当保存到内存池中的数据达到一个程度时,便将数据保存到硬盘中。这样可以减少实际的磁盘操作,有效的保护磁盘免于重复的读写操作而导致的损坏,也能减少写入所需的时间。

磁盘缓存是为了减少CPU透过I/O读取磁盘机的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速。

2.2.3超级缓存: SuperCache,也就是超级缓存,计算机的速度瓶颈主要在于机械硬盘的读写速度,SuperCache就是给硬盘的读写用高速内存来做缓存,是大内存机器的提速首选,服务器的必备利器。

2.2.4 游览器缓存:为了提高访问网页速率浏览器会采用累积式加速的方法,将曾经访问的网页内容(包括图片以及cookie文件等)存放在电脑里。这个存放空间,就称它游览器缓存。以后每次访问网站时,游览器会首先搜索这个目录,其中已经有访问过的内容,那游览器就不必从网上下载,而直接从缓存中调出来,从而提高了访问网站的速率

2.2.5 内存缓存:如Memcache类似分布式的内存对象缓存系统. 通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像视频文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

2.2.6 文件缓存:这里的文件缓存及和文件没有区别,即通过文件的方式来保存一些数据,减少对数据库的压力.

3:测试环境介绍

         3.1:操作系统:CentOS 6.3 64-bit.

         3.2:WEB服务器:Nginx

         3.3:测试语言:PHP

         3.4:CentOS下硬盘I/O监控软件:nmon

         3.5:缓存大小:缓存的都是以一篇小短文的长度左右的大小,如下图


   3.6:缓存数量:缓存皆是以1万数量为标准.

         3.7:缓存代码实现:


缓存分别使用了两种缓存,一种是以Memcache为辅助的将缓存放入内存中,另外一种F则代表是文件缓存,放入目录/Runtime/cache,放入缓存的命名是cache(0-9999),分别一万条记录.而$data数组里一共4条数据,这4条数据皆如1.4所说,是一些短小的文章.

         3.8:内存缓存读取代码:


缓存在内存中是使用了Memcache,由于是使用ThinkPHP框架,所以采用了ThinkPHP自带的一些写法.

         3.9:文件缓存读取代码:


 

                          同理:这个也是ThinkPHP自带的文件缓存写法.

同理:这个也是ThinkPHP自带的文件缓存写法.

4:测试记录

4.1:单个页面测试记录

4.1.1:Memcache(内存缓存)执行时间6.6ms

图1.1 Memcache单页面响应时间

         使用Memcache作为缓存时(既将缓存放入内存中),执行的页面是6.6ms左右.

4.1.2:使用文件缓存执行时间4.7ms

使用文件缓存执行时间显示为4.7ms左右.

图1.2 文件缓存单页响应时间

4.1.3:小结

         文件缓存响应时间更短:从单页面看,文件缓存时间似乎更短,但是由于后台一些程序的执行,也可能会影响变化,并且单页面执行,相差都只是毫秒级别,所以单页面响应时间并不可靠.

4.2:  1万并发下页面测试记录

4.2.1: Memcache(内存缓存)平均响应时间4.351ms

图1.3 Memcache在1万并发下平均响应时间


图1.4 Memcache在1万并发下I/O磁盘情况

4.2.2: 文件缓存执行时间3.465ms


图1.5 文件缓存在1万并发下平均响应时间


图1.6 文件缓存在1万并发下磁盘I/O情况

4.2.3:小结

4.2.3.1:文件缓存仍然快于内存

我测试了几次,几次的结果都如上,看似文件缓存更快,.在网上查到了关于一些关于这个的资料.原话是:为了提高读写文件速度,linux系统采用一种页缓存机制。当应用程序调用read,write等函数读写文件时,系统并不立即与硬盘进行操作,而是查看需要读取的数据是否已在页缓存中,如不在,则从硬盘读取。当写入时,只是将数据写入至页缓存,然后使用系统进程pdflush根据一定算法写入至硬盘.如上所说,由于CPU和内存相差好几个数量级,因此,在CPU和内存之间还存在一块高速缓存,这块高速缓存和用PHP写出来的文件缓存是两个概念,它有着自己的算法,是由操作系统来决定的,这块高速缓存速度虽不及CPU,但是却比内存快很多.如此一来,如果是读的文件仍然放在高速缓存中,那么就可以更快的读取了.但是,根据百度百科里的原话: 缓存的工作原理是当CPU要读取一个数据时,首先从缓存中查找,找到就立即读取并送给CPU处理;没有找到,就用相对慢的速率从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存.也就是说数据放入内存中,同样也会先去高速缓存里查,查到了就不去内存了.都用到高速缓存,但是实际结果显示文件缓存更快一些.可能的原因有:

一、预读取:当硬盘受到CPU指令控制开始读取数据时,硬盘上的控制芯片会控制磁头把正在读取的的下一个或者几个簇中的数据读到缓存中(由于硬盘上数据存储时是比较连续的,所以读取命中率较高),当需要读取下一个或者几个簇中的数据的时候,硬盘则不需要再次读取数据,直接把缓存中的数据传输到内存中就可以了,由于缓存的速率远远高于磁头读写的速率,所以能够达到明显改善性能的目的。

二、CPU高速缓存算法,这个算法是由操作系统决定的 ,但是一般是采用最近最久未使用调度算法,当然也有可能是好几种调度算法集合成更复杂的算法.

三、磁盘缓存的作,如2.2.2磁盘缓存的概念.

4.2.3.2:磁盘I/O分析:

Memcache(缓存在内存)的数据是从内存中读取,所以磁盘上read并不多,但是有时候也有 ,write则占大部分.两者相差巨大.在最高的情况下,write大概有1200kb/s.不过大部分都保持在300kb左右

文件缓存在整个I/O监控中表现比较奇怪.先是read一下爆张到1200kb/s,然后慢慢消缺,接着write开始慢慢上涨.中间一段是持续在read为300kb/s,write持续在360kb/s的情况下.同理论类似,文件缓存需要从磁盘上读取文件,所以就造成了有了read.

依据之前引入高速缓存这个概念,可能也可以由此大概判断,一开始I/O 的read是暴涨,因为需要从文件中读取,之后则下降了是因为有部分来源于高速缓存中,所以就没有再度读取文件缓存了.

5:总结分析

5.1 Linux硬盘I/O瓶颈:

       本次I/O速度最快的情况下大概是3000kb/s,远远低于一般硬盘I/O的读取速度,原因是在于缓存多而小.读取1万个1kb大小的文件和读取1个10000kb的文件两者差距很大,虽然大小都一样,但是小而多的文件除了I/O读取的速度,还有在硬盘上磁头寻道的时间.如果是一个大文件,硬盘I/O读取的瓶颈就在于I/O读写的速度.而对于缓存这样小而多的文件,瓶颈应该在于硬盘里磁头寻道的时间.

5.2 WEB缓存运用

       缓存的种类繁多,但是并不是所有的都能运用在WEB上.比如:高速缓存,磁盘缓存,这一类都是跟操作系统相关,WEB语言作为高级语言,并不能控制底层.所以能够用于WEB的缓存,大类就只有三种:

一、           缓存放在内存中

二、           缓存以文件放在硬盘中.

三、           缓存在客户端游览器上.


原文地址:https://www.cnblogs.com/javawebsoa/p/3035759.html