Spec-Zone.ru › Swift

Linux perf

perf, что это? perf, что это? раздел" href="#perf-whats-that">

Инструмент Linux perf — невероятно мощный инструмент, который, среди прочего, может использоваться для:

  • Выборка задач, связанных с процессором (или всей системы), для анализа, какая часть вашего приложения потребляет время процессора
  • Доступ к счетчикам производительности процессора (PMU)
  • «Пробы пользователя» (uprobes), которые срабатывают, например, при выполнении определенной функции в вашем приложении

В целом, perf может подсчитывать и/или записывать стеки вызовов ваших потоков при возникновении определенного события. Эти события могут быть инициированы:

  • Время (например, 1000 раз в секунду), полезно для профилирования по времени. Пример использования см. в руководстве по отладке производительности процессора.
  • Системные вызовы, полезно для определения мест расположения ваших системных вызовов.
  • Различные системные события, например, для определения моментов переключения контекста.
  • Счетчики производительности процессора, полезно, если проблемы производительности связаны с микроархитектурными особенностями вашего процессора (например, ошибками прогнозирования ветвлений). Пример использования см. в руководстве SwiftNIO по расширенному анализу производительности.
  • и многое другое

Настройка работы perf perf для работы раздел" href="#getting-perf-to-work">

К сожалению, настройка работы perf зависит от вашей среды. Ниже приведены примеры сред и способов настройки работы perf в них.

Установка perf perf раздел" href="#installing-perf">

Технически, perf входит в состав исходных кодов ядра Linux, и вам потребуется версия perf, точно соответствующая версии вашего ядра Linux. Однако во многих случаях подойдёт и версия perf, достаточно близкая к вашей. В случае сомнений используйте версию perf, немного более старую, чем ваше ядро, а не более новую.

  • Ubuntu

      apt-get update && apt-get -y install linux-tools-generic
    

    Дополнительную информацию см. ниже, поскольку в Ubuntu установлены разные пакеты perf для каждой версии ядра.

  • Debian

      apt-get update && apt-get -y install linux-perf
    
  • Fedora/RedHat derivates

     yum install -y perf
    

Вы можете подтвердить, что установка perf работает, используя perf stat -- sleep 0.1 (если вы уже root) или sudo perf stat -- sleep 0.1.

perf в Ubuntu, когда вы не можете подобрать версию ядра perf в Ubuntu, когда вы не можете подобрать версию ядра раздел" href="#perf-on-ubuntu-when-you-cant-match-the-kernel-version">

В Ubuntu (и других дистрибутивах, где пакеты perf зависят от версии ядра) после установки linux-tools-generic может появиться ошибка. Сообщение об ошибке будет похоже на

$ perf stat -- sleep 0.1
WARNING: perf not found for kernel 5.10.25

  You may need to install the following packages for this specific kernel:
    linux-tools-5.10.25-linuxkit
    linux-cloud-tools-5.10.25-linuxkit

  You may also want to install one of the following packages to keep up to date:
    linux-tools-linuxkit
    linux-cloud-tools-linuxkit

Лучшее решение — следовать инструкциям perf и установить один из вышеперечисленных пакетов. Если вы работаете в контейнере Docker, это может быть невозможно, так как вам нужно будет подобрать версию ядра (что особенно сложно в Docker для Mac, так как он использует виртуальную машину). Например, рекомендованный пакет linux-tools-5.10.25-linuxkit фактически недоступен.

В качестве обходного решения вы можете попробовать следующие варианты

  • Если вы уже root и предпочитаете оболочку alias (действительно только в данной оболочке)

      alias perf=$(find /usr/lib/linux-tools/*/perf | head -1)
    
  • Если вы пользователь и хотите предпочесть связку /usr/local/bin/perf

      sudo ln -s "$(find /usr/lib/linux-tools/*/perf | head -1)" /usr/local/bin/perf
    

После этого вы должны успешно использовать perf stat -- sleep 0.1 (если вы уже root) или sudo perf stat -- sleep 0.1.

Рабочая станция

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

В Docker (работающем на рабочей станции Linux)

Вам необходимо запустить свой контейнер с docker run --privileged (не используйте это в рабочей среде), и у вас должен быть полный доступ к perf (включая PMU).

Для проверки корректной работы perf запустите, например, perf stat -- sleep 0.1. Будет ли отображаться <not supported> рядом с некоторыми сведениями, зависит от доступа к счетчикам производительности процессора (PMU). В Docker на рабочей станции это должно работать, т. е. не должно появляться <not supported>.

Docker для Mac

Docker для Mac похож на Docker на рабочей станции, но с дополнительными сложностями, так как мы фактически запускаем контейнеры Docker, размещённые в виртуальной машине Linux. Поэтому подбор версии ядра будет затруднён.

Если вы следуете инструкциям по установке выше, то perf всё же будет работать, но у вас не будет доступа к счетчикам производительности процессора (PMU), поэтому вы увидите, как некоторые события отображаются как <not supported>.

$ perf stat -- sleep 0.1

 Performance counter stats for 'sleep 0.1':

              0.44 msec task-clock                #    0.004 CPUs utilized
                 1      context-switches          #    0.002 M/sec
                 0      cpu-migrations            #    0.000 K/sec
                57      page-faults               #    0.129 M/sec
   <not supported>      cycles
   <not supported>      instructions
   <not supported>      branches
   <not supported>      branch-misses

       0.102869000 seconds time elapsed

       0.000000000 seconds user
       0.001069000 seconds sys

В виртуальной машине

В виртуальной машине вы установите perf так же, как и на рабочей станции. И либо perf будет работать без проблем со всеми своими функциями, либо будет выглядеть похоже на то, что вы получаете в Docker для Mac.

Для вашего гипервизора необходимо поддерживать (и разрешать) «пропускание PMU» или «виртуализацию PMU». VMware Fusion поддерживает виртуализацию PMU, которую они называют vPMC (Настройки ВМ —> Процессоры и память —> Дополнительно —> Разрешить приложения для профилирования кода в этой виртуальной машине). К сожалению, на Mac эта настройка поддерживается только до macOS Catalina (и не поддерживается на Big Sur).

Если вы используете libvirt для управления своим гипервизором и виртуальными машинами, вы можете использовать sudo virsh edit your-domain и заменить тег XML <cpu .../> на

<cpu mode='host-passthrough' check='none'/>

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

The Swift Programming Language, Copyright © 2014-2025 Apple Inc.
Swift and the Swift logo are trademarks of Apple Inc.

Documentation for Swift 6.0.3


https://www.swift.org/documentation/server/guides/linux-perf.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API