Как отследить задержку пробуждения процесса исправления?

Я хочу использовать ftrace для отслеживания задержки пробуждения процесса исправления. Но ftrace будет записывать только максимальную задержку. И set_ftrace_pid бесполезен.

Кто-нибудь знает, как это сделать?

Спасибо большое.


person Jams.Liu    schedule 18.03.2020    source источник
comment
Может ли runqlat или один из других инструментов из репозиторий скрытой копии помочь?   -  person Qeole    schedule 18.03.2020


Ответы (1)


В дополнение к предложению, добавленному @Qeole, вы также можете использовать утилиту perf sched для получения более подробной трассировки задержки пробуждения процесса. В то время как ebpf инструменты, такие как runqlat, дадут вам гораздо более высокий уровень Обзор, использование perf sched поможет вам зафиксировать все события планировщика и, таким образом, более подробно наблюдать и проверять задержки пробуждения процесса. Обратите внимание, что запуск perf sched для мониторинга продолжительного процесса с интенсивными вычислениями приведет к собственным проблемам с накладными расходами.

Сначала вам нужно запустить perf sched record -

Из справочной страницы,

'perf sched record <command>' records the scheduling events of an arbitrary workload.

Например. скажем, вы хотите отслеживать задержки пробуждения команды ls.

sudo perf sched record ls

[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 1.453 MB perf.data (562 samples) ]

Вы увидите, что в том же каталоге, где была запущена команда, будет сгенерирован файл perf.data. Этот файл будет содержать все необработанные события планировщика, и приведенные ниже команды помогут разобраться во всех этих событиях планировщика.

  • Вы можете запустить perf sched latency, чтобы получить сводные данные о задержке для каждой задачи, включая сведения о количестве переключений контекста для каждой задачи, средней и максимальной задержке.
sudo perf sched latency

 -----------------------------------------------------------------------------------------------------------------
  Task                  |   Runtime ms  | Switches | Average delay ms | Maximum delay ms | Maximum delay at       |
 -----------------------------------------------------------------------------------------------------------------
  migration/4:35        |      0.000 ms |        1 | avg:    0.003 ms | max:    0.003 ms | max at: 231259.727951 s
  kworker/u16:0-p:6962  |      0.103 ms |       20 | avg:    0.003 ms | max:    0.035 ms | max at: 231259.729314 s
  ls:7118               |      1.752 ms |        1 | avg:    0.003 ms | max:    0.003 ms | max at: 231259.727898 s
  alsa-sink-Gener:3133  |      0.000 ms |        1 | avg:    0.003 ms | max:    0.003 ms | max at: 231259.729321 s
  Timer:5229            |      0.035 ms |        1 | avg:    0.002 ms | max:    0.002 ms | max at: 231259.729625 s
  AudioIP~ent RPC:7597  |      0.040 ms |        1 | avg:    0.002 ms | max:    0.002 ms | max at: 231259.729698 s
  MediaTimer #1:7075    |      0.025 ms |        1 | avg:    0.002 ms | max:    0.002 ms | max at: 231259.729651 s
  gnome-terminal-:4989  |      0.254 ms |       24 | avg:    0.001 ms | max:    0.003 ms | max at: 231259.729358 s
  MediaPl~back #3:7098  |      0.034 ms |        1 | avg:    0.001 ms | max:    0.001 ms | max at: 231259.729670 s
  kworker/u16:2-p:5987  |      0.144 ms |       32 | avg:    0.001 ms | max:    0.002 ms | max at: 231259.729193 s
  perf:7114             |      3.503 ms |        1 | avg:    0.001 ms | max:    0.001 ms | max at: 231259.729656 s
  kworker/u16:1-p:7112  |      0.184 ms |       52 | avg:    0.001 ms | max:    0.001 ms | max at: 231259.729201 s
  chrome:5713           |      0.067 ms |        1 | avg:    0.000 ms | max:    0.000 ms | max at:      0.000000 s
 -----------------------------------------------------------------------------------------------------------------
  TOTAL:                |      6.141 ms |      137 |
 ---------------------------------------------------

Вы можете видеть, что процесс ls, а также процесс perf присутствуют среди всех других процессов, которые сосуществовали в то же время, пока выполнялась команда perf sched record.

  • Вы можете запустить perf sched timehist, чтобы получить подробную сводку отдельных событий планировщика.
sudo perf sched timehist

           time    cpu  task name                       wait time  sch delay   run time
                        [tid/pid]                          (msec)     (msec)     (msec)
--------------- ------  ------------------------------  ---------  ---------  ---------
  231259.726350 [0005]  <idle>                              0.000      0.000      0.000 
  231259.726465 [0005]  chrome[5713]                        0.000      0.000      0.114 
  231259.727447 [0005]  <idle>                              0.114      0.000      0.981 
  231259.727513 [0005]  chrome[5713]                        0.981      0.000      0.066 
  231259.727898 [0004]  <idle>                              0.000      0.000      0.000 
  231259.727951 [0004]  perf[7118]                          0.000      0.002      0.052 
  231259.727958 [0002]  perf[7114]                          0.000      0.000      0.000 
  231259.727960 [0000]  <idle>                              0.000      0.000      0.000 
  231259.727964 [0004]  migration/4[35]                     0.000      0.002      0.013 
  231259.729193 [0006]  <idle>                              0.000      0.000      0.000 
  231259.729201 [0002]  <idle>                              0.000      0.000      1.242 
  231259.729201 [0003]  <idle>                              0.000      0.000      0.000   231259.729216 [0002]  kworker/u16:1-p[7112]               0.006      0.001      0.005 
  231259.729219 [0002]  <idle>                              0.005      0.000      0.002 
  231259.729222 [0002]  kworker/u16:1-p[7112]               0.002      0.000      0.002 
  231259.729222 [0006]  <idle>                              0.001      0.000      0.007 

wait time относится к времени, в течение которого задача ожидала пробуждения, а sch delay — это время, которое потребовалось планировщику, чтобы фактически запланировать ее в очередь выполнения после пробуждения задачи.

Вы можете отфильтровать команду timehist по pid, а так как pid команды ls было 7118 (вы можете наблюдать это в выводе perf sched latency).

sudo perf sched timehist -p 7118
Samples do not have callchains.
           time    cpu  task name                       wait time  sch delay   run time
                        [tid/pid]                          (msec)     (msec)     (msec)
--------------- ------  ------------------------------  ---------  ---------  ---------
  231259.727951 [0004]  perf[7118]                          0.000      0.002      0.052 
  231259.729657 [0000]  ls[7118]                            0.009      0.000      1.697 

Теперь, чтобы отслеживать события пробуждения для этого процесса, вы можете запустить добавление переключателя командной строки -w к предыдущей команде -

sudo perf sched timehist -p 7118 -w
Samples do not have callchains.
           time    cpu  task name                       wait time  sch delay   run time
                        [tid/pid]                          (msec)     (msec)     (msec)
--------------- ------  ------------------------------  ---------  ---------  ---------
  231259.727895 [0002]  perf[7114]                                                       awakened: perf[7118]
  231259.727948 [0004]  perf[7118]                                                       awakened: migration/4[35]
  231259.727951 [0004]  perf[7118]                          0.000      0.002      0.052                                 
  231259.729190 [0000]  ls[7118]                                                         awakened: kworker/u16:2-p[5987]
  231259.729199 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729207 [0000]  ls[7118]                                                         awakened: kworker/u16:2-p[5987]
  231259.729209 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729212 [0000]  ls[7118]                                                         awakened: kworker/u16:2-p[5987]
  231259.729218 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729221 [0000]  ls[7118]                                                         awakened: kworker/u16:2-p[5987]
  231259.729223 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729226 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729231 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729233 [0000]  ls[7118]                                                         awakened: kworker/u16:2-p[5987]
  231259.729237 [0000]  ls[7118]                                                         awakened: kworker/u16:2-p[5987]
  231259.729240 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729242 [0000]  ls[7118]                                                         awakened: kworker/u16:2-p[5987]

--------------------------------------    # some other events here

  231259.729548 [0000]  ls[7118]                                                         awakened: kworker/u16:0-p[6962]
  231259.729553 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729555 [0000]  ls[7118]                                                         awakened: kworker/u16:0-p[6962]
  231259.729557 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729562 [0000]  ls[7118]                                                         awakened: kworker/u16:0-p[6962]
  231259.729564 [0000]  ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729655 [0000]  ls[7118]                                                         awakened: perf[7114]
  231259.729657 [0000]  ls[7118]                            0.009      0.000      1.697                                 

Потоки kworker прерывают начальное выполнение perf и его дочернего процесса ls в 231259,729190 мс. Вы можете видеть, что процесс perf в конце концов просыпается, чтобы фактически выполниться через 231259,729655 мс после того, как все рабочие потоки ядра выполнили некоторую работу. Вы можете получить более подробную визуализацию процессора из приведенных выше timehist деталей, используя следующую команду:

sudo perf sched timehist -p 7118 -wV
Samples do not have callchains.

           time    cpu  012345678  task name                       wait time  sch delay   run time
                                   [tid/pid]                          (msec)     (msec)     (msec)
--------------- ------  ---------  ------------------------------  ---------  ---------  ---------
  231259.727895 [0002]             perf[7114]                                                       awakened: perf[7118]
  231259.727948 [0004]             perf[7118]                                                       awakened: migration/4[35]
  231259.727951 [0004]      s      perf[7118]                          0.000      0.002      0.052                                 
  231259.729190 [0000]             ls[7118]                                                         awakened: kworker/u16:2-p[5987]
  231259.729199 [0000]             ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729207 [0000]             ls[7118]                                                         awakened: kworker/u16:2-p[5987]
  231259.729209 [0000]             ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729212 [0000]             ls[7118]                                                         awakened: kworker/u16:2-p[5987]

--------------------------------------------------  # some other events here

  231259.729562 [0000]             ls[7118]                                                         awakened: kworker/u16:0-p[6962]
  231259.729564 [0000]             ls[7118]                                                         awakened: kworker/u16:1-p[7112]
  231259.729655 [0000]             ls[7118]                                                         awakened: perf[7114]
  231259.729657 [0000]  s          ls[7118]                            0.009      0.000      1.697                                 

Столбец визуализации ЦП ("012345678") содержит "s" для событий переключения контекста, что указывает на то, что сначала ЦП 4, а затем ЦП 0 переключал контекст на ls процесс.

Примечание. Вы можете дополнить приведенную выше информацию выходными данными остальных команд perf sched, а именно perf sched script и perf sched map.

person Arnabjyoti Kalita    schedule 22.03.2020