性能偏执等级四有什么作用?

性能偏执等级四有什么作用?

在我安装的 Ubuntu Focal 中,kernel.perf_event_paranoid默认设置为 4:

$ sysctl kernel.perf_event_paranoid
kernel.perf_event_paranoid = 4

(我已经检查过/etc/sysctl.conf相关的配置目录,但我没有设置它。)

这对我来说似乎很奇怪,因为内核文档没有描述高于 2 的值的任何其他影响:

perf_event_paranoid:

Controls use of the performance events system by unprivileged
users (without CAP_SYS_ADMIN).  The default value is 2.

 -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

来源

我快速搜索了主线内核源代码,但找不到任何地方perf_event_paranoid与大于 2 的数字进行比较。

但是,设置为 4 确实有效果。我运行了以下 perf 命令,将其perf_event_paranoid设置为 4,作为非根用户:

perf stat -e context-switches,cpu-migrations -r 1 -- sleep 1

显示以下错误:

Error:
Access to performance monitoring and observability operations is limited.
Consider adjusting /proc/sys/kernel/perf_event_paranoid setting to open
access to performance monitoring and observability operations for processes
without CAP_PERFMON, CAP_SYS_PTRACE or CAP_SYS_ADMIN Linux capability.
More information can be found at 'Perf events and tool security' document:
https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html
perf_event_paranoid setting is 4:
  -1: Allow use of (almost) all events by all users
      Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>= 0: Disallow raw and ftrace function tracepoint access
>= 1: Disallow CPU event access
>= 2: Disallow kernel profiling
To make the adjusted perf_event_paranoid setting permanent preserve it
in /etc/sysctl.conf (e.g. kernel.perf_event_paranoid = <setting>)

如果我更改kernel.perf_event_paranoid为 3,并运行相同的命令,我将再次以非 root 用户身份获得以下结果:


 Performance counter stats for 'sleep 1':

                 0      context-switches:u                                          
                 0      cpu-migrations:u                                            

       1.000502603 seconds time elapsed

       0.000460000 seconds user
       0.000000000 seconds sys

因此,将perf_event_paranoid设置从默认的 4 更改为 3 会产生一些效果,即使 Linux 内核文档没有说明具体效果。

怎么回事?Ubuntu 是否附带自定义补丁,添加了新的、更严格的性能级别?

其他发行版

Debian 似乎带有一个非标准补丁,创建了perf_event_paranoid级别 3:

Jeff Vander Stoep 于 7 月 27 日发布了补丁。它添加了另一个可设置为 sysctl 参数(即kernel.perf_event_paranoid=3)的值,该值限制perf_event_open()为具有该CAP_SYS_ADMIN功能的进程。目前,perf_event_paranoid默认情况下设置为 2,这不允许没有适当功能的进程访问某些 perf 功能(原始跟踪点访问、CPU 事件访问和内核分析);该补丁不会更改默认值。他还提交了另一个补丁,允许配置内核以使 3 成为默认的 perf_event_paranoid 值。

来源。

但看起来 Ubuntu 比这更加偏执。

答案1

级别 4 与 Debian 补丁的作用完全相同:它禁止非特权进程使用perf_event_open()。但是,限制在偏执级别 4 而不是偏执级别 3 时生效。

当前的偏执级别记录在内核源代码中的注释中,位于文件中kernel/events/core.c

/*
 * perf event paranoia level:
 *  -1 - not paranoid at all
 *   0 - disallow raw tracepoint access for unpriv
 *   1 - disallow cpu events for unpriv
 *   2 - disallow kernel profiling for unpriv
 *   4 - disallow all unpriv perf event use
 */

可以找到进行此更改的提交这里(注意:提交信息和内核注释互相矛盾。内核注释在我看来是正确的。)

总结一下:

  • 级别 -1 到 2:与主线内核相同。
  • 级别 3:与级别 2 相同?无法 100% 确认这一点。有一个PERF_SECURITY_TRACEPOINT设置为 3 的常数,在某些地方仍在使用。
  • 级别 4:对非特权用户完全禁用 perf_event_open。

答案2

正如 Nick 正确指出的那样,除了对非特权用户禁用该功能之外,偏执级别 4 似乎还对特权文件应用了同样的限制。

例如,在我的 Ubuntu 20.04 系统上,我根据以下设置了一个 perf_users 组:官方文档并具备perf以下能力

$ getcap perf
perf = cap_sys_ptrace,cap_syslog,38+ep

对于非特权用户,使用偏执等级 3 运行时可以按预期工作。然而,在偏执等级 4 下,perf无论文件功能如何,都会返回问题的错误。

相关内容