🔍

perf_event_paranoidを変更できない時のperfの設定

2024/04/16に公開

最新版はここです。

この記事はperfを使いたいが、何らかの理由で/proc/sys/kernel/perf_event_paranoidを変更できない方向けです。Ubuntu 22.04で検証済みです。

前提

以下を仮定します。

  • 特権(sudoを使える)を持っている
  • perfをインストール済み

やり方

まず、perfがあるディレクトリに移動します。シンボリックリンクでも構いません。

# which perf
/usr/bin/perf
# cd /usr/bin

次に、perf_usersというグループを作成し、このグループにperfを追加します。これによって、perfを実行できるユーザーを制限できます。

# sudo groupadd perf_users
# ls -alhF
-rwxr-xr-x  2 root root  11M Oct 19 15:12 perf
# chgrp perf_users perf
# ls -alhF
-rwxr-xr-x  2 root perf_users  11M Oct 19 15:12 perf
# chmod o-rwx perf
# ls -alhF
-rwxr-x---  2 root perf_users  11M Oct 19 15:12 perf

perfに必要な権限を与え、perf_usersのメンバーがパフォーマンスモニタリングできるようにします。

# setcap "cap_perfmon=ep" perf
# setcap -v "cap_perfmon=ep" perf
perf: OK
# getcap perf
perf cap_perfmon=ep

解説

Linuxでは、特権をケーパビリティ(capabilities)と呼ばれる、異なる単位に分割していて、非特権ユーザーのプロセスやファイルに対してスレッド毎に個別に有効または無効に出来ます。

CAP_PERFMONというケーパビリティを持った非特権プロセスはパフォーマンスモニタリングに関して特権を持つプロセスとして扱われます。CAP_PERFMONはパフォーマンスモニタリングのために必要な最小限の特権しか持たず、モニタリングのための安全な方法を提供します。

より詳しく調べたい時は必要な特権を指定します。例えば、/proc/kallsymsファイルからカーネル空間のメモリアドレスを読みたい時はCAP_SYSLOGケーパビリティを指定します。

=epはファイルへのケーパビリティの設定で、スレッド起動時にCAP_PERFMONを有効にするという設定らしいです。

Linux v5.9以前ではCAP_SYS_PTRACEが必要でしたが、それ以降では必要ありません。

参考文献

  1. Perf events and tool security
  2. capabilities - Linux のケーパビリティ (capability) の概要

Discussion