Доступ к памяти журнала, который вызывает серьезные сбои страниц
Кто-нибудь знает, как получить доступ к памяти (указатели), которые вызывают ошибки страницы? Меня интересуют в основном ошибки на главной странице.
Немного предыстории о том, чего я пытаюсь достичь. У меня есть приложение с большим объемом памяти (база данных), и я хочу соотнести пейджинг с доступом к большим структурам данных (таким как таблицы, индексы, которые выделяются с помощью mmap()). Отображения процесса легко получить из /proc//maps. Теперь, если у меня есть доступ к памяти, который вызывает сбои страниц, я могу отслеживать, сколько сбоев страниц вызывается при доступе к каждой структуре данных.
Я думаю, что perf или systemtap могли бы сделать эту работу. Есть идеи?
2 ответа
Посмотрите, что доступно в точке исследования:
% stap -L vm.pagefault
vm.pagefault name:string write_access:long address:long $mm:struct mm_struct* \
$vma:struct vm_area_struct* $address:long unsigned int $flags:unsigned int
Журнал, пытаясь сопоставить адреса с именами символов
# stap -e 'probe vm.pagefault { if (execname()=="foo") { printf("%p (%s)\n", address, usymdata(address)) } }' -d /bin/foo --ldd
Смотрите также: http://sourceware.org/systemtap/examples/
Ваше предположение верно. Вы можете использовать инструмент Perf для отслеживания количества сбоев страниц, вызванных вашим приложением.
Я рекомендую вам прочитать этот учебник, чтобы научиться пользоваться этим инструментом.
Для установки просто используйте:
Вы ищете страницу ошибки. Вы можете установить (в Ubuntu или другой дистрибутив apt):
sudo apt-get install linux-tools-common linux-base
sudo apt-get install linux-tools-YOUR-KERNEL number
Вы можете получить свой номер ядра с помощью: uname -r
Например, эта команда запускает инструмент perf для команды "ls":
perf record -e page-faults:u -F 250 ls
и затем вы можете посмотреть на результаты (двоичный файл "ls" не имеет отладочной информации, поэтому не ожидайте симпатичного вывода) с помощью:
perf report