@ Карта сайта News Автора!

Bog BOS: oprofile - исследование особенностей вычислительной производительности с использованием аппаратных счётчиков событий

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)

Последнее изменение файла: 2022.03.28
Скопировано с www.bog.pp.ru: 2024.04.19

Bog BOS: oprofile - исследование особенностей вычислительной производительности с использованием аппаратных счётчиков событий

oprofile - исследование особенностей вычислительной производительности на уровне системы с использованием встроенных в ЦП счётчиков событий: такты ядра, такты шины, обращений к шине, промахи кеша и т.п. (количество счётчиков, поддерживаемые типы событий и маски событий зависят от архитектуры и модели ЦП). Можно подсчитывать события, происходящие в режиме ядра, в режиме пользователя или обоих режимах. При достижении заданного числа событий проиcходит прерывание (NMI, non-maskable interrupts), обработчик прерывания записывает сообщение о событии (счётчик адреса и номер процесса) в буфер ядра, сервис oprofiled переносит накопленные данные из буфера ядра в файл. Сохранённый счётчик адреса и стек вызовов позволяет привязывать события к программам (модулям ядра), операторам ЯВУ и командам. Позволяет определить "узкое горло", включая подсистемы ядра (модули и обработчики прерываний). В качестве прообраза использовалась система DCPI (DEC Continuous Profiling Infrastructure). Не оказывает воздействия на исполняемые программмы ни в поведении, ни в производительности (счётчики обновляются аппаратно).

Пакет oprofile (oprofile-gui, oprofile-jit, oprofile-devel) версии 0.9.4 в RHEL5.4 (для Nehalem (i7, Xeon 55xx) требуется 0.9.5). Для IBS (Instruction-Based Sampling) для AMD K10 требуется ядро 2.6.28. Используется модуль ядра oprofile, демон oprofiled, утилита управления opcontrol и утилиты генерации отчётов opreport (возможна фильтрация по программам) и opannotate (с точностью до строки ЯВУ или команды). Перед запуском мониторинга блокируется NMI watchdog, для разблокировки требуется выгрузить модуль ядра.

Внеочередное исполнение инструкций в современных ЦП не позволяет привязать данные с точностью до команды. Записывается не каждое событие, а одно из N событий (каждый счётчик имеет ограничение на N снизу). При уменьшении N увеличивается побочная нагрузка на систему вплоть до зависания (при уменьшении N с 30000 до 3000 время расчёта увеличилось вдвое (на 20%), доля потерь отсчётов в 1.5 раза (в 8 раз); при увеличении - уменьшается точность (потери отсчётов из-за переполнения буфера пропали при увеличении до 50000 на AMD K10 с частотой 2800MHz при нагрузке на все 24 ядра).

Заброшена в пользу perf.

Модуль ядра oprofile

Модуль ядра oprofile имеет параметры: p4force, timer (использовать только прерывания от таймера). По умолчанию, счётчик 0 отслеживает событие CPU_CLK_UNHALTED (для Core2/K10). Для управления используется файловая система в каталоге /dev/oprofile/, в котором можно посмотреть текущее состояние, задать параметры мониторинга и взять результаты (почему он в /dev, а не в /proc или /sys?). Максимальное количество одновременно используемых счётчиков определяется моделью ЦП, нумеруются с 0, каждый счётчик имеет подкаталог в /dev/oprofile/ (отсюда можно определить их число):

ophelp - список допустимых счётчиков (событий)

"ophelp -r" выдаёт тип ЦП.

ophelp с указанием имени счётчика выдаёт его номер.

ophelp без параметров выдаёт список допустимых счётчиков и масок, например, для Intel Xeon 55xx (Nehalem, i7; 5 счётчиков, 31 bit? не получается задать больше 1 счётчика):

ophelp для AMD K10 (все счётчики универсальные; 4 счётчика по 40 bit? не получается задать более 3):

Демон oprofiled

Демон oprofiled запускается и останавливается утилитой opcontrol, периодически считывает собранные данные из аппаратных счётчиков (/dev/oprofile/) и сохраняет их в файлах (/var/lib/oprofile/samples/current). Журнал - /var/lib/oprofile/samples/oprofile.log (обратить внимание на количество потерь отсчётов в связи с переполнением буфера).

opcontrol - управление демоном

Утилита opcontrol позволяет управлять сбором данных. Требуются права суперпользователя.

Загрузка модуля и прочая инициализация:
opcontrol --init

Настройка демона:
opcontrol --setup ключи-настройки

Запуск демона и сбора статистики:
opcontrol --start

Запуск только демона:
opcontrol --start-daemon

Посмотреть список событий, доступных для наблюдения:
opcontrol --list-events

Посмотреть настройки:
opcontrol --status

Записать накопленную статистику (в /var/lib/oprofile):
opcontrol --dump

Остановить сбор статистики:
opcontrol --stop

Остановить сбор статистики и остановить демона:
opcontrol --shutdown

Сохранить данные текущей сессии:
opcontrol --save=имя-сессии

Сброс статистики текущей сессии (сохранённые сессии не теряются):
opcontrol --reset

Остановить демон, выгрузить модуль oprofile и размонтировать oprofilefs:
opcontrol --deinit

Конфигурационный файл, который заполняет opcontrol (т.е. при следующем запуске параметры повторять не обязательно) - /root/.oprofile/daemonrc:

Запуск демона:
opcontrol --start

oprof_start из пакета oprofile-gui позволяет выбрать счётчики в графическом режиме (QT).

oparchive позволяет архивировать накопленные данные. Архив самодостаточен и может быть использован на другом компьютере. Ключи:

opimport конвертирует накопленные данные для их исследования на компьютере другой архитектуры.

Интересные комбинации для AMD K10

# сбор данных о среднем времен выполнения инструкции (AMD K10):
opcontrol --setup --event=CPU_CLK_UNHALTED:300000 --event=RETIRED_INSTRUCTIONS:300000 --event=RETIRED_UOPS:300000
# выяснение используемых режимов плавающей арифметики:
opcontrol --setup --event=RETIRED_MMX_FP_INSTRUCTIONS:300000:1 \
                  --event=RETIRED_MMX_FP_INSTRUCTIONS:300000:2 \
                  --event=RETIRED_MMX_FP_INSTRUCTIONS:300000:4
# насколько хорошо кеширование L1D:
opcontrol --setup --event=DATA_CACHE_ACCESSES:300000 --event=DATA_CACHE_MISSES:300000 \
                   --event=DATA_CACHE_REFILLS_FROM_L2_OR_NORTHBRIDGE:300000
# насколько хорошо кеширование L1I и L2:
opcontrol --setup --event=REQUESTS_TO_L2:300000 --event=L2_CACHE_MISS:300000 --event=INSTRUCTION_CACHE_MISSES:300000
# насколько хорошо кеширование L3:
opcontrol --setup --event=READ_REQUEST_L3_CACHE:300000 --event=L3_CACHE_MISSES:300000 --event=L3_EVICTIONS:300000
# возможные проблемы, тормозящие вычисления:
opcontrol --setup --event=PIPELINE_RESTART_DUE_TO_SELF_MODIFYING_CODE:500 \
                  --event=MISALIGNED_ACCESSES:300000 --event=1_BIT_ECC_ERRORS:500
# проблемы декодирования команд и планирования запуска:
opcontrol --setup --event=INSTRUCTION_FETCH_STALL:300000 --event=DECODER_EMPTY:300000 --event=DISPATCH_STALLS:300000
# эффективность работы DTLB:
opcontrol --setup --event=L1_DTLB_HIT:300000 --event=L1_DTLB_MISS_AND_L2_DTLB_HIT:300000 --event=L1_DTLB_AND_L2_DTLB_MISS:300000
# эффективность работы ITLB:
opcontrol --setup --event=L1_ITLB_MISS_AND_L2_ITLB_HIT:300000 --event=L1_ITLB_MISS_AND_L2_ITLB_MISS:300000
# сбросы TLB:
opcontrol --setup --event=GLOBAL_TLB_FLUSHES:500 --event=ITLB_RELOADS:500 --event=ITLB_RELOADS_ABORTED:500
# доступ к памяти:
opcontrol --setup --event=MEMORY_REQUESTS:300000 --event=DRAM_ACCESSES:300000 --event=CPU_IO_REQUESTS_TO_MEMORY_IO:300000:0xa8
# доля команд перехода и ошибочных предсказаний
opcontrol --setup --event=RETIRED_INSTRUCTIONS:300000 \
                  --event=RETIRED_BRANCH_INSTRUCTIONS:300000 --event=RETIRED_MISPREDICTED_BRANCH_INSTRUCTIONS:300000

Интересные комбинации для Core2

opreport - генератор отчётов

Утилита opreport считывает собранные в /var/lib/oprofile/samples/ данные, фильтрует, сливает, анализирует их и выводит в человеколюбивом формате. Не требуются права суперпользователя. Необходимо задать спецификацию профиля для фильтрации (по умолчанию - пустая спецификация, т.е. использовать все накопленные данные) и опции вывода:

Спецификация профиля (фильтр отбора данных) состоит из комбинации следующих параметров через пробел:

opreport позволяет сравнить 2 профиля (не забывайте пробелы и экранировку от bash):

opreport ключи общая-часть-спецификации { отличия-первого-профиля } { отличия-второго-профиля }

opannotate - дизассемблер

opannotate создаёт размеченный (аннотированный) листинг исходного кода программы (приложение должны быть скомпилировано с отладочной информацией - "gcc -g") и/или листинг дизассемблера, в который добавляется информация о значении счётчиков. Спецификация профиля задаётся аналогично команде opreport. Ключи:

Расширение OProfile для Eclipse

Расширение OProfile для Eclipse CDT позволяет исследовать особенности поведения разрабатываемой программы, не выходя из среды Eclipse.

Ссылки

@ Карта сайта News Автора!

Bog BOS: oprofile - исследование особенностей вычислительной производительности с использованием аппаратных счётчиков событий

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru