1.内存延迟与带宽分析
2.快来测测你的码分系统可以打几分!
内存延迟与带宽分析
在现代计算机环境中,码分内存访问效率往往成为性能瓶颈。码分处理器访问内存的码分速度,即延迟,码分以及每秒可以传输的码分形态图形源码数据量,即带宽,码分是码分影响应用程序性能的关键因素。这两个因素在各种场景中都至关重要。码分本节将专注于评估内存子系统组件的码分峰值性能。
在x平台上,码分英特尔内存延迟检查器(MLC)是码分一个非常有用的工具,可以在Windows和Linux上免费使用。码分MLC可以通过不同的码分访问模式和负载来测量缓存和内存的延迟和带宽。在基于ARM的码分系统上,虽然没有类似的工具,但用户可以从源代码中下载并构建内存延迟和带宽基准测试,例如lmbench 2、bandwidth 4和Stream等。
本节将讨论空闲读取延迟和读取带宽这两个子集指标。空闲读取延迟是指系统处于空闲状态时,从内存系统组件获取数据所需的junit测试源码最小时间。当系统被其他内存消耗大的应用程序加载时,此延迟会增加。MLC通过进行相关加载(也称为指针追踪)来测量空闲延迟。一个测量线程分配一个非常大的缓冲区,并对其进行初始化,以便缓冲区内的每个(字节)缓存行包含指向该缓冲区内另一个非相邻缓存行的指针。通过适当调整缓冲区的大小,我们可以确保几乎所有的加载都命中某个级别的缓存或主存。
以下是一个测试系统的示例,包括英特尔Alderlake主机、Core i7-P CPU和GB DDR4 @ MT/s双通道内存。该处理器有4个性能P(实际上是两个物理核*2个超线程)超线程核心和8个E(高效)核心。每个P核心有KB的L1数据缓存和1.MB的L2缓存。每个E核心有KB的L1数据缓存,而四个E核心组成一个集群,可以访问共享的2MB L2缓存。系统中的所有核心都由MB的L3缓存支持。以下是示例mlc命令:
选项--idle_latency用于测量读取延迟。MLC具有--loaded_latency选项,用于在由其他线程生成的内存流量存在时测量延迟。选项-c0将测量线程固定在逻辑CPU 0上,ioc unity 源码该CPU位于P核心上。选项-L启用大页以限制我们的测量中的TLB效应。选项-bm告诉MLC使用MB缓冲区,在我们的系统上可以放在L3缓存中。
以下图表显示了L1、L2和L3缓存的读取延迟。左侧的第一个区域对应于L1d缓存,该缓存是每个物理核心私有的。我们可以观察到E核心的延迟为0.9ns,而P核稍高为1.1ns。此外,我们可以使用此图来确认缓存大小。请注意,当缓冲区大小超过KB时,E核心的延迟开始上升,但是在KB之前P核心的延迟保持不变。这证实了E核心的L1d缓存大小为KB,而P核心的L1d缓存大小为KB。
第二个区域显示L2缓存延迟,E核的延迟几乎是P核的两倍(5.9ns vs. 3.2ns)。对于P核,做程序源码延迟在我们超过1.MB缓冲区大小后会增加,这是预期的。但我们期望E核的延迟保持不变,直到2MB,但在我们的测量中没有发生这种情况。
第三个区域从2MB到MB对应于L3缓存延迟,对于两种类型的内核都大约为ns。系统中所有内核共享的L3缓存的总大小为MB。有趣的是,我们从MB开始看到一些意想不到的动态变化,而不是MB。这很可能是因为一些访问错过了L3,需要去主内存。
第四个区域对应于内存延迟,图表上只显示了其开始部分。当我们越过MB的边界时,延迟会急剧上升,并在E核心的MB和P核心的MB处开始趋于稳定。使用更大的缓冲区大小为MB时,E核心的访问延迟为ns,P核心为ns。橙子影视源码这测量了内存延迟,因为几乎没有加载会命中L3缓存。
使用类似的技术,我们可以测量内存层次结构的各个组件的带宽。为了测量带宽,MLC执行的加载请求不会被任何后续指令使用。这允许MLC生成可能的最大带宽。MLC在每个配置的逻辑处理器上生成一个软件线程。每个线程访问的地址是独立的,线程之间没有数据共享。与延迟实验一样,线程使用的缓冲区大小确定了MLC是在测量L1/L2/L3缓存带宽还是内存带宽。
这里的新选项是-k,它指定了用于测量的CPU编号列表。-Y选项告诉MLC使用AVX2加载,即每次加载字节。MLC使用不同的读写比例来测量带宽,但在下图中,我们只显示了全部读取带宽,因为它可以让我们对内存带宽的峰值有一个直观的了解。但其他比例也可能很重要。我们在使用Intel MLC测量的系统的组合延迟和带宽数字如图下所示。
核心可以从较低级别的缓存(如L1和L2)中获得比从共享的L3缓存或主内存中更高的带宽。共享缓存(如L3和E核心L2)相当好地扩展,可以同时为多个核心提供请求。例如,单个E核心L2的带宽为GB/s。使用来自同一集群的两个E核心,我测量了GB/s,三个E核心为GB/s,而所有四个E核心可以从共享L2中获得GB/s。对于L3缓存也是如此,单个P核心的带宽为GB/s,而单个E核心只有GB/s。但是当所有核心都被使用时,L3缓存可以维持GB/s的带宽。
我们用纳秒测量延迟,用GB/s测量带宽,因此它们还取决于核心运行的频率。在各种情况下,观察到的数字可能不同。例如,假设仅在系统上以最大睿频运行时,P核心的L1延迟为X,L1带宽为Y。当系统负载满时,我们可能观察到这些指标分别变为1.X和0.Y。为了减轻频率效应,与其使用纳秒,延迟和度量可以使用核心周期来表示,并归一化为一些样本频率,比如3Ghz。
了解计算机的主要特征是评估程序如何利用可用资源的基本方法。通过屋顶线性能模型了解系统的瓶颈在哪里,是CPU运算的瓶颈还是内存读取的瓶颈。如果经常在单个平台上分析性能,最好记住内存层次结构的各个组件的延迟和带宽,这有助于建立对测试系统的心理模型,将有助于进一步的性能分析。
快来测测你的系统可以打几分!
lmbench是一款用于评估系统综合性能的开源工具,适用于多种操作系统,包括Unix和Linux。它提供了测试框架,用户可以根据需要修改代码来实现特定的测试目的。lmbench主要针对文件读写、进程创建销毁开销、网络建立、内存操作等方面进行测试,衡量系统的反应时间和带宽。在优麒麟系统中使用lmbench进行性能测试的步骤包括下载、安装和配置。
首先,用户需从sourceforge.net/project...下载lmbench的tar安装包。本文以下内容将以x架构的lmbench 3.0-a9版本为例进行演示。然后将下载的安装包解压至/Linux系统中常用安装大型软件的安装目录下,本文选择将其解压至'/opt'目录下。
接着,用户需要确保系统的内存超过G,以防止在测试过程中程序因计算溢出而无法正常退出。为了实现这一目的,用户需要修改lmbench源代码中对应程序,具体来说,是在'/opt/lmbench-3.0-a9/src/'目录下的'lib_mem.c'文件中的'line_initialize'函数,将int型变量更改为long型变量,以扩大变量的取值范围。
在系统内存满足要求后,使用'make results'命令进行编译测试,该命令会根据配置参数(如MULTIPLE COPIES、JOB placement selection、MB等)生成相应的配置脚本,以供后续大量测试使用。在进行测试之前,用户需要设置SUBSET参数,该参数用于决定lmbench测试的测试项,但不会影响测试结果的大小。SUBSET共有4个可选参数,分别为ALL、HARWARE、OS和DEVELOPMENT。
测试完成后,使用'make see'命令生成lmbench测试结果报告,即'/results/summary.out'文件。通过分析这些结果,用户可以了解系统的各个部分性能,例如处理器性能、数学运算、上下文切换、本地通讯延时、文件与内存延迟、本地通讯带宽和内存操作延迟。在lmbench测试中,评估标准根据测试部分的不同而变化。其中,本地通讯带宽的测试结果值越大表示性能越好。其他部分的测试结果则相反,值越小代表性能越好。
在完成优麒麟系统上使用lmbench进行性能测试后,用户可以通过访问优麒麟论坛,留言咨询任何问题或寻求帮助。