Какой (OS X) зонд dtrace срабатывает при сбое страницы с диска? - PullRequest
3 голосов
/ 28 июля 2010

Я пишу документ о сбое страницы и пытаюсь получить конкретные числа для работы, поэтому я написал простую программу, которая считывает 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);
}

Так что да, он проходит и читает весь файл.Проблема в том, что мне нужен зонд dtrace, который будет запускаться 1536 раз во время этого процесса (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 секунды.

Ответы [ 3 ]

1 голос
/ 30 ноября 2010

Я недавно был на том же уровне.У меня нет доступных сейчас DTrace-скриптов или тестовых программ, но я дам вам следующий совет:

1.) Получите доступ к внутренним компонентам OS X от Amit Singh и прочитайте раздел 8.3 о виртуальной памяти(это поможет вам правильно выбрать датчики DTrace.)

2.) Получите в свое распоряжение производительность и инструменты Solaris от Брендана Грегга / Джима Мауро.Прочитайте раздел о виртуальной памяти и обратите пристальное внимание на примеры сценариев DTrace, в которых используется поставщик vminfo.

3.) OS X определенно предварительно выбирает большие куски страниц из файловой системы, и ваша тестовая программаиграть прямо в этой оптимизации (так как вы читаете последовательно).Интересно, что это не относится к Solaris.Попробуйте произвольно получить доступ к большому массиву, чтобы отменить предварительную выборку.

1 голос
/ 14 августа 2010

Не прямой ответ, но, похоже, вы приравниваете чтение диска и ошибки страницы. Они не обязательно одинаковы. В вашем коде вы читаете данные из файла в небольшой фрагмент памяти пользователя, поэтому система ввода-вывода может считывать файл в буфер / кэш виртуальной машины любым способом и размером, который она считает нужным. Я могу ошибаться, я не знаю, как это делает Дарвин.

Я думаю, что более надежным тестом будет mmap(2) весь файл в память процесса, а затем коснитесь каждой страницы в этом месте.

0 голосов
/ 18 ноября 2010

Предположение о том, что операционная система будет давать сбой на каждой странице, к которой обращаются как к отдельной операции (и поэтому, если вы коснетесь N страниц, вы увидите, что зонд DTrace запускает N раз), ошибочно; большинство UN * Xes будут выполнять какие-либо операции чтения или предварительного сбоя, и вы вряд ли получите столько же вызовов, сколько у вас есть страниц. Это так, даже если вы используете mmap () напрямую.

Точное соотношение также может зависеть от файловой системы, поскольку реализации и пороги чтения-заголовка и кластеризации страниц вряд ли будут одинаковыми для всех из них.

Вероятно, вы можете принудительно применить политику сбоя на странице, если будете использовать mmap напрямую, а затем применить madvise (MADV_DONTNEED) или аналогичный и / или очистить весь диапазон с помощью msync (MS_INVALIDATE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...