- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想利用 perf 运行一些测试的能力,而不用 root
运行命令,也不调整 /proc/sys/kernel/perf_event_paranoid
。 perf 的一些错误消息说:
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 2:
-1: Allow use of (almost) all events by all users
>= 0: Disallow raw tracepoint access by users without CAP_IPC_LOCK
>= 1: Disallow CPU event access by users without CAP_SYS_ADMIN
>= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN
所以我尝试通过以下方式创建一些源相同但功能不同的 bash 脚本:
wrapper_no_cap.sh -> no capabilities set
wrapper_cap_ipc_lock.sh -> setcap cap_ipc_lock+eip ./wrapper_cap_ipc_lock.sh
wrapper_cap_sys_admin.sh -> setcap cap_sys_admin+eip ./wrapper_cap_sys_admin.sh
每个脚本都有相同的来源,如下:
#!/bin/bash
perf stat -e L1-dcache-load-misses:k seq 1 10
但是我运行的每个脚本都会给我结果,就好像我是普通用户一样(这意味着我无法计算内核事件或其他特权内容)。这就像我调用脚本时丢弃了功能。 perf 版本是 4.11.ga351e9
。
这个方法有什么问题?
最佳答案
脚本文件通常禁用它们的 suid 位(在内核和一些 shell 解释器中),似乎对功能有类似的影响(并且脚本文件实际上是使用解释器启动的,例如 bash ./scriptfile
,因此进程可能不会继承脚本文件的功能):
使用小型简单编译程序通过 exec/execve 调用 perf 并在二进制 ELF 上设置功能。</p>
Linux 内核中用于脚本启动的实际代码 - http://elixir.free-electrons.com/linux/v4.10/source/fs/binfmt_script.c - 使用解释器二进制文件,而不是脚本文件(旧的 bprm->file
),来获得类似 suid 的权限
/*
* OK, now restart the process with the interpreter's dentry.
*/
file = open_exec(interp);
if (IS_ERR(file))
return PTR_ERR(file);
bprm->file = file;
retval = prepare_binprm(bprm);
http://elixir.free-electrons.com/linux/v4.10/source/fs/exec.c#L1512
/*
* Fill the binprm structure from the inode.
* Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
*
* This may be called multiple times for binary chains (scripts for example).
*/
int prepare_binprm(struct linux_binprm *bprm)
{
int retval;
bprm_fill_uid(bprm);
/* fill in binprm security blob */
retval = security_bprm_set_creds(bprm);
if (retval)
return retval;
bprm->cred_prepared = 1;
...
static void bprm_fill_uid(struct linux_binprm *bprm)
{
/* Be careful if suid/sgid is set */
inode_lock(inode);
/* reload atomically mode/uid/gid now that lock held */
mode = inode->i_mode;
uid = inode->i_uid;
gid = inode->i_gid;
...
关于linux - 从具有 CAP_SYS_ADMIN 和 CAP_IPC_LOCK 功能的 bash 脚本启动 perf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981547/
使用以下方法记录了一些统计数据: perf record -a -F 20 -o perf.data -e major-faults sleep 1800 并获得 perf.data ~ 1GiB,样
我在 ARM 板上的旧版本内核上运行 perf record。内核版本为3.18.21-rt19 板子上的perf版本同样是perf version 3.18.21。 虽然我可以在此性能上记录和使用报
与 perf (the Linux profiler) , (v4.15.18),我可以运行 perf stat $COMMAND 来获取命令的一些简单统计信息。如果我运行 perf record,它
尝试使用性能分析器。我已经安装了 linux 通用工具,但没有成功。这是我收到的消息: r@r-K55A:~$ perf WARNING: perf not found for kernel 3.16
perf stat -e 许多不同的事件通常会返回这样的输出 127.352.815.472 r53003c
假设我有一个线束二进制文件,它可以根据命令行选项产生不同的基准。我对采样这些基准非常感兴趣。 我有3个选择: 更改线束二进制文件以生成一个“性能记录”子进程,该子进程运行基准测试并进行采样 只需执行“
当我想使用 Linux 工具套件中的 perf-stat 和 perf-report 生成性能报告时 perf ,我跑: $ perf record -o my.perf.data myCmd $ p
我试图解释 perf-stat 在程序上运行的结果。我知道它是用 -r 30 和 -x 运行的。来自 https://perf.wiki.kernel.org/index.php/Tutorial是说
我使用 perf sched record 来记录一些东西。 我从 perf sched script 得到了一些context switch 事件 filebench 2646 [000] 211
当我从谷歌下载android源码4.3时,发现$AOSP/extenal/linux-tools-perf中已经存在perf源码。但是在我为模拟器编译项目之后,我没有在 system/bin 中找到'
我正在研究使用 Protractor 进行工具性能测试。我遇到了 browser-perf 和 protractor-perf。 protractor-perf 基于 browser-perf。 据我
我正在运行 kernel-5.0.9-200.fc29.x86_64(以及具有相同版本号的 perf 包)。 在下面的命令中,报告的 msec task-clock 远远大于 seconds user
我正在尝试使用 TraceCompass 以进一步调查我的系统跟踪。为此,您需要 CTF 格式,并且有两种可能的方法在 Linux 中获取它,afaik: 使用 LTTng 进行跟踪并使用 CTF 格
我正在使用 perf 分析一个玩具程序(选择排序),我想知道 perf 报告输出中的迭代对应什么。它显示的地址对应于内部循环和 if 语句。我希望有人能提供帮助。另外,当我将“-b --branch-
我遵循了现有 Stackoverflow 问题/答案提供的说明 Building Perf with Babeltrace (for Perf to CTF Conversion) 使用 Babelt
我正在浏览 linux 内核源代码中的 perf 源代码,以了解如何实现用户空间探测。我在很多地方都遇到过这种情况: zalloc(sizeof(struct __event_package) * n
我很清楚 perf 总是记录一个或多个事件,并且采样可以是基于计数器或基于时间的。但是当 -e 和 -F 开关没有给出时,perf record 的默认行为是什么? perf-record 的手册页没
运行时perf它找到了我的程序的内核符号和符号,但没有找到外部模块符号。我编写了一个内核模块,我使用 insmod 加载它我怎么知道perf也找到它的符号? 我正在运行 2.6.37.6 内核(无法升
我正在尝试学习如何在运行一些用 C 编写的基于 JNI 的共享库的 java 应用程序上使用 perf 动态跟踪。该库通过路径 /opt/myapp/lib/libmyapp.so 安装,然后使用选项
我用perf脚本命令查看perf.data文件的结果,但我不是很明白每一列的含义。例如,如果我有以下结果: perf 3198 [000] 13156.201238: bus-cycles: ff
我是一名优秀的程序员,十分优秀!