Регистрация доступа к памяти
Я нашел 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
:
- http://indico.cern.ch/event/280897/contributions/1628882/attachments/515361/711133/SE-CERN_PMU_workshop_2013.pdf
- http://www.linuxtag.org/2013/fileadmin/www.linuxtag.org/slides/Arnaldo_Melo_-_Linux__perf__tools__Overview_and_Current_Developments.e323.pdf
- https://people.netfilter.org/pablo/netdev0.1/slides/sowa-perf-analytics.pdf
Некоторая информация о декодировании 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/