Кратко о производительности linux

Linux

Введение

perf — это инструмент анализа производительности, предоставляемый в системе Linux.Он основан на подсистеме ядра, называемой «счетчики производительности», и поддерживает как аппаратный (ЦП, PMU (блок мониторинга производительности)) так и программный (программные счетчики, точки трассировки) уровни анализа производительности. .

События в перформансе

Как и другие инструменты настройки производительности, perf производит выборку отслеживаемых объектов и делает вывод о поведении всей программы на основе распределения точек выборки. С помощью команды perf list мы видим, что perf поддерживает множество событий выборки, таких как промахи ветвления, часы процессора и так далее. Предопределенные события в perf бывают разных типов, например события, генерируемые оборудованием (попадание в кэш/промах ветвления), и события, генерируемые программным обеспечением (переключение контекста/ошибка страницы) и т. д.

tracepoint

Точки трассировки – это некоторые ловушки, определенные в ядре Linux. Если они включены, они будут запускаться при выполнении определенной логики, чтобы другие инструменты могли получать информацию, например, о внутреннем рабочем состоянии системы. Perf использует точки трассировки, которые будут записывать и подсчитывать точки трассировки.Создавать аналитические отчеты для каждого события.

Как пользоваться

Конкретное использование инструмента perf выглядит следующим образом:

perf [--version] [--help] COMMAND [ARGS]

Список КОМАНД можно просмотреть, выполнив perf --help, и несколько часто используемых команд перечислены ниже.

perf stat

Роль perf stat заключается в выполнении команды и сборе различных данных во время ее работы, которые могут дать общее представление о работе программы. Например:

user@localhost:~$ perf stat hostname
localhost

 Performance counter stats for 'hostname':

          0.313464      task-clock (msec)         #    0.481 CPUs utilized          
                 2      context-switches          #    0.006 M/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               153      page-faults               #    0.488 M/sec                  
           896,723      cycles                    #    2.861 GHz                    
           620,709      instructions              #    0.69  insn per cycle         
           121,143      branches                  #  386.465 M/sec                  
             6,247      branch-misses             #    5.16% of all branches        

       0.000651441 seconds time elapsed

В приведенном выше примере команда hostname запускается через perf stat, и некоторые индикаторы во время ее работы суммируются и отображаются, например, ожидание Task-Clock и Context-Switches. По умолчанию perf stat выводит статистику для нескольких часто используемых событий, таких как:

  • задача-часы-мсек: использование процессора
  • context-switches: количество переключений процесса
  • page-faults: количество произошедших ошибок страницы
  • cpu-migrations: Указывает, сколько миграций ЦП произошло в процессе работы, то есть перенесено планировщиком с одного ЦП на другой для выполнения.
  • циклы: такт процессора, машинная инструкция может потребовать несколько циклов
  • инструкции: количество машинных инструкций
  • ветки: количество встреченных инструкций ветвления
  • промахи ветвления — это количество неверно предсказанных инструкций ветвления.

В дополнение к этому мы можем использовать параметр -e для указания интересующих нас событий, например:

user@localhost:~$ perf stat -e cache-misses hostname
localhost

 Performance counter stats for 'hostname':

          682      cache-misses                                                

       0.000646676 seconds time elapsed

perf top

Роль perf top заключается в отображении текущей статистики производительности системы в режиме реального времени. Предыдущая статистика производительности используется для анализа конкретной программы, и иногда мы можем не знать, какая программа влияет на производительность системы.В настоящее время мы можем использовать perf top для поиска подозрительных программ. Например:

Samples: 775  of event 'cpu-clock', Event count (approx.): 92931021
Overhead  Shared Object       Symbol
   8.93%  [kernel]            [k] vsnprintf
   7.73%  perf                [.] rb_next
   5.92%  [kernel]            [k] kallsyms_expand_symbol.clone.0
   5.07%  [kernel]            [k] format_decode
   4.59%  [kernel]            [k] number
   3.40%  perf                [.] symbols__insert
   3.03%  libslang.so.2.2.1   [.] SLtt_smart_puts

В приведенном выше примере показано, что perf подсчитывает данные о событиях тактовой частоты процессора, отсортированные по масштабу. Как и в perf stat, мы можем указать другие события для подсчета с помощью параметра -e.Например, perf top -e context-switches может просматривать первые N процессов с наибольшим переключением процессов.

perf record & perf report

Роль perf record аналогична perf stat, она может запускать команду и генерировать статистику, но perf record не отображает результаты, а выводит результаты в файл. Файлы, сгенерированные записью о производительности, можно проанализировать с помощью отчета о производительности.

Запись Perf также может передавать параметр -g для создания графа вызовов во время анализа, чтобы помочь найти логическое распределение верхнего уровня.

разное

В примере мы можем обнаружить, что столбец Symbol в результатах анализа perf показывает имя функции языка C. Для java функция, сгенерированная jit-компиляцией, будет отображаться непосредственно в символе вместо имени функции java. В настоящее время найти проблему не так просто. Нам нужно использовать дополнительные средства для объединения символа и имени. таблица символов java-программы Соответственно, подробности будут рассмотрены позже.