在我安装的 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
无论文件功能如何,都会返回问题的错误。