一次内存测试体验
主要测试项目:
- 内存带宽测试
- 内存基准测试
内存基础知识
内存带宽计算公式
- 内存带宽计算公式:
带宽=内存物理频率×倍增系数×(内存总线位数/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,其改变如下:
- DDR 采用时钟脉冲上升、下降沿各传一次数据,1 个时钟信号可以传输 2 倍于 SDRAM 的数据,所以又称为双倍速率 SDRAM。一次预读 2bit 数据。它的倍增系数就是 2。
- DDR2 仍然采用时钟脉冲上升、下降支各传一次数据的技术(不是传 2次),但是一次预读 4bit 数据,是 DDR 一次预读 2bit 的 2 倍,因此,它的倍增系数是 2X2=4。
- DDR3 作为 DDR2 的升级版,最重要的改变是一次预读 8bit,是 DDR2 的 2 倍,所以,它的倍增系数是 2X2X2=8。
- 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