一次内存测试体验

2019/12/16 Linux memory

一次内存测试体验

主要测试项目:

  • 内存带宽测试
  • 内存基准测试

内存基础知识

内存带宽计算公式

  • 内存带宽计算公式:带宽=内存物理频率×倍增系数×(内存总线位数/8)
  • 通用的计算公式:带宽=频率\*位宽/8

内存的物理频率

随着技术的发展,内存的物理频率以及带宽都在增加。

  • 内存的物理频率:内存颗粒运行的物理频率,从早期的 100MHz 到现在的 260MHz。
  • 内存的时钟周期:与内存物理频率互为倒数,所以从早期的 10ns(1/100MHz)到现在的 4n(1/266) 以内。

而内存名称上的数字则是标称频率,其实并不是物理频率。如 DDR 400、DDR2 800、DDR3 1600 和 DDR4 3200 的物理运行频率都是 200MHz,物理频率必须乘上倍增系数才能获得相应的标称频率。

标称频率是以老旧的SDRAM内存为基准,换算得出利于商业运作和产品标识的频率。

内存物理频率与标称频率的列表:

  • 100MHz - DDR200,DDR2 400,DDR3 800,DDR4 1600
  • 133MHz - DDR266,DDR2 533,DDR3 1067,DDR4 2133
  • 166MHz - DDR333,DDR2 667,DDR3 1333,DDR4 2666
  • 200MHz - DDR400,DDR2 800,DDR3 1600,DDR4 3200
  • 233MHz - DDR3 1887,DDR4 3733,
  • 266MHz - DDR2 1066,DDR3 2133,DDR4 4266

内存的倍增系数

内存从SDRAM发展至今DDR4,其改变如下:

  1. DDR 采用时钟脉冲上升、下降沿各传一次数据,1 个时钟信号可以传输 2 倍于 SDRAM 的数据,所以又称为双倍速率 SDRAM。一次预读 2bit 数据。它的倍增系数就是 2。
  2. DDR2 仍然采用时钟脉冲上升、下降支各传一次数据的技术(不是传 2次),但是一次预读 4bit 数据,是 DDR 一次预读 2bit 的 2 倍,因此,它的倍增系数是 2X2=4。
  3. DDR3 作为 DDR2 的升级版,最重要的改变是一次预读 8bit,是 DDR2 的 2 倍,所以,它的倍增系数是 2X2X2=8。
  4. DDR4,较为复杂。DDR4 如果要继续在物理频率不增加的情况下达到高传输性能,只有两种方法。
    • 其一就是增加预取位到 16bit
    • 其二就是采用多总线技术。GDDR5 显存就使用了双总线技术来达到极高的内存带宽和标称频率。比如 GDDR5 5000 显存,由于采用双总线技术,我们可以将其看作两颗 “GDDR5 2500” 并行运行,每颗 “GDDR5 2500” 预取位数为 8bit,两颗组成的“双通道”,预取位数可以看作16bit。
    • 实际上用到了第三种方法,可见DDR4 SDRAM

内存的总线位数

从 SDRAM-DDR 时代,数据总线位宽时钟没有改变,都为 64bit,但是采用双通道技术,可以获得 64X2=128bit 的位宽。如果采用四通道技术,可以达到 256bit 位宽。

例子

  • DDR4 3200(内存颗粒的物理频率 200 MHz,预读 8bit,通过 Bank Grouping 等效为 16n)组成双通道 (2*64 bit) 内存,带宽将达到200MHz*16bit*128bit/8 = 50GB/s 左右
  • DDR4 4266(内存颗粒的物理频率 266 MHz,预读 8bit,通过 Bank Grouping 等效为 16n)组成四通道 (4*64 bit)内存,带宽将达到 266*16*256/8 = 136GB/s 左右
  • 更多参考:DDR、DDR2、DDR3及DDR4的传输带宽(Transfer rate)各为多少?

内存测试过程

测试工具

测试过程及结果

Memtester

$ memtester 5G 2
Loop 1/2:
  Stuck Address       : ok
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok
  Block Sequential    : ok
  Checkerboard        : ok
  Bit Spread          : ok
  Bit Flip            : ok
  Walking Ones        : ok
  Walking Zeroes      : ok
  8-bit Writes        : ok
  16-bit Writes       : ok

Loop 2/2:
  Stuck Address       : ok
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok
  Block Sequential    : ok
  Checkerboard        : ok
  Bit Spread          : ok
  Bit Flip            : ok
  Walking Ones        : ok
  Walking Zeroes      : ok
  8-bit Writes        : ok
  16-bit Writes       : ok

Done.

sysbench

$ sysbench --test=memory --memory-block-size=16M --memory-total-size=10G run
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.11 (using system LuaJIT 2.1.0-beta3)

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Running memory speed test with the following options:
  block size: 16384KiB
  total size: 10240MiB
  operation: write
  scope: global

Initializing worker threads...

Threads started!

Total operations: 640 ( 1082.32 per second)

10240.00 MiB transferred (17317.04 MiB/sec)


General statistics:
    total time:                          0.5894s
    total number of events:              640

Latency (ms):
         min:                                  0.91
         avg:                                  0.92
         max:                                  2.67
         95th percentile:                      0.90
         sum:                                588.78

Threads fairness:
    events (avg/stddev):           640.0000/0.00
    execution time (avg/stddev):   0.5888/0.00

mbw

$ mbw -q -n 10 -b 16777216 2048
0	Method: MEMCPY	Elapsed: 0.39734	MiB: 2048.00000	Copy: 5154.289 MiB/s
1	Method: MEMCPY	Elapsed: 0.39286	MiB: 2048.00000	Copy: 5213.066 MiB/s
2	Method: MEMCPY	Elapsed: 0.40080	MiB: 2048.00000	Copy: 5109.806 MiB/s
3	Method: MEMCPY	Elapsed: 0.39472	MiB: 2048.00000	Copy: 5188.501 MiB/s
4	Method: MEMCPY	Elapsed: 0.39936	MiB: 2048.00000	Copy: 5128.256 MiB/s
5	Method: MEMCPY	Elapsed: 0.39948	MiB: 2048.00000	Copy: 5126.613 MiB/s
6	Method: MEMCPY	Elapsed: 0.39532	MiB: 2048.00000	Copy: 5180.652 MiB/s
7	Method: MEMCPY	Elapsed: 0.39525	MiB: 2048.00000	Copy: 5181.583 MiB/s
8	Method: MEMCPY	Elapsed: 0.39883	MiB: 2048.00000	Copy: 5134.994 MiB/s
9	Method: MEMCPY	Elapsed: 0.39536	MiB: 2048.00000	Copy: 5180.155 MiB/s
AVG	Method: MEMCPY	Elapsed: 0.39693	MiB: 2048.00000	Copy: 5159.593 MiB/s
0	Method: DUMB	Elapsed: 0.26697	MiB: 2048.00000	Copy: 7671.331 MiB/s
1	Method: DUMB	Elapsed: 0.27026	MiB: 2048.00000	Copy: 7577.776 MiB/s
2	Method: DUMB	Elapsed: 0.26601	MiB: 2048.00000	Copy: 7698.930 MiB/s
3	Method: DUMB	Elapsed: 0.26603	MiB: 2048.00000	Copy: 7698.322 MiB/s
4	Method: DUMB	Elapsed: 0.26601	MiB: 2048.00000	Copy: 7699.046 MiB/s
5	Method: DUMB	Elapsed: 0.26599	MiB: 2048.00000	Copy: 7699.451 MiB/s
6	Method: DUMB	Elapsed: 0.26602	MiB: 2048.00000	Copy: 7698.727 MiB/s
7	Method: DUMB	Elapsed: 0.26590	MiB: 2048.00000	Copy: 7702.231 MiB/s
8	Method: DUMB	Elapsed: 0.26981	MiB: 2048.00000	Copy: 7590.667 MiB/s
9	Method: DUMB	Elapsed: 0.26588	MiB: 2048.00000	Copy: 7702.607 MiB/s
AVG	Method: DUMB	Elapsed: 0.26689	MiB: 2048.00000	Copy: 7673.634 MiB/s
0	Method: MCBLOCK	Elapsed: 0.38916	MiB: 2048.00000	Copy: 5262.549 MiB/s
1	Method: MCBLOCK	Elapsed: 0.38806	MiB: 2048.00000	Copy: 5277.507 MiB/s
2	Method: MCBLOCK	Elapsed: 0.38757	MiB: 2048.00000	Copy: 5284.234 MiB/s
3	Method: MCBLOCK	Elapsed: 0.39324	MiB: 2048.00000	Copy: 5208.082 MiB/s
4	Method: MCBLOCK	Elapsed: 0.38799	MiB: 2048.00000	Copy: 5278.432 MiB/s
5	Method: MCBLOCK	Elapsed: 0.38752	MiB: 2048.00000	Copy: 5284.848 MiB/s
6	Method: MCBLOCK	Elapsed: 0.38743	MiB: 2048.00000	Copy: 5286.062 MiB/s
7	Method: MCBLOCK	Elapsed: 0.38808	MiB: 2048.00000	Copy: 5277.262 MiB/s
8	Method: MCBLOCK	Elapsed: 0.38782	MiB: 2048.00000	Copy: 5280.800 MiB/s
9	Method: MCBLOCK	Elapsed: 0.38754	MiB: 2048.00000	Copy: 5284.602 MiB/s
AVG	Method: MCBLOCK	Elapsed: 0.38844	MiB: 2048.00000	Copy: 5272.342 MiB/s

参考资料

Search

    Table of Contents