web-dev-qa-db-fra.com

Quelle restriction perf_event_paranoid == 1 met-elle réellement sur x86 perf?

Les noyaux Linux plus récents ont un sysfs réglable /proc/sys/kernel/perf_event_paranoid qui permet à l'utilisateur d'ajuster les fonctionnalités disponibles de perf_events pour les utilisateurs non root, des nombres plus élevés étant plus sûrs (offrant ainsi moins de fonctionnalités):

De la documentation du noya nous avons le comportement suivant pour les différentes valeurs:

perf_event_paranoid:

Contrôle l'utilisation du système d'événements de performance par les utilisateurs non privilégiés (sans CAP_SYS_ADMIN). La valeur par défaut est 2.

-1: Autoriser l'utilisation de (presque) tous les événements par tous les utilisateurs Ignorer la limite de mlock après perf_event_mlock_kb sans CAP_IPC_LOCK

> = 0: interdire le point de trace de la fonction ftrace par les utilisateurs sans CAP_SYS_ADMIN Interdire l'accès au point de trace brut par les utilisateurs sans CAP_SYS_ADMIN

> = 1: interdire l'accès aux événements CPU par les utilisateurs sans CAP_SYS_ADMIN

> = 2: interdire le profilage du noyau par les utilisateurs sans CAP_SYS_ADMIN

J'ai 1 dans mon perf_event_paranoid fichier qui devrait "Interdire l'accès aux événements CPU" - mais qu'est-ce que cela signifie exactement?

Une lecture simple n'impliquerait aucun accès aux événements du compteur de performances du processeur (tels que les événements Intel PMU), mais il semble que je puisse y accéder très bien. Par exemple:

$ 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

Ici, de nombreux événements sont des événements CPU PMU (cycles, instructions, branches, branch-misses, cache-misses).

Si ce ne sont pas les événements CPU auxquels il est fait référence, quels sont-ils?

11
BeeOnRope

Dans ce cas événement CPU fait référence aux événements de surveillance par CPU plutôt que par tâche. Pour les outils perf, cela limite l'utilisation de

-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)

Pour perf_event_open ceci considère le cas suivant:

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.

Cela peut être spécifique à la version, la documentation citée est de 4.17. C'est ne autre question connexe .

8
Zulan