我不知道为什么用户无法收集服务的性能统计数据(已由 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 的评论
阅读 man capabites 并赋予您的用户 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 perf record -e cycles:u -j any,u -a -o perf.data -p 4018