内存和 IO 带宽有啥区别,我们如何衡量每一个?

Posted

技术标签:

【中文标题】内存和 IO 带宽有啥区别,我们如何衡量每一个?【英文标题】:What is the difference between Memory and IO bandwidth and how do we measure each one?内存和 IO 带宽有什么区别,我们如何衡量每一个? 【发布时间】:2019-12-03 21:01:24 【问题描述】:

内存和io带宽有什么区别,如何衡量?

我有这么多假设,请原谅这两个部分问题的冗长。

这些问题的灵感来自:What is the meaning of IB read, IB write, OB read and OB write. They came as output of Intel® PCM while monitoring PCIe bandwidth,Hadi 解释道:

DATA_REQ_OF_CPU 不用于测量内存带宽,而是用于测量 i/o 带宽。

我想知道 mem/io 带宽之间的差异是否类似于 DMA(直接内存寻址)和 MMIO(内存映射 io)之间的差异,或者两者的带宽是否都是 io 带宽?

我正在尝试使用这张图片来帮助可视化:

(希望我有这个权利)在 x86 中有两个地址空间:内存和 IO。 IO带宽是cpu(或dma控制器)到io设备之间的度量,然后内存带宽将在cpu和主内存之间吗?这两个场景中的所有数据都通过内存总线运行?为了清楚起见,我们都同意内存总线的定义是地址和数据总线的组合?如果是这样,图片的那部分可能会有点误导......

如果我们可以利用 pcm-iio 程序通过英特尔® 性能计数器监视器 (PCM) 测量 IO 带宽,我们将如何测量内存带宽?现在我想知道如果通过相同的电线运行它们为什么会有所不同?除非我只是把这一切都错了。很多这个测试代码的github页面有点压倒性:https://github.com/opcm/pcm

谢谢

【问题讨论】:

是的,内存带宽通常是 DRAM 本身或 CPU内存连接的理论最大值。 I/O 带宽通常是指特定的 I/O 设备,但您当然可以谈论将 CPU 连接到外部世界的所有 PCIe 链路上可能的聚合 I/O 带宽,例如来自多个视频卡、100G NIC 和/或 SSD。在现代 x86 上,内存控制器内置在 CPU 中,因此从 I/O 到 DRAM 的侧通道不会绕过 CPU。不过,DMA 会绕过任何特定的 CPU 内核。 图片若无误,则具有误导性。链接是:L3 -> Ring bus/Mesh -> (Home Agent ->) iMC for CPU => DRAM, PCI device -> PCIe bus -> System Agent -> Ring bus/Mesh -> (Home Agent ->) DRAM for DMA and L3 (假设Cache Agent是uncore外的统一路径,当然遍历这条路径时IO不会被缓存) -> Ring bus / Mesh -> System Agent -> PCIe bus -> PCI device for IO (内存和端口映射)。在 NUMA 架构中,必须扩展“环形总线/网格”段以包括套接字之间的最终 QPI/UPI 链接。 "在 x86 中有两个地址空间:内存和 IO"。是的,但不是通常描述的方式。有一个传统的“IO 地址空间”,由 64Ki 可单独寻址的 8 位“IO 端口”组成,并通过特殊 IO 指令 [IN,INS,OUT,OUTS] 独占访问。另一个地址空间是“物理地址空间”,它被细分以允许访问“常规”内存和不同地址范围内的“内存映射IO”。 (为了更容易混淆,在某些工程学科中,离开芯片的每个信号都被视为“IO”,包括 DRAM 访问。) 【参考方案1】:

DATA_REQ_OF_CPU 事件不能用于测量内存带宽,原因如下:

并非所有来自 IIO 控制器的入站内存请求都由内存控制器提供服务,因为请求也可以由 LLC(或在多个套接字的情况下为 LLC)提供服务。但请注意,在不支持 DDIO 的 Intel 处理器上,IO 内存读取请求可能会导致推测性读取请求与 LLC 查找并行发送到内存。 DATA_REQ_OF_CPU 事件有许多子事件。 pcm-iio 工具测量的入站内存指标不包括所有类型的内存请求。具体来说,它们不包括原子内存读写和 IOMMU 内存请求,这可能会消耗内存带宽。 一些子事件计算非内存请求。例如,存在点对点请求(从一个 IIO 到另一个)。 IO 设备可能想要访问与其连接的节点不同的 NUMA 节点上的内存。在这种情况下,它将消耗不同 NUMA 节点上的内存带宽。

现在我意识到你引用的陈述有点模棱两可;我不记得我是专门讨论 pcm-iio 测量的指标还是一般事件,或者“内存带宽”是指总内存带宽还是仅指连接到 IIO 的 IO 设备消耗的部分。尽管出于上述原因,以任何这些方式解释的陈述都是正确的。

pcm-iio 工具仅测量 IO 带宽。请改用 pcm-memory 工具来测量内存带宽,该工具利用 IMC 的性能事件。在我看来,没有一个 PCM 工具可以测量 IO 设备消耗的内存带宽,这需要使用 CBox 事件。

关于非核心性能事件的主要信息来源是英特尔非核心手册。您会在这些手册的介绍章节中找到漂亮的图,这些图显示了处理器的不同单元是如何相互连接的。

【讨论】:

以上是关于内存和 IO 带宽有啥区别,我们如何衡量每一个?的主要内容,如果未能解决你的问题,请参考以下文章

DMA 和内存映射 IO 有啥区别?

实际使用中,win7和vista有啥区别?

STREAM 内存带宽基准测试真正衡量的是啥?

PCIe 固态硬盘与SSD有啥区别

电脑内存的单面与双面,单Bank与双Bank有啥区别?

CDN带宽和IDC带宽有啥区别,为啥价格差距这