io - 内存和 IO 带宽之间有什么区别,我们如何测量它们?

标签 io x86 performance-testing bandwidth bus

内存和 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 带宽?

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

enter image description here

(希望我没看错)在 x86 中有两个地址空间:内存和 IO。 IO 带宽是 cpu(或 dma Controller )到 io 设备之间的度量,然后内存带宽是 cpu 和主内存之间的度量吗?这两种场景下所有数据都跑内存总线?为了清楚起见,我们都同意内存总线的定义是地址和数据总线的结合?如果是这样的话,图像的那部分可能有点误导......

如果我们可以使用 pcm-iio 程序使用英特尔® 性能计数器监视器 (PCM) 测量 IO 带宽,那么我们将如何测量内存带宽?现在我想知道如果通过相同的电线运行它们为什么会不同?除非我完全错了。许多此测试代码的 github 页面有点让人不知所措:https://github.com/opcm/pcm

谢谢

最佳答案

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

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

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

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

有关 uncore 性能事件的主要信息来源是 Intel uncore 手册。您会在这些手册的介绍章节中找到很好的图,这些图展示了处理器的不同单元如何相互连接。

关于io - 内存和 IO 带宽之间有什么区别,我们如何测量它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57204407/

相关文章:

c# - UWP 写入 CSV 文件

linux - 将 stderr 和 stdout 写入一个文件,但也将 stderr 写入另一个文件

php - 文件大小(): giving incorrect result

debugging - QEMU gdb 不显示固件说明

linux - 创建/写入文件 x86 Linux

c++ - 为什么 128 位变量应该与 16 字节边界对齐

用不同语言编写的API框架的性能基准

Haskell IO(字符串)和字符串

c++ - Linux 中非常高的经过​​(挂钟)时间和低系统时间的含义

performance - 如何做Hadoop集群的负载和性能测试?