Какое ограничение на самом деле perf_event_paranoid == 1 накладывает на x86 perf?

Более новые ядра Linux имеют настраиваемый sysfs /proc/sys/kernel/perf_event_paranoid который позволяет пользователю настроить доступную функциональность perf_events для пользователей без полномочий root: более высокие номера более безопасны (предлагая соответственно меньше функций):

Из документации ядра мы имеем следующее поведение для различных значений:

perf_event_paranoid:

Контролирует использование системы событий производительности непривилегированными пользователями (без CAP_SYS_ADMIN). Значением по умолчанию является 2.

-1: разрешить использование (почти) всех событий всеми пользователями Игнорировать ограничение mlock после perf_event_mlock_kb без CAP_IPC_LOCK

> = 0: Запретить точку трассировки функции ftrace пользователями без CAP_SYS_ADMIN Запретить доступ к необработанной точке трассировки пользователями без CAP_SYS_ADMIN

> = 1: запретить доступ к событиям процессора пользователям без CAP_SYS_ADMIN

> = 2: Запретить профилирование ядра пользователями без CAP_SYS_ADMIN

я имею 1 в моем perf_event_paranoid файл, который должен "Запретить доступ к событию ЦП" - но что это означает?

Простое чтение не предполагает доступа к событиям счетчика производительности процессора (таким как события Intel PMU), но, похоже, я могу получить к ним доступ просто отлично. Например:

$ perf stat sleep 1

 Performance counter stats for 'sleep 1':

          0.408734      task-clock (msec)         #    0.000 CPUs utilized          
                 1      context-switches          #    0.002 M/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
                57      page-faults               #    0.139 M/sec                  
         1,050,362      cycles                    #    2.570 GHz                    
           769,135      instructions              #    0.73  insn per cycle         
           152,661      branches                  #  373.497 M/sec                  
             6,942      branch-misses             #    4.55% of all branches        

       1.000830821 seconds time elapsed

Здесь многие события являются событиями CPU PMU (cycles, instructions, branches, branch-misses, cache-misses).

Если это не события CPU, на которые они ссылаются, каковы они?

1 ответ

Решение

В этом случае событие ЦП относится к мониторингу событий на ЦП, а не на задачу. За perf инструменты это ограничивает использование

-C, --cpu=
    Count only on the list of CPUs provided. Multiple CPUs can be provided as a comma-separated list with no space: 0,1.
    Ranges of CPUs are specified with -: 0-2. In per-thread mode, this option is ignored. The -a option is still necessary
    to activate system-wide monitoring. Default is to count on all CPUs.

-a, --all-cpus
    system-wide collection from all CPUs (default if no target is specified)

За perf_event_open это учитывает следующий случай:

pid == -1 and cpu >= 0
       This measures all processes/threads on the specified CPU.  This requires CAP_SYS_ADMIN capability or a /proc/sys/ker‐
       nel/perf_event_paranoid value of less than 1.

Это может быть конкретной версией, цитируемая документация от 4.17. Это еще один связанный с этим вопрос.

Другие вопросы по тегам