Инструмент анализа производительности в Linux, также называемый perf_events; первоначально "Счетчики производительности для Linux", PCL (не путать ни с "языком команд принтера", ни "библиотекой облака точек").

От https://perf.wiki.kernel.org/index.php/Main_Page:

perf начинал как инструмент для использования подсистемы счетчиков производительности в Linux, и в него были внесены различные улучшения для добавления возможностей трассировки.

Счетчики производительности - это аппаратные регистры ЦП, которые подсчитывают аппаратные события, такие как выполненные инструкции, перенесенные ошибки в кэше или ошибочные прогнозы ветвлений. Они формируют основу для профилирования приложений, чтобы отслеживать динамический поток управления и определять горячие точки. perf предоставляет обширные обобщенные абстракции по конкретным аппаратным возможностям. Помимо прочего, он предоставляет счетчики для каждой задачи, процессора и рабочей нагрузки, выборку поверх них и аннотацию событий исходного кода.

Perf изначально поддерживается в популярных дистрибутивах Linux, включая Red Hat Enterprise Linux и Debian (linux-tools пакет).


perf используется с несколькими подкомандами (короткий, неисчерпывающий список):

  • stat: запускает команду и собирает статистику счетчика производительности;
  • top: отображает динамический вид сверху самых горячих функций;
  • record: запускает команду и записывает свой профиль в perf.data;
  • report: анализ файла, сгенерированного perf record; может генерировать плоский или графический профиль;
  • annotateчитает perf.data (создано perf record) и отображает аннотированный код.

Пример вывода sudo perf stat tree /proc:

# started on Mon Aug 15 23:52:19 2016


 Performance counter stats for 'tree /proc':

       3929,205496 task-clock                #    0,681 CPUs utilized          
             79325 context-switches          #    0,020 M/sec                  
                33 CPU-migrations            #    0,000 M/sec                  
               273 page-faults               #    0,000 M/sec                  
        5745409809 cycles                    #    1,462 GHz                     [49,96%]
   <not supported> stalled-cycles-frontend 
   <not supported> stalled-cycles-backend  
        1465748665 instructions              #    0,26  insns per cycle         [74,84%]
         329884771 branches                  #   83,957 M/sec                   [75,30%]
          36420135 branch-misses             #   11,04% of all branches         [74,74%]

       5,765637169 seconds time elapsed