webdevqa.jp.net

perf_event_paranoid == 1が実際にx86 perfに適用する制限は何ですか?

新しいLinuxカーネルにはsysfs調整可能パラメータ/proc/sys/kernel/perf_event_paranoidがあり、これによりユーザーはperf_eventsの利用可能な機能をルート以外のユーザー向けに調整できます。

kernel documenation から、さまざまな値に対して次の動作があります。

perf_event_paranoid:

特権のないユーザーによるパフォーマンスイベントシステムの使用を制御します(CAP_SYS_ADMINなし)。デフォルト値は2です。

-1:すべてのユーザーによる(ほぼ)すべてのイベントの使用を許可するCAP_IPC_LOCKなしでperf_event_mlock_kbの後にmlock制限を無視する

> = 0:CAP_SYS_ADMINを持たないユーザーによるftrace関数のトレースポイントを許可しないCAP_SYS_ADMINを持たないユーザーによるrawトレースポイントアクセスを許可しない

> = 1:CAP_SYS_ADMINを持たないユーザーによるCPUイベントアクセスを許可しません

> = 2:CAP_SYS_ADMINを持たないユーザーによるカーネルプロファイリングを許可しない

1ファイルにperf_event_paranoidがあり、これは「CPUイベントアクセスを許可しない」必要がありますが、正確にはどういう意味ですか?

単純な読み取り値は、CPUパフォーマンスカウンターイベント(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イベントです(cyclesinstructionsbranchesbranch-missescache-misses)。

これらが参照されているCPUイベントでない場合、それらは何ですか?

11
BeeOnRope

この場合、CPUイベントは、タスクごとではなくCPUごとのイベントの監視を指します。 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からです。これは 別の関連する質問 です。

8
Zulan