Я пишу документ о сбое страницы и пытаюсь получить некоторые конкретные числа для работы, поэтому я написал простую программу, которая читает 12 * 1024 * 1024 байта данных. Легко:Какой (OS X) датчик dtrace срабатывает при сбое страницы с диска?
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);
}
Так что да, он проходит и читает весь файл. Проблема в том, что мне нужен датчик dtrace, который будет срабатывать 1536 раз в течение этого процесса (12M/8k). Даже если я считаю все fbt: mach_kernel: vm_fault *: пробники и все vminfo ::: пробники, я не нахожу 500, поэтому я знаю, что не нахожу правильных зондов.
Кто-нибудь знает, где я могу найти датчики dtrace, которые срабатывают при сбое страницы с диска?
UPDATE:
На случае, если проблема была, что есть некоторая интеллектуальная упреждающая выборка происходит в 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);
}
Эта версия занимает гораздо больше времени (42s в реальном времени, 10 из которых были пользователем, а остальное было системным временем - ошибки страницы, я предполагаю), но все же генерирует одну пятую столько ошибок, сколько я ожидал.
Для любознательных, увеличение времени не связано с накладными расходами и литьем цикла (char to int.) Версия кода, выполняющая только эти действия, занимает 0,0 секунд.
... и последующий вопрос ... почему вопросы dtrace всегда попадают в категорию «звук чирикающих сверчков»? Я подозреваю, что это связано с тем, что единственная реальная документация для dtrace-зондов находится в источнике ядра, который OS X выпускает только экономно. Вот почему я предпочитаю использовать dtrace в ящике солярия, поэтому я могу выкопать то, что мне нужно, от Open Solaris. – Sniggerfardimungus
Вы также можете попробовать 'dtrace' на FreeBSD :) –