揭穿内存厂家“谎言”,实测内存带宽真实表现
带宽是存储系统一个的一个非常重要的衡量指标,内存带宽指的是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情况下也差不多能达到这个数量级了。所以,我们以后不要鲁莽地说内存比硬盘要快很多。快不快,关键取决于你怎么用!
欢迎关注公众号:开发内功修炼
揭穿内存厂家“谎言”,实测内存带宽真实表现相关推荐
- MySQL:8.0 运行在 1G 内存服务上的内存配置
512M 服务器装 MySQL 8.0 不太行,建议最低 1G 内存起. 本人以阿里云性能突发 T5 1G 实例测试安装 MySQL 8.0. 正常安装 MySQL 8.0 后内存占用 42% 左右( ...
- gpu服务器厂家_服务器内存和显存知识你了解多少
早期内存通过存储器总线和北桥相连,北桥通过前端总线与CPU通信.从 Intel Nehalem 起,北桥被集成到 CPU 内部,内存直接通过存储器总线和 CPU 相连. 所以,在 AMD采用 Sock ...
- 双通道和单通道区别_实测内存通道的区别:单通道比双通道内存更有优势?
每当我们部署服务器的时候,经常会遇到一个问题,就是需要多少内存?是需要一根RAM还是两根但其容量与单根相同的RAM? 大多数可能第一反应都是觉得最好是选择两根RAM,这样的话就可以利用双通道内存的优势 ...
- LCD不带显存,是如何内存映射屏幕。S5PV210SoC在内存中选一段内存存放颜色数据,通过配置将LCD控制器和这一段内存连接起来,构成映射关系,LCD控制器就自动从显存中读取像素数据传给LCD驱动器
一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...
- 服务器内存 知乎_内存的差距——服务器内存和普通PC内存的区别
21世纪中四大技能之一就是计算机,而计算机中最影响速度的就是CPU和内存,计算机速度快慢除了CPU外就是内存了.内存一般有两种,一种是在服务器上使用的,另外一种就是在普通计算机上使用的,那么这两种内存 ...
- java内存区域与内存溢出异常_Java内存区域与内存溢出异常
Java的内存管理是一个老生常谈的问题,虽然Java号称可以自动管理自己的内存,使程序员从内存管理的围墙解放出来,但是一连串的内存泄漏和溢出方面的问题,使得我们不得不去深入了解Java的内存管理机制. ...
- 纯内存linux,7、内存知识和Linux基本原则
其实我们的操作系统也可以理解为一个虚拟机,因为他是把硬件资源虚拟成文件系统可以识别使用的程序 Linux的swap分区也相当于windows虚拟内存: 电脑三大主键: 1.CPU: time slic ...
- 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )
文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...
- 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念
本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...
- linux资源利用率检查_使用free命令查看实际内存占用(可用内存)
linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free -m方式查看内存占用情况(兆为单位).而系统实际可用内存是不是free部分呢,不是的,系统实际内存占用以及可用内 ...
最新文章
- 一步步部署基于Windows系统的Jenkins持续集成环境
- Rabbits —— HDU-6227
- python用schedule模块实现定时任务
- MongoDB 5.0 来了,原生时序、版本化 API 新特性悉数登场
- python 编译procto错误处理
- OpenShift 4.3 - 获得ImageStream中使用的应用镜像离线包
- Edge 浏览器有秘密白名单,允许 Facebook 运行 Flash 代码
- [转载] 140种Python标准库、第三方库和外部工具
- Pyspark学习入门二:sort排序学习
- pip 换源为阿里云
- <自由之路>LeetCode每日一题(DFS + 记忆化搜索)
- raspberrypi连接神经计算棒人脸识别
- win10任务管理器中的专用GPU内存 vs 共享GPU内存
- win7系统服务优化——服务列表禁止项
- 推荐一款串口调试助手(win10,无广告,功能齐全,操作简单)
- 用excel/WPS制作酷炫数据可视化大屏(附模板)
- python循环5次_python基础-循环语句(5)
- Predicting Buffer Overflow Vulnerabilities through Mining Light-Weight Static Code Attributes
- 三星手机电池循环清零代码_晶弘冰箱故障信息代码及维修程序。
- 南京大学计算机课程表,南大课表新鲜出炉,哪个专业课程最多?