计算机存储结构、执行速度及对应用的影响
计算机存储结构、执行速度及对应用的影响
万丈高楼,平地起。
计算机世界的信息化软件工程,是构筑于计算机硬件之上的。
由于信息的流转依托于计算机不同的部件,所以计算机系统的内部设计、各类应用架构无不受部件之间速度差异的影响。
本文,主要先介绍存储体系,再量化展示这种速度的差异,最后简单说一下对上层系统的影响。你就理解为什么用了缓存,会快~~
计算机存储体系
如图,从下到上,单位金钱获得的容量组件减少,但是响应的速度增大。
图:《深入理解计算机系统》
计算机各层次速度的度量
存储体系代表了层级,是大的方向。具体落实到机器的速度,我们还要看具体指标和数值,以作参考。具体硬件的速度自然不是下表所示的值,所以最多算个示意,但内部的相对关系还是比较确认的,至少在量级角度看,硬件之间速度差异是准确的。
序号 | 存储英文名称 | 存储中文名称 | 容量 | 时间(纳秒) | 微秒 | 毫秒 | CPU时钟周期数 |
---|---|---|---|---|---|---|---|
1 | CPU寄存器 | CPU寄存器 | 32/64 位 | 0.5 | 1 | ||
2 | L1 cache reference | 读取CPU一级缓存 | 几十~几百KB | 0.5 | 1 | ||
3 | Branch mispredict | (转移、分支预测) 比如:if | 5 | 10 | |||
4 | L2 cache reference | 读取CPU的二级缓存 | 几百KB~几MB | 7 | 14 | ||
5 | Mutex lock/unlock | 互斥锁\解锁 | 25 | 50 | |||
6 | Main memory reference | 内存引用(找到内存地址) | 几百MB~几GB | 100 | 0.1 | 200 | |
7 | Compress 1K bytes with Zippy | 使用Zippy压缩1K字节数据 | 3000 | 3 | 6000 | ||
8 | Send 1K bytes over 1 Gbps network | 在1Gbps的网络上发送1k字节 | 10,000 | 10 | 0.01 | 40000 | |
9 | Read 4K randomly from SSD | SSD磁盘随机读4k | 150,000 | 150 | 0.15 | 300,000 | |
10 | Read 1 MB sequentially from memory | 从内存顺序读取1MB | 250,000 | 250 | 0.25 | 500000 | |
11 | Round trip within same datacenter | 从一个数据中心往返一次,ping一下 | 500,000 | 500 | 0.5 | 1000,000 | |
12 | Disk seek | 磁盘搜索 | 几百GB~几TB | 10,000,000 | 10,000 | 1 | 20,000,000 |
13 | Read 1 MB sequentially from network | 从网络上顺序读取1兆的数据 | 10,000,000 | 10,000 | 1 | 20,000,000 | |
14 | Read 1 MB sequentially from SSD | 从SSD磁盘顺序读出1MB | 30,000,000 | 30,000 | 3 | 60,000,000 | |
15 | Send packet CA->Netherlands->CA | 一个包的一次远程访问 | 150,000,000 | 150,000 | 15 | 300,000,000 |
表引自(有大的修改):https://gist.github.com/jboner/2841832
寄存器速度等于CPU时钟周期,表假设CPU的1次晶振频率0.5纳秒,对应CPU2.0GHz。
上表采样硬件都比较老了,它的主要价值在于:站在CPU时钟周期的角度来度量,各个部件之间的速度差距具体大到什么程度。
比较新的设备数据暂时不提供(没收入没动力的)。
上表格,对机械磁盘的顺序读写及随机读写性能,以及SSD硬盘的顺序读写、随机读写性能,没有给出直观的数据。
业内,顺序读写性能使用容量/s
来度量,随机读写性能使用IOPS
(Input/Output Operations Per Second)度量。
例如SATA或M.2 SATA接口的顺序读写速度理论上可达600MB/s,而使用支持NVMe协议的M.2接口、走PCIE4.0×4通道的固态硬盘,其顺序读取速度可达7G/s。当然新款的内存性能也是跟着起来的了,这里就不提了。
下图是国产致态 TiPro7000固态硬盘的技术指标(存储国产已崛起):
CPU内部寄存器速度和DRAM内存的速度差异来源
制造工艺和成本决定。CPU内部的寄存器使用的SRAM工艺,是6个晶体管电路原件组成的,不需要刷电,频率等同CPU时钟。而DRAM内存就没那么复杂的晶体管了,造价合适,需要定期刷电(刷新)维持存储数据,这里就消耗了大量时间,是性价比的妥协。具体可见DRAM和SRAM的区别
计算机存储结构速度差异对上层应用的影响
核心就一句话:运用时间和空间局部性原理,上一层级做下一层级的缓存。上一层没有,再去下一层拿。
所谓时间和空间局部性原理,意思就是最近使用和访问的地址及附近地址空间,大概率还会被使用。先留一份在这一层,下次再用的时候,就不用取了。
找了几个点,简单说一下。
指令和数据缓存
计算机软硬件架构中的设计会充分利用时间和空间局部性原理。一方面,计算机通过缓存系统来存储最近访问的数据和指令,以提高访问速度。缓存系统利用时间局部性原理,尽量保持最近被访问的数据和指令在高速缓存中,使CPU能够更快地访问这些数据和指令。
另一方面,计算机通过使用指令流水线和分支预测等技术来提高指令的执行效率。指令流水线利用空间局部性原理,将多条指令分段执行,以提高指令的吞吐量。CPU内部的L1 2 3级缓存,就是这种局部性和速度的进化结果。
文件系统
操作系统中的文件和磁盘系统也会利用时间和空间局部性原理进行设计。读取文件时,操作系统会通过缓存的方式将最近被访问的文件块存储在内存中,以利用时间局部性原理。同时,操作系统会关联文件的物理地址,以利用空间局部性原理,将相邻的文件块存储在物理磁盘上的相邻位置。
应用的本地缓存
客户端访问服务器,网络io的耗时是很慢的,提速有什么方案?直接把数据存在用户本地一份。背后原理是什么?读取本地磁盘耗时,比网络耗时短。
Redis为代表的缓存
为什么很多高并发场景要加redis缓存,大家都知道redis在内存里,很快。但是有多快?上表访存200 比60,000,000,当然这里面一个是寻址,一个是读1M,没可比性。内存通常的传输速率是以G/s为单位的,比如DDR4内存读写速度大概50G每秒(50000M),固态硬盘读肯定走的是随机读,按致钛最低速度来550000 * 4k / 1024 = 2148M/s,速度差距的数量级在20倍附近,这只是理论值,实际当中有偏差,而且也不可能每一个读取单元都是4k,所以基本可以估计是10-100这个量级的速度差。
redis可以通过以下几个方面大幅度提高系统的并发性能和响应速度。
-
使用缓存减轻数据库压力【缓存-数据库缓存】:
Redis作为一个基于内存的缓存数据库,可以将热点数据缓存在内存中,避免了频繁从磁盘读取数据。由于内存的读写速度远高于磁盘的读写速度,因此可以大幅度提高系统的响应速度。 -
提供高效的数据结构和操作【数据结构-操作】:
Redis支持多种数据结构,如字符串、哈希表、列表、集合和有序集合等,这些数据结构的操作都是原子性的。这意味着在多线程或多进程并发访问下,不会出现数据不一致的问题。对内存的Redis的操作速度非常快,可以高效地进行数据读写和计算。然后在慢慢的同步回数据库。
mysql
内存比磁盘快,怎么利用起来的呢?
-
查询缓存:MySQL服务器会将查询的结果缓存在内存中,以便下次相同的查询可以直接从缓存中获取结果,减少了查询的时间开销。
-
索引数据结构:MySQL服务器使用B+树等索引数据结构来优化查询的性能。这些数据结构利用空间局部性原理,将相邻的数据块存储在相邻的磁盘页面中,减少了磁盘访问时间。
-
数据页预读:MySQL服务器会根据用户查询的访问模式,提前将可能需要的数据块加载到内存中,以利用时间局部性原理,减少磁盘IO操作的时间开销。
-
数据修改操作的重放日志:MySQL服务器会将数据修改操作写入重放日志(Redo Log)中,以保证数据的持久性。通过将多个修改操作合并为一次IO操作,利用空间局部性原理,提高写操作的效率。
-
数据页压缩:MySQL服务器可以使用压缩算法对磁盘上的数据页进行压缩,减少磁盘存储空间的占用。这利用了空间局部性原理,将相邻的数据块压缩为一个连续的存储区域。
mysql的读写分离、主从复制为什么能支持实际的场景,无他,外部网卡过来的写数据量,磁盘写的速度完全可以覆盖。网卡读的流量,其他手段又可解决。主从复制走内部网络的带宽又是G/s单位计数的,所以主从复制的带宽不是问题。全国top级公司业务的并发流量,打到DB层的写操作也不会超过几百M/s的,足够了。
可参考:缓存技术原理
更多推荐
所有评论(0)