#performance #amd #perf #tlb #mmu
#Производительность #amd #perf #tlb #mmu
Вопрос:
Я ищу AMD
конкретные счетчики производительности, которые подсчитывают циклы, потребляемые при обходе страниц при TLB
возникновении промахов. Я знаю, что у Intel есть такие доступные показатели.
Но существуют ли такие на AMD? Я заглянул в http://developer.amd.com/wordpress/media/2013/12/56255_OSRR-1.pdf но не нашел ничего похожего на то, что мне нужно.
Я также заглянул в perf
исходный код https://elixir.bootlin.com/linux/latest/source/arch/x86/events/amd/core.c#L248 Похоже, у него нет ни того, ни другого.
Может быть, у него разные имена? Есть предложения?
Комментарии:
1. «потребляется» — вы имеете в виду, что просмотр страницы активен, а ядро остановлено, операции ввода-вывода не выполняются? Потому что в некоторых случаях OoO exec может скрывать некоторую задержку при переходе по странице. (И если переход инициируется предварительной выборкой TLB, в идеале он полностью скрывает задержку, и вы не получаете пропуска TLB или тот, который завершается достаточно быстро, чтобы не быть проблемой. Но на практике более вероятно, что спекулятивные ранние переходы по страницам просто сокращают время простоя, а не полностью скрывают его, особенно когда OoO exec уже должен работать, чтобы скрыть другие задержки.)
Ответ №1:
Мне кажется, вы ищете события, похожие на процессоры Intel *.WALK_DURATION
или *.WALK_ACTIVE
AMD Zen. Таких событий с одинаковым точным значением нет, но есть похожие события.
Ближайшими событиями являются поля данных производительности IBS IbsTlbRefillLat
и IbsItlbRefillLat
, которые измеряют количество циклов, необходимых для выполнения промаха L1 DTLB или L1 ITLB, соответственно, в случае промаха для выбранной выборки команд или uop. Обратите внимание, что in perf record
, IbsTlbRefillLat
может быть захвачен с ibs_fetch
помощью PMU и IbsItlbRefillLat
может быть захвачен с ibs_op
помощью PMU.
Событие Core::X86::Pmc::Core::LsTwDcFills
также полезно. Он подсчитывает количество заполнений кэша данных L1 для обходов таблицы страниц, которые пропускаются в L1 для каждого источника данных (локальные L2, L3 на одном кристалле, L3 на другом кристалле, DRAM или IO на том же кристалле, DRAM или IO на другом кристалле). Обходы, выполняемые из более отдаленных источников, стоят дороже и, вероятно, окажут большее влияние на производительность. Это событие не учитывает переходы, которые попадают в кэш данных L1, хотя есть другие события, которые учитывают пропуски TLB L2. Кроме того, это событие учитывается только для пропусков DTLB L2, а не для пропусков ITLB.
В текущих версиях восходящего ядра LsTwDcFills
отсутствует в списке perf list
и поэтому perf
не знает событие по имени. Итак, вам нужно будет указать код события, используя синтаксис cpu/event=0x5B, umask=0x0/
. Это событие представляет любое прохождение таблицы страниц для загрузки или хранения данных, для которых выделен MAB (это означает, что прохождение было пропущено в L1D). Вы можете отфильтровать счетчик в соответствии с ответом, указав соответствующее значение umask, как определено в руководстве. Например, событие cpu/event=0x5B, umask=0x48/
представляет собой обход, когда ответ пришел из локальной или удаленной основной памяти.
Один из хороших подходов к использованию всех этих средств мониторинга в качестве небольшой части общей методологии анализа производительности микроархитектуры — это первый мониторинг LsTwDcFills
. Если он превышает некоторый порог по сравнению с общим количеством обращений к памяти (исключая выборку команд), затем выполните захват IbsTlbRefillLat
для выборочных операций ввода-вывода, чтобы определить, где в вашем коде происходят эти дорогостоящие обходы. Аналогично, для обходов с выборкой инструкций используйте событие Core::X86::Pmc::Core::BpL1TlbMissL2Hit
для подсчета общего количества обходов, и если количество слишком велико по отношению к общему количеству выборок, используйте IbsItlbRefillLat
, чтобы определить, где в вашем коде происходят самые дорогостоящие обходы.
Комментарии:
1. Хади Брейс, спасибо за комментарии.
perf
версия, которая у меня есть, не поддерживаетibs_fetch
ibs_op
аргументы и, поэтому мне приходится вводить необработанные значения. Раньше яlibpfm4
получал список всех доступных событий, поддерживаемых процессором, однако в нем не было спискаIbsTlbRefillLat
иIbsItlbRefillLat
.2. @Mark
IbsTlbRefillLat
иIbsItlbRefillLat
на самом деле не являются событиями, поэтому они не будут отображаться в списке поддерживаемых событий. Это дополнительная информация, которую можно получить с помощью выборки IBS.ibs_fetch
Иibs_op
должно поддерживаться, если вы не используете очень старую версию ядра. Укажите версию perf, версию ядра, модель вашего процессора и покажите вывод командыdir /sys/bus/event_source/devices/
. Покажите точные команды и ошибки, которые вы получаете. (Отредактируйте свой вопрос, чтобы включить эту информацию.)