Linux 频率锁定Cortex A15设备上内存带宽(但不是CPU性能)的奇怪小变化

Linux 频率锁定Cortex A15设备上内存带宽(但不是CPU性能)的奇怪小变化,linux,performance,memory,benchmarking,Linux,Performance,Memory,Benchmarking,我需要一个具有稳定性能特征的ARM平台,用于精确的基准测试。目前我正在使用Exynos 5422 Cortex A15/A7设备 通过禁用Linux内核中的各种频率缩放功能,使用单独的CPU内核执行任务,并将IRQ和内核工作队列移出该内核,我的短期(10秒范围内)性能变化不到0.1% 不幸的是,在几分钟的随机间隔内,内存带宽似乎减少了约2%,就好像它有两种状态并在这两种状态之间切换一样。我能够得到小于0.1%的短期变化,所以这不是由测量误差引起的。由于记忆频率的降低很小,所以不太可能是由记忆频率

我需要一个具有稳定性能特征的ARM平台,用于精确的基准测试。目前我正在使用Exynos 5422 Cortex A15/A7设备

通过禁用Linux内核中的各种频率缩放功能,使用单独的CPU内核执行任务,并将IRQ和内核工作队列移出该内核,我的短期(10秒范围内)性能变化不到0.1%

不幸的是,在几分钟的随机间隔内,内存带宽似乎减少了约2%,就好像它有两种状态并在这两种状态之间切换一样。我能够得到小于0.1%的短期变化,所以这不是由测量误差引起的。由于记忆频率的降低很小,所以不太可能是由记忆频率的变化或类似的事情引起的。高精度测量表明,带宽减少非常均匀,并且不是由某些活动峰值频率增加引起的。例如,我可以看到其他内核上的各种中断引起的带宽变化,原因是其他的。温度变化对此也没有影响


有人知道是什么导致这种随机的长期内存带宽减少吗?

内存行为极其复杂(*)。一种方法是实际执行多次运行,获取他们的metrix并应用您的统计知识来优化结果。您可能会尽可能地保持稳定,并再次检查,问题是下一次运行时,您很可能会因为未知的原因得到不同的结果,如果不检查,甚至看不到它

它们是专门的基准测试工具,可以做到这一点,并自动计算相关统计数据,帮助您确定基准测试的准确性。Java中的一个例子是JMH。当然,在您的环境中,这将是不同的,除非您可以通过网络触发您的计算

找到带宽问题的原因是值得的,我希望你能找到它。但对我来说,能够忍受这样的问题并从中获得最大的好处

(*)内存中需要的内容可以在一级、二级或三级缓存中。或者,您可能需要从内存中提取它。根据内存设计和之前请求的内容,对该数据的访问可能会再次发生很大变化


硬件本身将内存用于显示器和各种其他设备。内存本身只能在很短的时间内保持信息的活动状态,因此内存控制器将刷新内存内容,从而影响其带宽和反应能力。(这也解释了断电时内容丢失的原因:未及时刷新)。系统本身可能会决定跨程序重新分配内存、对其进行碎片整理、用于某些后台任务……

DMA是否会与内存带宽竞争?要清楚一点,你是说你已经排除了从代码运行的核心窃取CPU周期的可能性,所以这只是内存带宽?(例如,将microbenchmark更改为仅使用ALU指令,除代码提取外无内存访问)。您是否有性能计数器,可以判断您是否正在获得TLB未命中(例如,由于某种原因无效),或者缓存未命中是否增加(这可能表明预回迁有问题)?是的,我排除了CPU本身中的所有错误。TLB未命中是相同的。当基准测试速度较慢时,二级未命中/总请求的比率会更高——如果可用带宽减少,预取完成的页面数减少,直到缓存未命中,这就是预期的情况。OP正在编写一个专门的内存基准测试工具,可能比Java等托管语言更精确。不过,DRAM刷新是一个很好的建议。我同意,由于所有中间层的原因,java在一致性方面并不是最好的。但这只会加剧现有问题。我确实发现了JMH交互测试的统计方法,因为您在运行基准测试时实际测量了重复性,然后可以发布带有置信因子的分数。如果你只做一次测量,或者不使用这些信息,你永远不会知道是否有波动。它可能最终在OP机器上工作,在下一台机器上失败,没有人会知道。我不建议使用JVM或java作为基准测试,我只是建议对基准测试的结果进行统计分析。。。