除 root 之外的用户的 Perf 权限

除 root 之外的用户的 Perf 权限

我不知道为什么用户无法收集服务的性能统计数据(已由 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 并赋予您的用户 IDCAP_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

相关内容