Я пытаюсь получить максимально возможную обработку в реальном времени с помощью дистрибутива Raspbian на Raspberry Pi для управления его GPIO-контактами. Я хочу "почувствовать" производительность, которую я могу ожидать.
Я собирался сделать это, написав простую программу на языке C, которая будет многократно переключать вывод с максимально возможной скоростью, и отслеживать ее с помощью логического анализатора.
Но, возможно, есть другой способ — написать вышеприведенную программу, но просто регистрировать переключения контекста, чтобы точно видеть, когда этот поток/процесс получает контроль над выборочным периодом, скажем, в несколько секунд.
Предыдущий вопросответы, как увидеть, сколько переключений контекста сделано за определенный период времени для данного процесса, но есть ли способ регистрировать точное время переключений, и, возможно, для каждого процесса, а не только для одного? Очевидно, что это создаст накладные расходы, но все равно может быть полезным. Очевидно, что данные должны храниться в оперативной памяти, чтобы минимизировать накладные расходы
Примечание для себя: возможные решения:
- Команда для вывода списка всех действий процесса в реальном времени
- Хак: заставить программу многократно получать и сохранять текущее время (и сохранять его в файле, как только журнал достигает определенного предела). Или небольшое улучшение, чтобы избежать огромных журналов: использовать алгоритм, который исключает последовательные времена, если они достаточно близки друг к другу, чтобы можно было сделать вывод, что они не были вытеснены каким-либо другим процессом.
решение1
У меня нет ответа, но вы можете найти его средиинструменты, примеры и ресурсынаписанные или перечисленные Бренданом Греггом на языке perf
команд и ядра Linux ftrace и debugfs.
На моем Raspberry Pi эти инструменты были в пакете perf-tools-unstable
. perf
Команда на самом деле была в /usr/bin/perf_3.16
.
Может быть интересно этообсуждениеи переключение контекстабенчмаркБенуа Сигура иlat_ctxтест из довольно старогоlmbenchлюкс.
Возможно, для их запуска на Pi потребуется некоторая доработка, например, tsuna/contextswitch
я отредактировал timectxswws.c
get_iterations()
файл while (iterations * ws_pages * 4096UL < 4294967295UL) {
и удалил -march=native -mno-avx
его из Makefile
.
Используя perf record
в течение 10 секунд на Pi по ssh, одновременно выполняя while sleep .1;do echo hi;done
на другом ssh:
sudo timeout -10 perf_3.16 record -e context-switches -a
sudo perf_3.16 script -f time,pid,comm | less
дает такой вывод
sleep 29341 2703976.560357:
swapper 0 2703976.562160:
kworker/u8:2 29163 2703976.564901:
swapper 0 2703976.565737:
echo 29342 2703976.565768:
migration/3 19 2703976.567549:
sleep 29343 2703976.570212:
kworker/0:0 28906 2703976.588613:
rcu_preempt 7 2703976.609261:
sleep 29343 2703976.670674:
bash 29066 2703976.671654:
echo 29344 2703976.675065:
sshd 29065 2703976.675454:
swapper 0 2703976.677757:
предположительно, показывая, когда произошло событие переключения контекста и для какого процесса.