带宽是存储系统一个的一个十分重要的掂量指标,内存带宽指的是CPU从内存读取或写入数据到内存的速率。咱们明天来思考一个问题,在你的应用程序里内存的拜访带宽可能达到多少?

各代内存带宽规格

实践上内存带宽的计算公式是:Band Width = Speed * Data Width。在这个公式的根底上,咱们来看一下各代规格的内存带宽体现。

从上图来看,DDR3代的内存 DDR3代1066MHz的带宽都曾经达到了8.5GB/s, DDR4代3200MHz更是达到了惊人的25.6G。 厂家在进行销售的时候也都是用这个公式来算,话中有话就是通知你:“我家的产品十分快,大家赶快来买啊!”

厂家这么宣传仿佛也不算错,然而有诱导性的谎话在其中。 厂家这个数据的根底是内存严格以程序IO的形式工作,而且把传输的内存地址也当数据来看,进而计算出的后果。但咱们在《内存随机拜访也比程序慢,带你深刻了解内存IO过程》中明确了的是,内存在并肯定是所有的Data Speed周期都在源源不断往外吐数据。在CPU传入了行地址后,内存关上一行须要tRCD+tRP个时钟周期的提早。输出列地址后,又须要期待CL个时钟周期。而内存作为易失性存储元器件,又须要定时对所有的行进行充电,来保证数据不失落。所以,在实践中,咱们并不是总是可能达到厂家宣传的实践带宽值。

留神:实践带宽值计算时采纳的是内存的Speed,也就是其数据频率。而内存的提早呢,用的是时钟周期。古代的内存在时钟周期的上沿和下沿都能够传输数据,所以数据频率比Speed又慢了一半。对于笔者Speed为1067MHz的内存条,其时钟频率是553MHz。

邓爷爷说过,实际是测验真谛的唯一标准。咱们明天就来进行一下理论的测试,看看内存的到底每秒能给咱们吐出多少的数据。和前文《理论测试内存在程序IO和随机IO时的拜访延时差别》的测试方法相似,咱们明天对办法进行下小改变,用它来测试带宽。

程序IO状况外围测试方法

测试代码主体上和提早测试差不多,定义一个指定大小的数组,而后以指定步长对其进行拜访。

void init_data(double *data, int n){      int i;      for (i = 0; i < n; i++)    {          data[i] = i;        }  }   void seque_access(int elems, int stride) {        int i;      double result = 0.0;       volatile double sink;        for (i = 0; i < elems; i += stride) {          result += data[i];        }      sink = result;  }

思考到内存对齐能进步性能,所以偏心起见,咱们每次都是按内存位宽去取的(一个double 8个字节,正好是一个内存位宽)。带宽就是一秒内拜访过的字节总数,所以咱们通过如下代码进行计算。

result = total_accessed_bytes * 1000  / used_microseconds;

程序IO状况带宽测试后果

笔者的服务器上的内存条是DDR3,1067MHz,提早参数为7-7-7-24。咱们进行了多场景的测试。

场景一: 固定数组大小2K,调节步长

数组为2k,足够小到L1 cache全副都能装的下。这时候其实根本理论内存IO产生的很少,大部分都是更高效的L1 cache的IO,在CPU外部就实现了。但最高值也才6G而已,也没有达到厂家声称的8GB。

场景二: 固定步长为8,数组从32K到64M

数组越大,Cache越装不下,数据拜访的IO会更多地往后穿透到L2、L3和内存。L1、L2、L3和内存IO的性能顺次递加,因而数组越大,均匀带宽就会越低。

场景三: 步长为32,数组从32K到64M

步长减少后,穿透到内存的次数进一步减少,带宽进一步降落。这个时候,咱们应用程序视角看到的数据带宽曾经降落到1GB以下了。

再测随机IO状况

后面的测试状况,尽管步长也在变动,但都是有序递增。这样内存的间断两次IO之间,尽管列地址会变,然而行地址极有可能不发生变化,因而效率还是算比拟高。 咱们这次是来彻底随机进行拜访,再来看一下。

随机拜访,数组从8K到64M

当数组比拟小的时候,尽管乱序拜访,然而cache能兜住,因而内存IO实际上产生的很少。但当数组减少到64M的时候,再加上哪一级Cache都兜不住了。再加上拜访又足够随机,因而都穿透到了内存,而且行的行地址也极大可能发生变化。这时,内存带宽居然降落到了474M。

论断

厂家在宣传的内存带宽数据的时候,用的是严格程序IO状况下的数据,而且把地址的传输也当数据算了。然而厂家不会通知你,在理论中内存的带宽并没有你设想的那么快,在随机IO工作模式的状况下,带宽只有474M而已。 当初SSD固态硬盘程序IO也差不多能达到这个数量级了。所以,咱们当前不要鲁莽地说内存比硬盘要快很多。快不快,要害取决于你怎么用!



开发内功修炼之内存篇专辑:

  • 1.带你深刻了解内存对齐最底层原理
  • 2.内存随机也比程序拜访慢,带你深刻了解内存IO过程
  • 3.从DDR到DDR4,内存外围频率其实基本上就没太大的提高
  • 4.理论测试内存在程序IO和随机IO时的拜访延时差别
  • 5.揭穿内存厂家“谎话”,实测内存带宽实在体现
  • 6.NUMA架构下的内存拜访提早区别!
  • 7.PHP7内存性能优化的思维精华
  • 8.一次内存性能晋升的我的项目实际
  • 9.挑战Redis单实例内存最大极限,“遭逢”NUMA陷阱!

我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术实践,也不只介绍实践经验。而是把实践与实际联合起来,用实际加深对实践的了解、用实践进步你的技术实际能力。欢送你来关注我的公众号,也请分享给你的好友~~~