Запись времени каждого переключения контекста процесса или потока

Запись времени каждого переключения контекста процесса или потока

Я пытаюсь получить максимально возможную обработку в реальном времени с помощью дистрибутива 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: 

предположительно, показывая, когда произошло событие переключения контекста и для какого процесса.

Связанный контент