Linux 使用系统调用的缓存污染

Linux 使用系统调用的缓存污染,linux,memory-management,operating-system,linux-kernel,Linux,Memory Management,Operating System,Linux Kernel,朋友们,我想研究由操作系统引起的缓存污染对应用程序性能的影响 为此,我编写了一个小型定制基准测试程序 1. malloc an array of size = l1 data cache-size 2. repeat ... sweep this array from start to end (hit-rate = 1.0) 3. *** perform a system call that thrashes l1 data cache *** 4. sweep the array once

朋友们,我想研究由操作系统引起的缓存污染对应用程序性能的影响
为此,我编写了一个小型定制基准测试程序

1. malloc an array of size = l1 data cache-size
2. repeat ... sweep this array from start to end (hit-rate = 1.0)
3. *** perform a system call that thrashes l1 data cache ***
4. sweep the array once again (expected hit-rate = ~0.7 ---> 1.0) 
算法的第2步重复读取整个数组。希望阵列留在缓存中,因此命中率为1

执行系统调用后,我再次尝试读取缓存。但是我假设操作系统已经收回了一些属于用户的缓存线

如您所见,程序依赖系统调用从一级数据缓存中逐出许多用户数据线。我怎样才能做到这一点


我假设系统调用应该与文件相关或与流相关。

对一级缓存的影响因系统调用而异。一种方法是循环几个不同的系统调用,并测量每个调用的影响(例如,包括与I/O相关的调用,如
write()
,其中可以改变缓冲区的大小,从而改变对缓存的可能影响)

您可能希望避免将系统调用实现为vsyscalls(例如,
gettimeofday()
),因为它们不需要切换到内核空间。见[,]

听起来您希望隔离L1d上的效果,因此您可能需要注意另一件事:在步骤2中,在循环通过阵列后,L1i缓存将被填充。系统调用完成后,很可能L1d和L1i都已被污染,因此您可能还会看到i-cache未命中对性能的影响


为了获得更好的细粒度度量,您可能能够利用硬件性能计数器,具体取决于您的体系结构

我在读轩尼诗和帕特森的《线程级并行操作系统和多道程序设计工作负载》。显示一级缓存高活动的示例是一些基准代码的编译。可能,您可以编译一些代码,并在步骤3中生成编译,以修改一级缓存。但是是的,L1i也将被修改。

完美。。。我使用打开、写入和关闭系统调用。我试图在每次迭代后将32k数组写入一个文件。但它的效果令人惊讶。。。一级数据缓存的效果不如一级指令缓存。有什么想法吗??我将重新发布描述每次调用的指令数、每次调用的负载等的确切统计信息。无论如何,感谢您考虑这篇文章。我的直接猜测是,实际上并没有触及很多内核数据(因为只是从用户缓冲区写入),因此d缓存的影响很小。我会尝试寻找一个操纵大量内核数据结构的系统调用——可能类似于
fork()
(尽管要注意写时复制的效果),fwrite通常应该从用户缓冲区写入内核缓冲区,然后在内核缓冲区为空时将其写入磁盘。我的理解正确吗??内核是否曾经直接从用户缓冲区到磁盘进行DMA。我想不是。