0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在你的应用程序里内存的访问带宽能够达到多少?

冬至配饺子 来源:开发内功修炼 作者:张彦飞allen 2022-08-30 16:58 次阅读

带宽是存储系统一个的一个非常重要的衡量指标,内存带宽指的是CPU从内存读取或写入数据到内存的速率。我们今天来思考一个问题,在你的应用程序里内存的访问带宽能够达到多少?

1、各代内存规格

理论上内存带宽的计算公式是:Band Width = Speed * Data Width。在这个公式的基础上,我们来看一下各代规格的内存带宽表现。

pYYBAGMN0JaAP-gQAACzK2Ayvr8242.png

图1 各代内存带宽规格

从上图来看,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时的访问延时差异》的测试方法类似,我们今天对方法进行下小改动,用它来测试带宽。

2、顺序IO情况核心测试方法

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

poYBAGMN0KSAadyyAABVCCQzOc0031.png

考虑到内存对齐能提高性能,所以公平起见,我们每次都是按内存位宽去取的(一个double 8个字节,正好是一个内存位宽)。带宽就是一秒内访问过的字节总数,所以我们通过如下代码进行计算。

result = total_accessed_bytes * 1000 / used_microseconds;

3、顺序IO情况带宽测试结果

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

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

poYBAGMN0L6AaBI7AAA10fOLvZw392.png

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

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

pYYBAGMN0NOAbjKSAABDuNLdnFo811.png

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

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

poYBAGMN0OiAeO6SAABChIbWD64157.png

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

4、再测随机IO情况

前面的测试情况,虽然步长也在变化,但都是有序递增。这样内存的连续两次IO之间,虽然列地址会变,但是行地址极有可能不发生变化,因此效率还是算比较高。我们这次是来彻底随机进行访问,再来看一下。

pYYBAGMN0PmAQ8EyAAA6-fOd-wk416.png

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

5、结论

所以内存的带宽并没有你想象的那么快,在随机IO工作模式的情况下,带宽只有474M而已。现在SSD固态硬盘顺序IO也差不多能达到这个数量级了。所以,我们以后不要鲁莽地说内存比硬盘要快很多。快不快,关键取决于你怎么用!



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • DDR
    DDR
    +关注

    关注

    9

    文章

    674

    浏览量

    64209
  • 带宽
    +关注

    关注

    3

    文章

    818

    浏览量

    40054
  • 时钟
    +关注

    关注

    10

    文章

    1479

    浏览量

    130295
  • 存储系统
    +关注

    关注

    2

    文章

    379

    浏览量

    40700
收藏 人收藏

    评论

    相关推荐

    如何在ModusToolbox™中检查和设置应用程序内存地址?

    如何在ModusToolbox™中检查和设置应用程序内存地址?
    发表于 03-01 10:16

    CW32L052 DMA直接内存访问

    CW32L052支持DMA(Direct Memory Access),即直接内存访问,无需CPU干预,实现高速数据传输。数据的传输可以发生在: • 外设和内存之间 :例如ADC采集数据到内存
    的头像 发表于 02-28 16:48 536次阅读
    CW32L052 DMA直接<b class='flag-5'>内存</b><b class='flag-5'>访问</b>

    ug内部错误,内存访问违例怎么解决

    ug内部错误,内存访问违例怎么解决 内部错误和内存访问违例是编程中常见的问题,它们可能会导致应用程序崩溃、数据丢失或系统不稳定。在本文中,我
    的头像 发表于 12-27 16:27 3224次阅读

    jvm内存溢出故障排查

    JVM内存溢出是常见且令人头疼的问题,特别是在运行大型Java应用程序或长时间运行的应用程序时。当JVM分配给应用程序内存不足以处理
    的头像 发表于 12-05 11:04 344次阅读

    开发java应用程序的基本步骤是

    Java应用程序。确定您希望应用程序能够执行的任务和提供的功能。这将有助于指导您在开发过程中进行决策并确定实现代码的方式。 2.设计应用程序:在开始编写代码之前,您应该设计
    的头像 发表于 11-28 16:52 640次阅读

    Flask如何升级到 Quart 应用程序

    应用程序可以提高 3 倍的性能,而且不需要对代码进行重大的重写或调整。 如上所示,在针对单个资源详情的请求下,Flask每秒请求为330个,而quart能达到1160个。以此类推,Quart 相比
    的头像 发表于 11-01 16:23 317次阅读
    Flask如何升级到 Quart <b class='flag-5'>应用程序</b>

    如何通过多任务访问Keil RTX程序EEPROM

    自动X) 内核。 一旦其他 RTOS 能够支持 CMISIS- RTOS, 我们就可以很容易地将应用程序移植到其他 RTOS 平台。 此样本代码使用 RTX 内核, 由 Keil CMSIS- MDK
    发表于 09-01 07:42

    第6代光纤通道:加速全闪存数据中心的数据访问应用程序性能

    电子发烧友网站提供《第6代光纤通道:加速全闪存数据中心的数据访问应用程序性能.pdf》资料免费下载
    发表于 08-29 11:52 0次下载
    第6代光纤通道:加速全闪存数据中心的数据<b class='flag-5'>访问</b>和<b class='flag-5'>应用程序</b>性能

    如何通过多任务访问Keil RTX程序EEPROM

    自动X) 内核。 一旦其他 RTOS 能够支持 CMISIS- RTOS, 我们就可以很容易地将应用程序移植到其他 RTOS 平台。 此样本代码使用 RTX 内核, 由 Keil CMSIS- MDK
    发表于 08-23 06:04

    Arm Ethos-U NPU应用程序开发概述

    连接到互连,这允许M0和M1AXI接口访问任何内存。Vela编译器调度高带宽、低延迟的内存事务XI接口M0上的事务以及AXI接口M1上的所有其他事务。
    发表于 08-02 06:37

    如何改进移动系统的内存管理?

    上层应用程序以object为单位进行内存分配和回收,而底层内核以page为粒度进行内存管理。这导致系统不了解应用程序内存使用情况,往往直接分
    的头像 发表于 07-31 09:13 582次阅读
    如何改进移动系统的<b class='flag-5'>内存</b>管理?

    PreEmptiveProtection:全面的移动应用程序保护

    您的组织经不起黑客攻击 保护在不受信任的环境中运行的移动应用程序变得越来越重要,因为移动和物联网应用程序使客户端更智能,并经常访问敏感或金融信息。 由于黑客越来越多地将目标对准消费者和企业移动
    的头像 发表于 07-06 10:42 334次阅读

    使用内存VIP检测和避免内存瓶颈

    处理器和内存速度之间日益扩大的差异导致内存带宽成为许多应用程序的性能瓶颈。例如,您是否在内存控制器/PHY 和子系统验证项目中寻找识别性能瓶
    的头像 发表于 05-26 10:29 878次阅读
    使用<b class='flag-5'>内存</b>VIP检测和避免<b class='flag-5'>内存</b>瓶颈

    如何使您更好地进行应用程序安全测试

    应用程序测试策略中,使用攻击树可以帮助您模拟各种攻击场景,并就如何最好地保护应用程序做出决策。您将能够查明最容易受到攻击的系统和控制,并更有效地构建特定的对策。
    的头像 发表于 05-25 14:46 377次阅读
    如何使您更好地进行<b class='flag-5'>应用程序</b>安全测试

    如何通过TZASC分配安全内存并通过OP-TEE中的可信应用程序访问它?

    了 optee,然后运行了 optee_hello_world 示例,它似乎工作正常。 我现在想为安全区域分配一些内存并使用受信任的应用程序访问它。我检查了 SRM,但我需要更清楚地了解我在 linux 驱动
    发表于 05-04 08:46