Как отследить задержку запуска процесса исправления? - PullRequest
1 голос
/ 18 марта 2020

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

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

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

1 Ответ

2 голосов
/ 22 марта 2020

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

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

Из man- страница,

'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 

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * sch delay * * * * * * * * * * * * * * * * * * * * * * * 1040. после пробуждения задачи.

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

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 мс после того, как все рабочие потоки ядра выполнили некоторую работу. Вы можете получить более подробную визуализацию CPU из вышеприведенных деталей 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                                 

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

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

...