我perf record -g在 x86-64 Linux 上使用来分析程序。libc 或 libstdc++ 中的几个符号0作为父符号:例如__GI___strcmp_ssse3(libc) 和strcmp@plt(libstdc++)。(我实际上可以在调试器中打破这些符号并获得回溯。)
我很想知道这些函数的主要调用者是什么,以及为什么没有记录它们。这是因为 libc 和 libstdc++ 在 x86_64 上没有帧指针吗?而且,更实际的是,有没有办法解决这个问题?
我刚刚检查了我的,dmesg 因为我的服务器时不时地开始崩溃。在那里我读到以下行:
perf interrupt took too long (2528 > 2500), lowering kernel.perf_event_max_sample_rate to 50000
Run Code Online (Sandbox Code Playgroud)
这出现了几次。
我记得 perf 是一个性能分析工具,但不记得安装了它。所以我检查了:
~$ dpkg -l *perf*
dpkg-query: no packages found matching *perf*
Run Code Online (Sandbox Code Playgroud)
我的问题:
rcu_sched detected stalls我想使用该perf实用程序为我的程序收集测量值。它在带有 Debian 9 的共享集群机器上运行,默认情况下 /proc/sys/kernel/perf_event_paranoid设置为 3,因此不允许我收集测量值。在更改它之前,我想知道这意味着什么。
是否只是安全性允许其他用户分析由其他用途运行的内容并因此获得洞察力?我们不关心这个,因为无论如何它都是用户的内部圈子。或者也许是性能,这也会影响其他人?
我想对我的应用程序进行基准测试。到目前为止,我使用的是 gnu time,但 perf 会产生更好的统计数据。
原则上,我想走专门的性能用户的路线,而不是允许所有用户进行一些与安全相关的事情,不是因为我意识到特定的危险,而是因为我不了解安全含义。因此,我想避免降低本问题中讨论的 perf 的偏执设置。
阅读kernel.org 上关于 perf-security 的内容(请注意,该文档似乎暗示这应该适用于 Linux 5.9 或更高版本),我这样做了:
# addgroup perf_users
# adduser perfer
# addgroup perfer perf_users
# cd /usr/bin
# chgrp perf_users perf
# chmod o-rwx perf
# setcap "cap_perfmon,cap_sys_ptrace,cap_syslog=ep" perf
# setcap -v "cap_perfmon,cap_sys_ptrace,cap_syslog=ep" perf
Run Code Online (Sandbox Code Playgroud)
返回perf: ok.
# getcap perf返回
perf cap_sys_ptrace,cap_syslog,cap_perfmon=ep。
这与他们获得的链接不同
perf = cap_sys_ptrace,cap_syslog,cap_perfmon+ep
我的Linux是5.10.0-5-amd64 #1 SMP Debian 5.10.24-1
如果我现在perf与用户一起运行perfer,我仍然收到错误消息
Error:
Access to performance monitoring …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 perf 在 Linux 虚拟机中进行分析。但是,我收到以下输出:
[vagrant@localhost ~]$ perf stat -d ls /
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr vagrant var
Performance counter stats for 'ls /':
1.063002 task-clock (msec) # 0.408 CPUs utilized
13 context-switches # 0.012 M/sec
0 cpu-migrations # 0.000 K/sec
101 page-faults # 0.095 M/sec
<not supported> cycles
<not supported> instructions
<not supported> branches
<not supported> branch-misses
<not supported> L1-dcache-loads
<not supported> L1-dcache-load-misses
<not …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在 perf 上启用上下文切换事件,并使用 perf 脚本的 perf.data 转储来调查线程阻塞时间。
到目前为止,唯一两个似乎有用的记录选项是上下文切换和所有计划事件。
这是我在 perf 上运行的命令:
perf record -g -a -F 999 -e cpu-clock,sched:sched_stat_sleep,sched:sched_switch,sched:sched_process_exit,context-switches
Run Code Online (Sandbox Code Playgroud)
然而,两者似乎都不完整,通常 sched_switch 事件看起来像这样:
comm1 0/0 [000] 0.0: 1 sched:sched_switch: prev_comm=comm1 prev_pid=0 prev_prio=0 prev_state=S ==> next_comm=comm2 next_pid=1 next_prio=1
stacktrace...
Run Code Online (Sandbox Code Playgroud)
根据我的理解,prev_comm始终是要被阻塞的线程,而next_comm是要被解除阻塞的线程。这是一个正确的假设吗?如果是,我似乎无法获得有关事件的完整数据,因为有许多线程在 prev_comm 上被阻止,但似乎从未获得相应的 next_comm。
启用上下文切换似乎没有多大作用,因为没有有关线程被阻塞或解除阻塞的信息(除非我完全遗漏了一些东西,我希望能解释它们如何工作)。
典型的上下文切换事件如下所示:
comm1 0/0 [000] 0.0: 1 context-switch:
stacktrace...
Run Code Online (Sandbox Code Playgroud)
tl;dr,如何通过 perf 脚本的输出在 Linux 上进行阻塞时间调查以及需要在 perf 记录上启用哪些选项?
谢谢。
我发现perf top -e cache-misses:pp -p <my_pid>相当混乱的行为。我拥有一个 Intel i5-3230M,运行内核 4.4.5 64 位。
如果我只运行该命令,我的应用程序中基本上没有样本(具有大型数据集的数值模拟,因此肯定必须显示缓存未命中),但几乎仅从一些内核函数中获取,例如intel_pmu_lbr_enable_all, native_write_msr_safe, native_read_msr_safe, __intel_pmu_lbr_disable。如果我使用 将点击次数限制在用户空间-K,我只会在我的应用程序中获得点击次数,但数量非常少。如果我删除一个“精确” ( p) 修饰符,我会得到更多的命中,但是来自显然不会导致内存加载/写入的操作码。
我应该如何解释这种行为?究竟什么算作“缓存未命中”?
我经常使用 perf 来分析我的应用程序。最近我得到了几台新机器,每台机器有~750G RAM。我正在尝试分析一个进程,该进程在其中一个进程上使用了大约 400G 的内存。这在所有新机器上都可以正常工作,但只有一台。它们都以相同的方式安装,运行 ubuntu。
我尝试perf通过安装apt-get并从 git编译我自己的。
跑步时,./perf top -p 14182我有一段时间设法获得结果(经过漫长的等待,而且很少见),但大多数时候我得到:
The sys_perf_event_open() syscall returned with 3 (No such process) for event (cycles:pp).
/bin/dmesg may provide additional information.
No CONFIG_PERF_EVENTS=y kernel support configured?
Run Code Online (Sandbox Code Playgroud)
对于相同的 pid(!)。
我在尝试录制时遇到类似的问题,例如:
time ./perf record -F 111 -a -g -p 14182 -- sleep 3
Warning:
PID/TID switch overriding SYSTEMsleep: Terminated
Command exited with non-zero status 255
2.66user 91.58system 1:36.68elapsed 97%CPU (0avgtext+0avgdata 4896maxresident)k
0inputs+5248outputs (0major+4847minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)
这个命令需要的时间超过 …
有一个方便的 Linux 内核 makefile 目标“make deb-pkg”来将内核、模块、头文件构建为 .deb。然后我可以通过 dpkg 命令安装/删除。
但是,对于 perf 编译,只有构建源包选项。我想知道是否有办法将 perf 也构建为 installable.deb ?
我很想知道一段时间内 KVM vm 中的两个进程在单个 CPU 上的上下文切换次数。
我之前使用过perf,这是最佳实践吗?
每个 CPU 的上下文切换使用了多少时间?
该perf命令使用什么流!?我一直试图用它来捕捉它
(perf stat -x, -ecache-misses ./a.out>/dev/null) 2> results
Run Code Online (Sandbox Code Playgroud)
遵循/sf/ask/926302261/,但无济于事。为什么我不能捕获输入......就像让一些鱼逃跑一样!
我最近在我的平台上安装了 Perf 工具,并想用它来分析我的平台。
我开始分析一个独立的应用程序。下面是我使用的命令:
perf start ./helloworld
Performance counter stats for './helloworld':
4.555957 task-clock # 0.000 CPUs utilized
1 context-switches # 0.219 K/sec
0 cpu-migrations # 0.000 K/sec
124 page-faults # 0.027 M/sec
<not supported> cycles
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
<not supported> instructions
<not supported> branches
<not supported> branch-misses
60.005519331 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
现在我不确定我应该如何解释这个输出。它是否如预期的那样?
另外,我应该<not supported>在这里制作什么字段,在运行命令之前我需要启用什么来支持这个字段?
我想perf在 Renesas 目标上使用,我配置了 yocto“local.conf”,如本链接所示。
#avoid stripping binaries
INHIBIT_PACKAGE_STRIP = "1"
#add the debug information
EXTRA_IMAGE_FEATURES= "debug-tweaks tools-debug dbg-pkgs tools-profile"
#format the debug info into a readable format for PERF
PACKAGE_DEBUG_SPLIT_STYLE = 'debug-file-directory'
Run Code Online (Sandbox Code Playgroud)
perf正在工作,但我需要监视需要使用的上下文切换perf timechart以及依赖于性能事件的其他命令,但这些命令找不到此路径 "/sys/kernel/debug/tracing/events" 。
我应该怎么做才能用我的内核编译这个文件夹及其文件?
perf ×13
linux ×3
profiling ×3
ubuntu ×3
kernel ×2
linux-kernel ×2
perf-event ×2
cache ×1
console ×1
debian ×1
debugging ×1
embedded ×1
glibc ×1
intel ×1
kernel-panic ×1
kvm ×1
make ×1
output ×1
proc ×1
scheduling ×1
thread ×1
virtualbox ×1
yocto ×1