乐趣区

关于linux:揭穿内存厂家谎言实测内存带宽真实表现

带宽是存储系统一个的一个十分重要的掂量指标,内存带宽指的是 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 陷阱!

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

退出移动版