任何时候你都需要知道这个原理!你不会把商品数据都放内存吧!

今天分享学习关于计算机存储。说到存储,会想到以前的光盘,u盘,大点的机械硬盘,到现在更加普遍使用的固态硬盘。这些也算是IO设备了,说到IO,不得不想起很多时候系统的瓶颈会出现的IO上。这一篇和大家分享存储器的层次结构

1 我们不凡先看看这几个价格

1990~2020随着硬件设备发展,访问延时的变化图 https://colin-scott.github.io/personal_website/research/interactive_latency.html

从这个图我们可以知道,L1 cache访问延时是1ns,到了内存就已经100ns,自然也就会贵很多。再看SSD和HDD,访问延时也不是一个量级。

假设将CPU比喻为计算机中的"大脑",那存储器就是其附身了,存储空间有限但是非常的快。为了记忆部分数据就出现了CPU Cache,它用的是一种叫做SRAM的芯片,下面看看什么是SRAM和DRAM

SRAM

SRAM是英文Static RAM的缩写。静态存储器,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。意味着断电了,里面的数据就会丢失。它的缺点也比较明显,缺点,集成度低,功耗较大,积较大,价格较高,少量用于关键性系统以提高效率,主要用于高速缓存。

每个cpu核心中存在一个L1cache,一个L2cache高速缓存,存储指令和数据。L2cache相对L1cache访问速度更慢,而且L1cache通常会嵌入CPU内部。L3cache通常作为cpu核心的共享资源,容量更大,访问速度更慢

DRAM

动态存储器:DRAM也叫做"动态"存储器,数据存储在电容里面,通过定时刷新的方式保证电容不会因为漏电而导致数据丢失。

SRAM与DRAM

SRAM与DRAM
SRAM与DRAM

现在我们一起看了从cache,内存再到SSD和HDD。当我们需要从硬盘加载数据的时候,不会直接从硬盘加载到Cpu cache中,而是先将数据加载到内存,然后再从内存加载到cache中。所以,这么多不同的存储设备,之和紧挨着的邻居直接打交道,而不会夸邻居将人家坏话。从上(寄存器)到下(机械硬盘)呈现价格越来越便宜,容量越来越大,访问速度越来越慢。所以,通常我们配置电脑的时候,不是直接去买cache而是会考虑买机械硬盘或者固态硬盘,确实便宜不少。最后,小蓝讲这个总结花了一张图。(需要一章性价比图)

存储结构
存储结构

2 时间与空间局部性

我们知道,在进行服务端开发的时候,下面说几个缓存的案例

(1) Linux内存管理中通过MMU的硬件实现虚拟地址到物理地址的转换,但是每次都这样转换势必造成性能的损耗,所以采用了缓存组件TLB来缓存最近使用的虚拟地址到物理地址的映射。

(2) 在计算机网络中,DNS寻址的过程中,先在本地看看有没有映射关系,有就直接进行访问,没有再去递归/迭代查询。

(3) 再比如通过redis缓存热点数据,这样不需要每次直接和数据库打交道,从而降低数据库IO,另外一位缓存的数据的告诉查询,也能加快整个系统的响应速度,从而在一定的程度上提高并发量。

(4) 再比如我们在看短视频的时候,难道官方是一个视频一个视频的给你推荐?通常不会,在我们播放其中一个视频的时候,播放器已经给我们缓存了几个视频,这样对于用户而言,使用时也感觉更加的流畅。

好了,这几个例子基本上可以说明缓存还是很牛X的,那么是不是加了缓存就一定很牛X?非也,事事都有两面性。缓存通常应用于读多写少的业务上,从而提高其缓存的命中率另外缓存通常使用内存作为介质,内存也不是无限大,所以也需要对存储量进行评估。

从上面我们知道越靠近cpu越香,容量小价格贵速度高,那么我们能想办法让其容量大,价格便宜,速度快都满足呢。聪明的人类提出了局部性原理

局部性原理分为时间和空间上的局部性

时间局部性

将已经访问过而且在短间还会访问的进行缓存。比如我们登陆网站的时候,为了下一次登陆不用输入用户名密码,先暂存,下次就可以直接登陆进入。

空间局部性

如果一个数据被访问了,它的相邻数据也很可能被访问。比如看了一部不错的电影会考虑看看是否有连载

这样一来,我们不需要把所有的数据都存放在内存中,而是可以考虑将访问次数比较多的放在贵一点但是快一点的存储器中,将暂时不用的放在容量更大的存储器中。这样也实现了我们的愿望,结合内存,SSD使得只需要用更低的成本满足存储的需求。

来个问题,如何使用最少的钱装下淘宝的所有商品

假设此时网站网站有4亿件,每一件假设5M存储空间,那么一共需要4 * 5=2000T的数据存储。假设内存1M=0.015美元,那此时就是2000TB/1M * 0.015=3000w美元。可是所有的商品中,有一部分季节性产品不一定会被经常访问。

如果我们只将其中百分之1的热门(400w)产品放入内存,其他的放在HDD中。那么我们算算多少钱,3000w美元 * 1% + 2000TB/1M * 0.00004 美元=30.08W美元,相比原来的3000w省下不止一个级别

这里就用到了时间局部性原理。将经常访问的放在更贵的内存中,如果放不下了,可以考虑将内存中最久没有访问的数据移除,这是不是很熟悉,这就是LRU缓存算法,尝试大厂的小伙伴需要考虑考虑如何实现。

那么到底怎么评估有多少请求是在内存中,这里就有个叫做"缓冲命中率"的概念。我们需要尽量的去保证缓存的命中率,这样也能更好地支撑后端请求硬盘的访问次数。

3 总结

线上环境复杂多变,只是通过简单举例的方式让大家能意识到局部性的重要性以及能较好的和成本挂钩,毕竟我们不只是纯写代码,嘻嘻。当然,也不是加了缓存就一定会达到很好的效果,后续会继续探讨这个问题。有点收获请点赞,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章