Skip to content

04 容量和带宽是关键 - 内存和 MLC

内存条为什么叫 DDR

  • DDR,是 Double Data Rate SDRAM 的缩写,中文译为双倍数据率同步动态随机存取存储器
  • 这种命名反映了它相比于早期的 SDRAM(同步动态随机存取存储器)而言,能够在同样的时钟频率下传输两倍的数据量。
  • 其 Double 的含义是,DDR 内存通过在每个时钟周期内进行两次数据传输(即上升沿和下降沿均传输数据),从而达到了双倍数据率的效果。这种技术大大提高了内存模块的数据传输效率,使得在相同时钟频率下,DDR 内存比 SDRAM 能够提供更高的带宽。

历代 DDR 的区别

  • 在计算机硬件的发展过程中,内存一直扮演着重要的角色且经历了数次迭代,从 SIMM(Single Inline Memory Modules)时代走到了 DDR 时代;
  • SIMM 是早期用于安装内存的标准化模块,主要在 1980 年代和 1990 年代流行。最早的 SIMM 模块每边有 30 个引脚,后来发展为 72 引脚的 SIMM 模块。它们通常用于安装在早期的个人电脑和工作站上,提供从几兆字节到几百兆字节的存储容量。
  • 早期 SIMM 的传输速率较低,通常在几十兆字节每秒(MB/s)的级别,这主要受到总线速度和处理器技术限制的影响。
  • DDR 每一代都在之前基础上进一步提高了数据传输速率和功耗效率。例如,DDR4 相对于 DDR3 提供了更高的频率和更低的电压要求,以及更高的带宽和更好的能效比。
  • 历代 DDR 外形差异 【防止 DDR 插入到错误的插槽中】

0c5354b4-2ea2-4a5c-ad13-ea6cf69e4e8d

时代SIMMDDRDDR2DDR3DDR4DDR5
传输速率(MT/S, MHz)几十 MB/s200 - 400400 - 800800 - 21331600 - 32004800 - 8400
带宽 (GB/s)几百 MB/s1.6 - 3.23.2 - 6.46.4 - 17.112.8 - 25.6+38.4 - 84.0

带宽测量工具 MLC

  • MLC,英文全称为 Memory Latency Checker,是 Intel 提供的用于测量内存延迟和带宽,以及它们如何随系统负载的增加而变化的工具。
  • 它还提供了多个选项进行更细粒度的调查,其中还可以测量从一组特定内核到高速缓存或内存的带宽和延迟。
  • 用以评估计算机内存子系统的延迟和带宽性能;
  • 支持 Windows 和 Linux 系统,仅提供可执行文件;
    • 在 Linux 系统上,直接执行 ./mlc 即可输出基本信息;(需要给 mlc 文件添加可执行权限)
    • 在 Windows 系统上,直接双击 mlc.exe 即可。
  • 决定应用程序性能的一个重要因素是应用程序从处理器的缓存层次结构和内存子系统获取数据所需的时间。在启用了非一致内存访问(NUMA)的多路系统中,本地内存延迟和跨插槽内存延迟将有很大差异。除了延迟,带宽(b/w,BandWidth)也在决定性能方面发挥重要作用。因此,测量这些延迟和带宽对于为受测系统和性能分析建立基准非常重要。

下载地址

  • 英特尔® Memory Latency Checker(英特尔® MLC)

  • 下载后的压缩包解压后的文件目录为

    bash
      linux_demo tar -xvf mlc_v3.11a.tgz
      linux_demo cd Linux
      Linux lsd --tree
    ├── 'Intel Memory Latency Tools Outbound License Agreement.pdf'
    ├── Linux
       ├── mlc
       └── redist.txt
    ├── readme_mlc_v3.11.pdf
    └── Windows
        ├── mlc.exe
        ├── mlcdrv.sys
        └── redist.txt
bash
  Linux sudo chmod +x ./mlc
  Linux ./mlc
Intel(R) Memory Latency Checker - v3.11a
Measuring idle latencies for random access (in ns)...
                Numa node
Numa node            0
       0          96.3

Measuring Peak Injection Memory Bandwidths for the system
Bandwidths are in MB/sec (1 MB/sec = 1,000,000 Bytes/sec)
Using all the threads from each core if Hyper-threading is enabled
Using traffic with the following read-write ratios
ALL Reads        :      42187.6
3:1 Reads-Writes :      50806.0
2:1 Reads-Writes :      51469.1
1:1 Reads-Writes :      50965.1
Stream-triad like:      53521.3

Measuring Memory Bandwidths between nodes within system
Bandwidths are in MB/sec (1 MB/sec = 1,000,000 Bytes/sec)
Using all the threads from each core if Hyper-threading is enabled
Using Read-only traffic type
                Numa node
Numa node            0
       0        41990.8

Measuring Loaded Latencies for the system
Using all the threads from each core if Hyper-threading is enabled
Using Read-only traffic type
Inject  Latency Bandwidth
Delay   (ns)    MB/sec
==========================
 00000  932.36    41762.6
 00002  1020.15   41503.1
 00008  1016.81   41663.4
 00015  858.62    41840.6
 00050  953.76    41977.4
 00100  725.80    42170.3
 00200  154.12    38223.5
 00300  114.25    26520.9
 00400  110.39    19675.6
 00500  114.89    15940.2
 00700  122.74    11673.0
 01000  105.28     8482.0
 01300  103.21     6707.8
 01700  105.01     5262.3
 02500  101.42     3815.8
 03500   99.59     2918.6
 05000   98.34     2249.1
 09000   98.08     1541.1
 20000   97.30     1057.6

Measuring cache-to-cache transfer latency (in ns)...
Unable to enable large page allocation
Using small pages for allocating buffers
Local Socket L2->L2 HIT  latency        23.4
Local Socket L2->L2 HITM latency        23.3
  • Intel(R) Memory Latency Checker - v3.11a: 这是工具的版本信息。

  • Measuring idle latencies for random access (in ns)...: 测量空闲情况下的随机访问内存延迟(单位:ns 纳秒)。

    bash
                    Numa node
    Numa node            0
          0          96.3
    • 这表明 NUMA (非一致性内存访问) 节点 0 的延迟为 96.3 纳秒。
    • 在内存系统不受负载的情况下,从内存读取数据所需的时间
    • 访问本地内存的时延远低于访问远端内存的时延
  • Measuring Peak Injection Memory Bandwidths for the system: 测量系统的峰值内存带宽(单位:MB/sec,1 MB/sec = 1,000,000 字节/秒)。

    bash
    Using traffic with the following read-write ratios
    ALL Reads        :      42187.6
    3:1 Reads-Writes :      50806.0
    2:1 Reads-Writes :      51469.1
    1:1 Reads-Writes :      50965.1
    Stream-triad like:      53521.3
    • 这些值表示在不同读写比例下的内存带宽。
    • 其中 "ALL Reads" 表示全读的情况,其余为不同读写比的情况。数值单位为 MB/sec
    • 峰值注入内存带宽-在内存系统受到极大负载时,系统能够处理的内存读速度
  • Measuring Memory Bandwidths between nodes within system: 测量系统内不同 NUMA 节点之间的内存带宽(单位:MB/sec)。

    bash
                    Numa node
    Numa node            0
          0        41990.8

    这表示从 NUMA 节点 0 访问自身的带宽为 41990.8 MB/sec。

  • Measuring Loaded Latencies for the system: 测量系统在负载下的内存延迟(单位:ns 纳秒)和带宽(单位:MB/sec)。

    bash
    Inject  Latency Bandwidth
    Delay   (ns)    MB/sec
    ==========================
    00000  932.36    41762.6
    00002  1020.15   41503.1
    ...
    20000   97.30     1057.6
    • 这部分输出展示了在不同延迟注入情况下的内存带宽变化。延迟以纳秒 ns 为单位,带宽以 MB/sec 为单位。
    • 延时注入内存带宽-在读写内存数据前设置延时情况下的带宽数据
  • Measuring cache-to-cache transfer latency (in ns)...: 测量缓存到缓存之间的数据传输延迟(单位:纳秒)。

    bash
    Unable to enable large page allocation
    Using small pages for allocating buffers
    Local Socket L2->L2 HIT  latency        23.4
    Local Socket L2->L2 HITM latency        23.3

    表示本地插槽的 L2 缓存之间命中(HIT)和命中修改(HITM)的延迟分别为 23.4 纳秒和 23.3 纳秒。

综上所述,这个输出结果详细展示了系统内存延迟、带宽以及缓存传输性能的测量数据,有助于分析和优化系统性能。