Регистрация доступа к памяти

Я нашел mtrace от доктора Клемента. Хотя это полезно, оно не работает нормально в ситуации, в которой я нуждаюсь. Я намерен использовать эту запись, чтобы понять схему доступа к памяти в другом сценарии.

Может кто-нибудь поделиться опытом? Любое предложение будет оценено.

0313 Обновлено: я пытаюсь использовать qemu-mtrace для загрузки Ubuntu 16.04 с linux-mtrace(3.8.0), но он показывает только несколько сообщений об ошибках и завершается. Надеюсь, что какой-нибудь инструмент сможет регистрировать каждый доступ.

$ ./qemu-system-x86_64 -mtrace-enable -mtrace-file mtrace.out -hda ubuntu.img -m 1024
Error: mtrace_entry_ascope (exit, syscall:xx) with no stack tag!
mtrace_entry_register: mtrace_host_addr failed (10)
mtrace_inst_exec: bad call 140734947607728
Aborted (core dumped)

1 ответ

Решение

Есть perf mem инструмент, реализованный для некоторых современных процессоров x86/EM64T (возможно, только для Intel; Ivy и более новые процессоры для настольных ПК / серверов). Страница человека из perf mem это http://man7.org/linux/man-pages/man1/perf-mem.1.html и тот же текст в директории docs ядра: http://lxr.free-electrons.com/source/tools/perf/Documentation/perf-mem.txt. Текст неполный; лучшие документы являются источниками: tools / perf / builtin-mem.c и частично в tools / perf / builtin-report.c. Нет подробностей в https://perf.wiki.kernel.org/index.php/Tutorial.

В отличие от qemu-mtrace он не будет регистрировать каждый доступ к памяти, а только каждый N-й доступ, где N равно 10000 или 100000. Но он работает с собственной скоростью и низкими издержками. использование perf mem record ./program записать шаблон; попробуйте добавить -a или же -C cpulist для общесистемной или глобальной выборки для некоторых ядер процессора. Невозможно регистрировать (отслеживать) весь доступ к памяти изнутри системы (инструмент должен записывать информацию в память и регистрировать этот доступ - это бесконечная рекурсия с конечной памятью), но существуют очень дорогостоящие запатентованные, зависящие от системы внешние решения для отслеживания, такие как анализатор JTAG или SDRAM ($5 тыс. или более).

Инструменты perf mem где он был добавлен около 2013 года (версия ядра Linux 3.10), есть несколько результатов поиска perf mem на lwn: https://lwn.net/Articles/531766/

С помощью этого патча можно сэмплировать (не отслеживать) доступ к памяти (загрузка, сохранение). Для нагрузок записываются адреса команд и данных вместе с задержкой и источником данных. Для хранилищ адреса команд и данных захватываются вместе с ограниченной информацией кеша и TLB.

Текущие исправления реализуют эту функцию на процессорах Intel, начиная с Nehalem. Патчи используют механизмы задержки загрузки и точного хранения PEBS. Precise Store присутствует только на процессорах Sandy Bridge и Ivy Bridge.

Добавлена ​​поддержка выборки физических адресов: https://lwn.net/Articles/555890/ (perf mem --phys-addr -t load rec); (есть также немного связанных 2016 года c2c инструмент для перфорации " для отслеживания раздоров в кешировании ": https://lwn.net/Articles/704125/ с примерами https://joemario.github.io/blog/2016/09/01/c2c-blog/)

Несколько случайных слайдов на perf mem:

Некоторая информация о декодировании perf mem -D report: perf mem -D отчет

 # PID, TID, IP, ADDR, LOCAL WEIGHT, DSRC, SYMBOL
 2054  2054 0xffffffff811186bf 0x016ffffe8fbffc804b0    49 0x68100842 /lib/modules/3.12.23/build/vmlinux:perf_event_aux_ctx

Что означают "ADDR", "DSRC", "SYMBOL"?

(ответил тем же пользователем, что и в этом ответе)

  • IP - ПК инструкции загрузки / хранения;
  • SYMBOL - название функции, содержащей эту инструкцию (IP);
  • ADDR - адрес виртуальной памяти данных, запрошенных загрузкой / хранением (если не было опции --phys-data)
  • DSRC - "Декодированный источник".

Существует также сортировка, чтобы получить некоторые основные характеристики: perf mem rep --sort=mem - http://thread.gmane.org/gmane.linux.kernel.perf.user/1438

Другие инструменты... Существует (медленный) эмулятор cachegrind, основанный на valgrind для имитации кэш-памяти для prograns пользовательского пространства - "7.2 Имитация кэшей ЦП" по https://lwn.net/Articles/257209/. Также должно быть что-то для низкоуровневых (самых медленных) моделей, связанных с DRAMsim / DRAMsim2 http://eng.umd.edu/~blj/dramsim/

Другие вопросы по тегам