ユーザーがサービス(sudoで始まるnginxプロセス)のパフォーマンス統計を収集できない理由はわかりません。ご覧のとおり、カーネルバージョンとパフォーマンスバージョンが一致しています。
$ uname -r
4.19.125
$ which perf
/home/mahmood/bin/perf
$ /home/mahmood/bin/perf --version
perf version 4.19.125
ただし、実行するとperf record -e cycles:u -j any,u -a -o perf.data -p 4018
このエラーが発生します。
Warning:
PID/TID switch overriding SYSTEM
Error:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid,
which controls use of the performance events system by
unprivileged users (without CAP_SYS_ADMIN).
The current value is -1:
-1: Allow use of (almost) all events by all users
Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>= 0: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN
Disallow raw tracepoint access by users without CAP_SYS_ADMIN
>= 1: Disallow CPU event access by users without CAP_SYS_ADMIN
>= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN
To make this setting permanent, edit /etc/sysctl.conf too, e.g.:
kernel.perf_event_paranoid = -1
値が-1、-1の場合、すべてのユーザーがデータを収集できることは明らかです。
それでは、この問題をどのように解決するのですか?
答え1
@waltinatorでコメント
従業員の読み取りとユーザーIDの割り当て
CAP_SYS_ADMIN
おすすめ能力(7)、現在、次のように言います。
CAP_PERFMON
(Linux 5.8以降)以下を含むさまざまなパフォーマンス監視メカニズムを使用します。
- perf_event_open(2) を呼び出します。
- パフォーマンスに影響を与えるさまざまなBPF操作を使用します。
この機能は次に追加されました。Linux 5.8過負荷機能と性能監視機能の分離
CAP_SYS_ADMIN
能力。カーネルソースファイルも参照してください。Documentation/admin-guide/perf-security.rst
。
これについては詳しく説明しません。どのようにこれを行うために、最後に、以下を含むプログラムのリストが提供されます。getcap
(8)そしてsetcap
(8)特定のファイルに追加された機能を確認し、機能を変更するために使用できます。
OPの質問には、Ubuntu(Debianなど)というタグが付けられています。一部の他のシステムでは、これらの設定を適用する構成ファイルがある可能性があります。たとえば、次のようになります。CentOS 7でcap_sys_admin
ユーザーに権限を追加する方法は?しかし、Debianなどでは通常、パッケージのインストールスクリプトを介して行われます。
たとえば、Ubuntu 18.04を実行すると、次のようになりますgetcap /usr/bin/*
。
/usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep
/usr/bin/mtr-packet = cap_net_raw+ep
mtr-tiny
はの一部でありmtr
、パッケージファイルpostinstall
これにはスクリプトが含まれています。
#!/bin/sh
set -e
if [ "$1" = configure ]; then
# If setcap is installed, try setting cap_net_raw+ep,
# which allows us to install our binaries without the setuid
# bit.
if command -v setcap > /dev/null; then
if ! setcap cap_net_raw+ep /usr/bin/mtr-packet; then
echo "Setcap failed on /usr/bin/mtr-packet, falling back to setuid" >&2
chmod u+s /usr/bin/mtr-packet
fi
else
echo "Setcap is not installed, falling back to setuid" >&2
chmod u+s /usr/bin/mtr-packet
fi
fi
#DEBHELPER#
exit 0
関連コマンドで
setcap cap_net_raw+ep /usr/bin/mtr-packet
これはcap_net_raw
明らかでなければなりません。それep
あまり明確ではありません。見ているソースコード
printf("%s differs in [%s%s%s]\n", *argv,
CAP_DIFFERS(cmp, CAP_PERMITTED) ? "p" : "",
CAP_DIFFERS(cmp, CAP_INHERITABLE) ? "i" : "",
CAP_DIFFERS(cmp, CAP_EFFECTIVE) ? "e" : "");
この段落を明確にするのに役立ちます。テキストにキャップ(3):
各句のカンマ区切りの機能名(または単語)のリスト
all
) の後にタスクリストが表示されます。タスクリストは、一連の演算子とフラグのペアで構成されています。法的演算子には以下が含まれます。=
、「+」と-
。法的フラグは次のとおりです。e
、i
とp
。これらのフラグは大文字と小文字を区別し、有効なセット、継承可能なセット、および許可されるセットをそれぞれ指定します。
つまり、setcap
使用しているカーネルに必要なすべての機能を追加できます。perf
適切なフラグを含むプログラムファイル。
答え2
ただ使用Sudo今後パフォーマンス私のためにこの問題を解決してください
sudo perf record -e cycles:u -j any,u -a -o perf.data -p 4018