从 2001 年 DDR 内存面世以来倒退到 2019 年的明天,曾经走过了 DDR、DDR2、DDR3、DDR4 四个大的规格时代了。内存的工作频率也从 DDR 时代的 266MHz 进化到了明天的 3200MHz。这个频率在操作系统里叫 Speed、在内存术语里叫等效频率、或罗唆间接简称频率。这个频率越高,每秒钟内存 IO 的吞吐量越大。但其实内存有一个最最根本的频率叫外围频率,是理论内存电路的工作时的一个振荡频率。它是内存工作的根底,很大水平上会影响内存的 IO 提早。我明天想给大家揭开另外一面,这个叫外围频率的东东其实在最近的 18 年里,基本上就没有什么太大的提高。
内存 Speed
在 Linux 上能够查看到你机器上内存的 Speed。
dmidecode | grep -P -A16 "Memory Device"
Memory Device
Array Handle: 0x0009
Error Information Handle: Not Provided
Total Width: 72 bits
**Data Width: 64 bits**
Size: 8192 MB
Form Factor: DIMM
Set: None
Locator: DIMM02
Bank Locator: BANK02
Type: Other
Type Detail: Unknown
**Speed: 1067 MHz**
Manufacturer: Micron
Serial Number: 65ED91DC
Asset Tag: Unknown
Part Number: 36KSF1G72PZ-1G4M1
......
上述命令能够看出每一个插槽上内存物理设施的状况,因为后果太长我只抽取了其中一个内存的信息列了进去。对于咱们开发者来说,其中有两个数据比拟要害。
- Speed: 1067 MHz:每秒能进行内存数据传输的速度,
- Data Width: 64 bits:内存工作一次传输的数据宽度
我的机器上所有的内存条的 Speed 都是 1067(大家别笑话,因为我的测试机器是线上过保淘汰下来的机器,所以老了一点点)。把 Data Width 和 Speed 相乘后失去的就是数据带宽了。咱们把历史上各个阶段的内存的 Speed 和带宽汇总了一下,如下图。
内存背地的机密 - 外围频率
通过 Linux 咱们只看到了内存的一个 Speed,它是数据传输的频率。这个频率又叫 Data Speed,或等效频率。各个商家在内存的销售页面上也把这个频率标在特地显著的地位,揭示消费者他家的内存有多快多快。但其实从内存条的技术参数上来讲,有个最为重要的频率,是 外围频率,它是内存电路的震荡频率,是内存所有工作的基石。
咱们来看一下各代内存的更全面具体的数据。
我汇总了从 SDR 时代,始终到目前支流的 DDR4 的内存的频率表比照。大家能够看到 外围频率曾经多年没有实质性提高了,这是受物理资料的极限限度,内存的外围频率始终在 133MHz~200MHz 之间彷徨。。咱们所看到的内存 Speed 是在这个外围频率的根底上,通过各种技术手段放大进去的。之所以咱们感觉内存在越来越快,就是放大技术手段在不断进步而已。
- SDR 时代:在最古老的 SDR(Single Data Rate SDRAM)年代里,一个时钟脉冲只能在脉冲上沿时传输数据,所以也叫单倍数据传输率内存。这个期间内存的晋升办法就是晋升内存电路的外围频率。
- DDR 时代:然而内存制造商们发现外围频率到了 200MHz 再晋升的话,难度就很大了。所以在电路时钟周期内预取 2bit,输入的时候就在上升期和降落期各传输一次数据。所以外围频率不变的状况下,Speed(等效频率)就翻倍了。
- DDR2 时代:同样是在高低沿各传一次数据,但将 Prefech 晋升为 4,每个电路周期一次读取 4bit。所以 DDR2 的 Speed(等效频率)就达到了外围频率的 4 倍。
- DDR3 时代:同样也是高低沿各传一次数据,进一步将 Prefect 晋升为 8。所以 DDR3 的等效频率能够达到外围频率的 8 倍。
- DDR4 时代:这时预取的晋升曾经十分艰难,所以和 DDR3 一样,Prefech 依然为 8。内存制造商们又另辟蹊径,提出了 Bank Group 设计。容许各个 Bank Group 具备独立启动操作读、写等动作个性。所以等效频率能够晋升到外围频率的 16 倍。
内存还有个概念叫 IO 频率、也叫时钟频率。简略了解为将 DDR 内存的 Speed 频率除以 2,就是内存的 IO 频率。这个必须和 CPU 的外频相匹配能力工作。例如对于 DDR3 来说,如果外围频率 133Mhz 的内存工作频率下,匹配 533MHz 的 CPU 外频, 其 IO 频率就是 533Mhz。数据传输因为高低沿都能够传,所以是外围频率的 8 倍,也就是 1066MHz。
我曾试图在 Linux 下找到能查看外围频率和 IO 频率的命令,然而没有找到,在售的各种内存条仿佛也很少会提及它。但咱们是 IT 从业人员,非普通用户。因而我感觉大家有必要来理解这个原理。(事实上,这两个频率会影响前面探讨的内存的提早参数,而提早参数又决定了内存的真正性能)
汇总一句话,内存真正的工作频率是外围频率,时钟频率和数据频率都是在外围频率的根底上,通过技术手段放大进去的。内存越新,放大的倍数越多。但其实这些放大伎俩都有一些局限性。比方你的内存数据存储并不间断,这时候 DDR2、DDR3 的数据预取对你帮忙并不大。再比方你的过程数据都存在一个 Bank Group 里,你的过程内存 IO 就基本不会达到 DDR4 厂家宣传的速度。
扩大常识:内存提早
除了频率以外,内存还有几个比拟重要的参数,然而同样在 Linux 里没有找到查看的命令。内存的销售页面想找到这几个参数也不是特地容易。
所有的内存条都有 CL-tRCD-tRP-tRAS 四个参数。其中最重要的是 CL-tRCD-tRP 这三个参数,只有你费点劲,所有的在售内存你都能找到这 3 个值。例如经典的 DDR3-1066、DDR3-1333 及 DDR3-1600 的 CL 值别离为 7 -7-7、8-8- 8 及 9 -9-9。当初京东上一条比拟风行的台式机内存金士顿(Kingston)DDR4 2400 8G,其时序是 17-17-17。
第四个参数有时候会被省略。起因有二,第一:当初的开发者不须要间接和内存打交道,而操作系统呢又做的比拟内存敌对,很少会有这个开销真正产生。第二,这个开销的值要比其它的值大很多,切实不太好看。商家为了内存能多卖一些,罗唆就避而不谈了。
好了,问题来了。为什么内存越提高,提早周期反而会变大了呢?
这就是因为提早周期应用延迟时间除以内存时钟周期 (Speed/2) 算进去的。这其实不算太迷信,最间接的方法应该是用延迟时间来评估。延迟时间很大水平上是受内存的外围频率的制约的。而这些年外围频率又基本上没有提高,所以延迟时间也不会有本质的升高。假设延迟时间不变,而时钟周期翻倍了,这样提早周期看起来就是新的内存更大。
明天就带大家理解到这里,前面我会用试验来让你了解你的内存的理论延时。
开发内功修炼之内存篇专辑:
- 1. 带你深刻了解内存对齐最底层原理
- 2. 内存随机也比程序拜访慢,带你深刻了解内存 IO 过程
- 3. 从 DDR 到 DDR4,内存外围频率其实基本上就没太大的提高
- 4. 理论测试内存在程序 IO 和随机 IO 时的拜访延时差别
- 5. 揭穿内存厂家“谎话”,实测内存带宽实在体现
- 6.NUMA 架构下的内存拜访提早区别!
- 7.PHP7 内存性能优化的思维精华
- 8. 一次内存性能晋升的我的项目实际
- 9. 挑战 Redis 单实例内存最大极限,“遭逢”NUMA 陷阱!
我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术实践,也不只介绍实践经验。而是把实践与实际联合起来,用实际加深对实践的了解、用实践进步你的技术实际能力。欢送你来关注我的公众号,也请分享给你的好友~~~