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/perfsudo 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