从DDR发展到DDR4,内存的核心频率指标基本没有太大的进步,规格时代到了。内存的工作频率也从DDR时代的266MHz发展到如今的3200MHz。这个频率在操作系统中叫做Speed,相当于内存术语中的频率,或者简称为频率。频率越高,每秒内存IO的吞吐量就越大。但实际上,内存有一个最基本的频率,称为核心频率,是实际内存电路工作时的振荡频率。它是内存工作的基础,极大地影响着内存的IO延迟。今天我想向你揭示另一面。其实核心频率这个东西在过去18年里基本没有太大的进步。MemorySpeed在Linux上,可以查看你机器内存的Speed。dmidecode|grep-P-A16“内存设备”内存设备阵列句柄:0x0009错误信息句柄:未提供总宽度:72位**数据宽度:64位**大小:8192MB外形尺寸:DIMM组:无定位器:DIMM02组Locator:BANK02Type:OtherTypeDetail:Unknown**Speed:1067MHz**Manufacturer:MicronSerialNumber:65ED91DCAssetTag:UnknownPartNumber:36KSF1G72PZ-1G4M1......上面的命令可以看到每个Forslot上内存物理设备的情况,由于结果太长,我只提取其中一条内存的信息列出来。对于我们开发者来说,有两个关键数据。Speed:1067MHz:内存数据每秒传输的速度,DataWidth:64bits:内存工作一次传输数据的宽度。我机器上所有内存条的Speed都是1067(别开玩笑,因为我测试的机器是网上淘汰的机器,所以有点旧)。数据带宽由数据宽度和速度相乘获得。我们总结了内存在历史各个阶段的Speed和bandwidth,如下图所示。内存核心频率背后的秘密通过Linux我们只看到了内存的一个Speed,也就是数据传输的频率。该频率也称为数据速度或等效频率。各家商家也在内存销售页面特别明显的位置标注了这个频率,提醒消费者自己的内存有多快。但实际上,从内存条的技术参数来看,有一个最重要的频率,也就是核心频率,它是内存电路的振荡频率,是内存一切工作的基石。让我们来看看每一代内存更全面详细的数据。我整理了一张SDR时代的DDR4内存和现在主流的DDR4内存的频率对比表。可以看到核心频率已经很多年没有大幅提升了。这是受物理材料的限制。内存的核心频率一直徘徊在133MHz到200MHz之间。.我们看到的内存速度就是基于这个核心频率,通过各种技术手段放大的。我们之所以感觉内存越来越快,是因为倍率技术在不断进步。SDR时代:在最古老的SDR(SingleDataRateSDRAM)时代,一个时钟脉冲只能在脉冲边沿传输数据,因此也被称为单数据速率内存。这个时期提高内存的方法就是提高内存电路的核心频率。DDR时代:然而,内存厂商发现,要将核心频率提升到200MHz非常困难。因此在电路时钟周期预取2位,输出时分别在上升沿和下降沿传输一次数据。所以在核心频率不变的情况下,Speed(等效频率)翻倍。DDR2时代:数据也是上下沿传输一次,但Prefech增加到4,每个电路周期读取一次4位。所以DDR2的Speed(等效频率)达到了核心频率的4倍。DDR3时代:上下沿也传输一次数据,Prefect进一步增加到8。所以DDR3的等效频率可以达到核心频率的8倍。DDR4时代:这时候prefech很难提高,所以和DDR3一样,Prefetch还是8。存储器制造商采取了另一种方法并提出了BankGroup设计。允许每个BankGroup有独立的读写等启动操作。所以等效频率可以提高到核心频率的16倍。内存还有一个概念叫IO频率,也叫时钟频率。简单理解就是DDR内存的Speed频率除以2就是内存的IO频率。这必须匹配CPU的前端总线才能工作。比如DDR3,如果核心频率是133Mhz,内存工作频率匹配533MHz的CPU外接频率,它的IO频率是533Mhz。因为数据传输可以沿上下沿传输,所以是核心频率的8倍,也就是1066MHz。想找Linux下查看核心频率和IO频率的命令,没找到,市售的各种内存条好像也很少提。但我们是IT从业者,不是普通用户。所以,我觉得大家有必要了解一下这个道理。(其实这两个频率会影响后面讨论的内存的延迟参数,而延迟参数决定了内存的真实性能)总之,内存真正的工作频率是核心频率,时钟频率而数据频率都是在核心频率的基础上,通过技术手段进行放大。内存越新,放大倍数越大。然而,这些扩增方法有一些局限性。例如,你的记忆数据存储是不连续的。这时,DDR2和DDR3数据预取对你帮助不大。再比如,如果你的进程数据存储在BankGroup中,你的进程内存IO永远达不到DDR4厂商标榜的速度。扩展知识:内存除了内存延迟的频率外,还有几个比较重要的参数,但是在linux中也没有命令可以查看。在内存销售页面上并不是特别容易找到这些参数。所有内存条都有四个参数:CL-tRCD-tRP-tRAS。其中最重要的是三个参数CL-tRCD-tRP。只要付出一点努力,就可以在所有内存中找到这三个值。比如经典的DDR3-1066、DDR3-1333和DDR3-1600的CL值分别是7-7-7、8-8-8和9-9-9。现在京东上有一款比较流行的台式机内存金士顿(Kingston)DDR424008G,它的上市时间是17-17-17。第四个参数有时被省略。有两个原因。首先,开发者不需要直接和内存打交道,操作系统对内存更友好,所以这种开销很少发生。第二,这个开销的值比其他值大很多,实在是不好看。商家可以为了内存多卖内存,干脆避而不谈。那么,问题来了。为什么内存越高级,延迟周期就会越长?这是因为延迟时间是通过将延迟时间除以内存时钟周期(Speed/2)来计算的。这其实不是很科学。最直接的方法应该是用延迟时间来评估。延迟在很大程度上受内存核心频率的限制。这几年核心频率基本没有提升,所以延迟时间也不会大幅减少。假设延迟时间不变,但时钟周期加倍,延迟周期看起来像新内存更大。今天我就带大家明白这一点,后面我会通过实验让大家了解自己记忆的实际延迟。练内功:内存部分:1.带你了解内存对齐的底层原理2.内存随机访问比顺序访问慢,让你深刻理解内存IO流程3.从DDR到DDR4,内存核心频率基本一致没太大进步4.实测内存有顺序IO和随机IO的访问延迟差异5.揭穿内存厂商的“谎言”,实测内存带宽的实际表现6.NUMA架构下内存访问延迟的区别!7.PHP7内存性能优化精髓8.一个内存性能提升的项目实践9.挑战Redis单实例内存最大极限,“遭遇”NUMA陷阱!我的公众号是“练内功练功”。在这里,我不是简单地介绍技术理论,也不是只介绍实践经验。而是理论联系实际,用实践加深对理论的理解,用理论提高技术实践能力。欢迎关注我的公众号,分享给你的朋友吧~~~
