带宽是存储系统一个的一个非常重要的衡量指标,内存带宽指的是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之间,虽然列地址会变,但是行地址极有可能不发生变化,因此效率还是算比较高。 我们这次是来彻底随机进行访问,再来看一下。

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

结论

厂家在宣传的内存带宽数据的时候,用的是严格顺序IO情况下的数据,而且把地址的传输也当数据算了。但是厂家不会告诉你,在实际中内存的带宽并没有你想象的那么快,在随机IO工作模式的情况下,带宽只有474M而已。 现在SSD固态硬盘顺序IO情况下也差不多能达到这个数量级了。所以,我们以后不要鲁莽地说内存比硬盘要快很多。快不快,关键取决于你怎么用!

欢迎关注公众号:开发内功修炼

揭穿内存厂家“谎言”,实测内存带宽真实表现相关推荐

  1. MySQL:8.0 运行在 1G 内存服务上的内存配置

    512M 服务器装 MySQL 8.0 不太行,建议最低 1G 内存起. 本人以阿里云性能突发 T5 1G 实例测试安装 MySQL 8.0. 正常安装 MySQL 8.0 后内存占用 42% 左右( ...

  2. gpu服务器厂家_服务器内存和显存知识你了解多少

    早期内存通过存储器总线和北桥相连,北桥通过前端总线与CPU通信.从 Intel Nehalem 起,北桥被集成到 CPU 内部,内存直接通过存储器总线和 CPU 相连. 所以,在 AMD采用 Sock ...

  3. 双通道和单通道区别_实测内存通道的区别:单通道比双通道内存更有优势?

    每当我们部署服务器的时候,经常会遇到一个问题,就是需要多少内存?是需要一根RAM还是两根但其容量与单根相同的RAM? 大多数可能第一反应都是觉得最好是选择两根RAM,这样的话就可以利用双通道内存的优势 ...

  4. LCD不带显存,是如何内存映射屏幕。S5PV210SoC在内存中选一段内存存放颜色数据,通过配置将LCD控制器和这一段内存连接起来,构成映射关系,LCD控制器就自动从显存中读取像素数据传给LCD驱动器

    一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...

  5. 服务器内存 知乎_内存的差距——服务器内存和普通PC内存的区别

    21世纪中四大技能之一就是计算机,而计算机中最影响速度的就是CPU和内存,计算机速度快慢除了CPU外就是内存了.内存一般有两种,一种是在服务器上使用的,另外一种就是在普通计算机上使用的,那么这两种内存 ...

  6. java内存区域与内存溢出异常_Java内存区域与内存溢出异常

    Java的内存管理是一个老生常谈的问题,虽然Java号称可以自动管理自己的内存,使程序员从内存管理的围墙解放出来,但是一连串的内存泄漏和溢出方面的问题,使得我们不得不去深入了解Java的内存管理机制. ...

  7. 纯内存linux,7、内存知识和Linux基本原则

    其实我们的操作系统也可以理解为一个虚拟机,因为他是把硬件资源虚拟成文件系统可以识别使用的程序 Linux的swap分区也相当于windows虚拟内存: 电脑三大主键: 1.CPU: time slic ...

  8. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

  9. 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念

    本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...

  10. linux资源利用率检查_使用free命令查看实际内存占用(可用内存)

    linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free -m方式查看内存占用情况(兆为单位).而系统实际可用内存是不是free部分呢,不是的,系统实际内存占用以及可用内 ...

最新文章

  1. 一步步部署基于Windows系统的Jenkins持续集成环境
  2. Rabbits —— HDU-6227
  3. python用schedule模块实现定时任务
  4. MongoDB 5.0 来了,原生时序、版本化 API 新特性悉数登场
  5. python 编译procto错误处理
  6. OpenShift 4.3 - 获得ImageStream中使用的应用镜像离线包
  7. Edge 浏览器有秘密白名单,允许 Facebook 运行 Flash 代码
  8. [转载] 140种Python标准库、第三方库和外部工具
  9. Pyspark学习入门二:sort排序学习
  10. pip 换源为阿里云
  11. <自由之路>LeetCode每日一题(DFS + 记忆化搜索)
  12. raspberrypi连接神经计算棒人脸识别
  13. win10任务管理器中的专用GPU内存 vs 共享GPU内存
  14. win7系统服务优化——服务列表禁止项
  15. 推荐一款串口调试助手(win10,无广告,功能齐全,操作简单)
  16. 用excel/WPS制作酷炫数据可视化大屏(附模板)
  17. python循环5次_python基础-循环语句(5)
  18. Predicting Buffer Overflow Vulnerabilities through Mining Light-Weight Static Code Attributes
  19. 三星手机电池循环清零代码_晶弘冰箱故障信息代码及维修程序。
  20. 南京大学计算机课程表,南大课表新鲜出炉,哪个专业课程最多?

热门文章

  1. 锁定计算机怎么设密码忘记了怎么办,如何设置笔记本电脑指纹密码忘了怎么办...
  2. LiveData的postValue与setValue多次调用问题
  3. 杭州旅游全攻略,详细!
  4. 分享 :9个实用的Excel小技巧
  5. 如何用python做动画_如何使用python制作简单的动画?
  6. 如何阅读一本书-读书笔记
  7. 微信小程序退出到微信
  8. [转载]美国夫妻生活如何在钱上更亲密
  9. u盘装了linux后无法格式化,U盘制作ubuntu安装盘后无法格式化处理
  10. Nginx的请求转发使用步骤