【发布时间】:2011-03-21 22:07:31
【问题描述】:
我正在编写一个关于页面错误的文档,并试图获得一些具体的数字来处理,所以我编写了一个简单的程序来读取 12*1024*1024 字节的数据。简单:
int main()
{
FILE*in = fopen("data.bin", "rb");
int i;
int total=0;
for(i=0; i<1024*1024*12; i++)
total += fgetc(in);
printf("%d\n", total);
}
所以是的,它会遍历并读取整个文件。问题是我需要在此过程中将触发 1536 次的 dtrace 探针(12M/8k)。即使我计算了所有 fbt:mach_kernel:vm_fault*: 探测器和所有 vminfo::: 探测器,我也没有达到 500,所以我知道我没有找到正确的探测器。
有谁知道我在哪里可以找到当一个页面从磁盘出现故障时触发的 dtrace 探测器?
更新:
如果问题在于 stdio 函数中正在进行一些智能预取,我尝试了以下操作:
int main()
{
int in = open("data.bin", O_RDONLY | O_NONBLOCK);
int i;
int total=0;
char buf[128];
for(i=0; i<1024*1024*12; i++)
{
read(in, buf, 1);
total += buf[0];
}
printf("%d\n", total);
}
这个版本需要更长的时间来运行(42 秒实时,其中 10 秒是用户时间,其余是系统时间 - 我猜是页面错误),但仍然会产生五分之一的错误,这是我预期的。
出于好奇,时间增加并不是由于循环开销和强制转换(char 到 int)。执行这些操作的代码版本需要 0.07 秒。
【问题讨论】:
-
...以及后续问题...为什么 dtrace 问题总是以“唧唧喳喳的声音”类别结束?我怀疑这是因为 dtrace 探测的唯一真正文档位于内核源代码中,OS X 仅少量发布。这就是为什么我更喜欢在 Solaris 机器上使用 dtrace,这样我就可以从 Open Solaris 中挖掘出我需要的东西。
-
你也可以在 FreeBSD 上试试
dtrace:)
标签: virtual-memory dtrace probe page-fault