|
3
|
| Sniggerfardimungus · 技术社区 · 16 年前 |
|
|
1
1
这不是一个直接的答案,但您似乎把磁盘读取和页面错误等同起来了。它们不一定是相同的。在您的代码中,您正在将数据从一个文件读取到一个小的用户内存块中,因此I/O系统可以以任何它认为合适的方式和大小将文件读取到buffer/vm缓存中。我可能错了,我不知道达尔文是怎么做到的。
我认为更可靠的测试应该是
|
|
|
2
1
我最近在同一个小洞里。我目前没有可用的DTrace脚本或测试程序,但我将向您提供以下建议: 1.)使用Amit Singh开发的OSX内部构件,并阅读第8.3节“虚拟内存”(这将使您进入选择dtrace探针的正确参考框架)。 2.)了解Brendan Gregg/Jim Mauro的Solaris性能和工具。阅读虚拟内存部分,并密切关注使用vminfo提供程序的dtrace脚本示例。 3.)OSX绝对是从文件系统预取大的页面块,并且您的测试程序正在进行这种优化(因为您是按顺序读取的)。有趣的是,对于Solaris,情况并非如此。尝试随机访问大数组以击败预取。 |
|
|
3
0
假设操作系统将在作为单独操作被触摸的每个页面中出错(因此,如果触摸n个页面,您将看到dtrace probe fire n次),这是有缺陷的;大多数un*xes将执行某种预读或预错,并且您不太可能获得完全相同的调用数。因为你有页面。即使直接使用mmap(),也是如此。 准确的比率也可能取决于文件系统,因为readahead和page集群实现以及阈值对于所有实现都不太可能相同。 如果直接使用mmap,然后应用madvise(madv-dontned)或类似工具和/或使用msync(ms-invalidate)清除整个范围,则可能会强制使用每页错误策略。 |