Доступ к памяти журнала, который вызывает серьезные сбои страниц

Кто-нибудь знает, как получить доступ к памяти (указатели), которые вызывают ошибки страницы? Меня интересуют в основном ошибки на главной странице.

Немного предыстории о том, чего я пытаюсь достичь. У меня есть приложение с большим объемом памяти (база данных), и я хочу соотнести пейджинг с доступом к большим структурам данных (таким как таблицы, индексы, которые выделяются с помощью 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
Другие вопросы по тегам