我正在尝试在Mac上运行操作系统版本10.9.5,2 GHz Intel Core i7处理器和8 GB 1600 MHz DDR3内存。工作负载读取已映射到地址空间的大文件的各个部分。如果我的进程可用的缓冲区缓存量有限,我感兴趣的是如何影响性能。我和我的同事并不知道这样做的直接方式(即直接系统调用等),因此我们创建了一个内存程序,它在后台运行并不断触及分配给它的每个页面,以强制内核分配给hogger一定的物理记忆。我们的基本问题是我们发现基准测试在后台运行hogger时运行得更快,我们不知道如何解释这个结果。
memhog代码的基本要点是(我们的实际代码中有一些错误检查):
mem = malloc(size); // Allocate size bytes
for (int i = 0; ; i = (i + PAGE_SIZE) % size) { // Infinite loop
mem[i]++;
}
此程序是使用gcc编译的,未启用任何优化。通过在循环中添加print语句,我们验证了循环的每次迭代(除了第一次迭代,由于我们第一次触摸内存时必须发生的所有页面错误)很快发生,这表明大约有大小字节的物理记忆实际上是由这个过程保存的。
当我们在运行内存耗尽时尝试运行我们的基准测试时会出现奇怪现象。没有运行内存占用,基准测试运行大约16秒。但是,当我们在后台运行内存耗时时,基准测试会显着加快!也就是说,我们发现当我们占用1 MB的内存(基本上几乎没有任何东西,但只是在背景中有一个无用的进程旋转)时,基准测试一直在大约13秒内完成。占用更多内存(4 GB),完成需要14-15秒,占用6 GB,基准测试大约需要16秒才能完成。基准测试本身需要大约4.3 GB的内存(通过在加载所有数据之前和加载所有数据之后减去ru_maxrss的值来测量getrusage)。
我们发现这非常令人费解;虽然在背景中使用memhog可能不会降低性能,但是当无用的进程在后台旋转时,性能可能会提高很多,这很奇怪。你对这种行为有什么见解吗?谢谢!
(我们也有vm_stat数据,如果它有助于解决这个问题我们可以发布;我们现在没有包含它,因为它很长)。