使用系统调用缓存污染

时间:2012-04-20 13:19:30

标签: 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 again (expected hit-rate = ~0.7 ---> 1.0) 

算法的第2步重复读取完整的数组。希望数组保留在缓存中,因此命中率为1.

执行系统调用后,我再次尝试读取缓存。但我认为操作系统已经驱逐了属于用户的一些缓存行。

如您所见,程序依赖系统调用从l1数据缓存中驱逐许多用户数据行。我怎么能实现这个?

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

2 个答案:

答案 0 :(得分:1)

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

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

听起来你想要隔离L1d上的效果,所以你可能要注意另一件事:在你的第2步中,在你的数组循环之后,L1i缓存将被填充。系统调用完成后,L1d L1i可能都已被污染,因此您可能还会看到i-cache未命中的性能影响。

要获得更好的细粒度测量,您可以使用硬件性能计数器,具体取决于您的体系结构。

答案 1 :(得分:0)

我正在阅读Hennessy和Patterson-线程级并行-操作系统和多编程工作负载。 L1高速缓存活动频繁的示例是一些基准代码的编译。可能,您可以具有一些可以编译的代码,并在步骤3中产生该编译以修改L1缓存。但是,是的,L1i也将被修改。