为何sysbench内存读基准测试带宽远超理论上限?
内存基准测试结果与理论带宽不符的疑问
我在对比内存基准测试结果与系统内存理论上限时得到了困惑的结果:写基准测试符合带宽理论上限,但读基准测试速度约为上限的两倍,这符合实际情况吗?
有资料提到写入内存需要充放电存储单元,而读取是被动操作,因此读取更快,但这并未在带宽理论上限计算中提及,我原以为内存传输仅受CPU-内存总线限制。
系统配置与理论带宽计算
我的AMD主机配置:1个CPU插槽、4根DDR4内存条、2个内存通道,根据sudo lshw -C memory显示运行在2133MHz,位宽8字节(64位)。参考相关文档,理论带宽计算如下:
8 (bytes/Transactions) * 2 (memory channels) * 2.133GT/s (transactions of the RAM module) = 34.128 GB/s
我不确定是否需要将sudo lshw -C memory显示的2133MHz乘以2以考虑双倍数据率,该内存为美商海盗船CMK32GX4M1D3000C16,官网标注为“SPD Speed”,其他来源称其“数据传输速率:2133 MHz”,因此我假设这是数据传输速率,无需乘以2。
测试结果
- 自定义
memcpy程序:在约512MB的静态volatile输入输出数组间循环调用memcpy,每次拷贝8字节数据,结果接近34GB/s,该程序直接读写内存而非CPU缓存,符合预期。 sysbench测试:- 读测试命令:
结果显示约60GB/s;sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=read run - 写测试使用
--memory-oper=write时约为27GB/s,该速度在块大小降至256KB时保持不变,更小块大小下速度意外变慢。
- 读测试命令:
我的理解与疑问
我的理解是:
sysbench memory基准测试在小块大小下不可靠,--memory-oper=write的27GB/s限制源于sysbench本身,若能正确运行小块测试,写性能应能达到34GB/s,与自定义memcpy程序一致。- 内存读取确实因某些原因更快,
sysbench内存读基准测试结果准确反映了内存到CPU的数据传输速度,而我的自定义memcpy程序因涉及内存写入,受限于内存写入上限。
我的理解正确吗?这是否意味着常规的最大内存带宽计算实际是最大写入带宽,而单独读取速度可达其两倍?我此前认为内存带宽仅受内存总线限制,不受内存芯片操作限制,对此结果感到意外。
另外,若定义volatile uint8_t static_byte并将memcpy替换为static_byte = *data_in_ptr;,程序运行速度约为22GB/s,远低于sysbench读测试的34GB/s以上,是否因为需要写入同一个volatile字节,导致内存访问命令无法并行发送到总线?
内容的提问来源于stack exchange,提问作者xealits
相关产品推荐
相关产品推荐

