我正在使用下面的代码对监视页面错误进行简单的测试,我不知道下面的一行简单代码如何使我的页面错误计数增加一倍。如果我使用
ptr[i+4096] = 'A'
Run Code Online (Sandbox Code Playgroud)
我使用 perf 工具得到了25,722 个页面错误,这是我所期望的,但是如果我使用
tmp = ptr[i+4096]
Run Code Online (Sandbox Code Playgroud)
相反,页面错误增加了一倍,达到51,322 我不知道如何解释。下面是完整的代码。谢谢!
void do_something() {
int i;
char* ptr;
char tmp;
ptr = malloc(100*1024*1024);
int j = 0;
int k = 0;
for (i = 0; i < 100*1024*1024; i+=4096) {
//ptr[i+4096] = 'A' ;
tmp = ptr[i+4096];
for (j = 0 ; j < 4096; j++)
ptr[i+j] = (char) (i & 0xff); // pagefault
}
free(ptr);
}
int main(int argc, char* argv[]) {
do_something();
return 0; …Run Code Online (Sandbox Code Playgroud) 我知道async_profiler工具很棒,我用它来分析我的生产项目。在这里我想了解perf以及如何理解它的输出。
我正在使用 perf 来采样堆栈跟踪。我使用选项运行 JVM-XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames以避免堆栈跟踪混乱。
我使用命令运行它,sudo perf record -e cycles -g -p <my_pid>以便对用户和内核堆栈跟踪进行采样并比较结果百分比。这是我得到的:
这个start_thread符号对我来说似乎很清楚。它们来自libjvm.so,我可以假设我运行 3 个工作线程来完成一些工作,这正是我在这里看到的。十六进制数字似乎是运行时编译的java代码指令地址。
问题:但是它从哪里来perf-27405.map以及为什么它出现在顶部。
我正在尝试解释程序上运行的 perf-stat 的结果。我知道它是用 -r 30 和 -x 运行的。来自https://perf.wiki.kernel.org/index.php/Tutorial说,如果使用 -r 运行,将报告 stddev,但我不确定是这些列中的哪一列,并且我很难找到使用 -x 运行时的输出信息。我收到的输出的一个例子是这样的
19987,,cache-references,0.49%,562360,100.00
256,,cache-misses,10.65%,562360,100.00
541747,,branches,0.07%,562360,100.00
7098,,branch-misses,0.78%,562360,100.00
60,,page-faults,0.43%,560411,100.00
0.560244,,cpu-clock,0.28%,560411,100.00
0.560412,,task-clock,0.28%,560411,100.00
Run Code Online (Sandbox Code Playgroud)
我的猜测是 % 列是第一列的标准差百分比,但我不确定。
总之我的问题是这些列代表什么?哪一列是标准差?
我试图理解性能事件的含义:dTLB 加载和 dTLB 存储?
我所做的是:
\n\n1. sudo rm -rf /root/.debug/\n2. compile program with -g -O2 -fno-omit-frame-pointer\n3. run the program and get the pid\n4. sudo perf record -F 2000 -a -s -g -p $pid sleep 15\n5. sudo perf report\nRun Code Online (Sandbox Code Playgroud)\n\n然后我得到一小部分“未知”,就像
\n\n- 2.50% 0.00% postgres [unknown] [k] 0000000000000000 \n - 0 \n 1.12% _int_malloc \xe2\x96\x92\n 0.79% _IO_vsnprintf\nRun Code Online (Sandbox Code Playgroud)\n\n看起来这是由于 libc \'malloc\' 调用造成的。然后我在同一台机器上编写一个程序来测试它。
\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <string.h>\n#include <sys/types.h>\n\nint main(int argc, char *argv[])\n{\n while(1) {\n printf("perf record -g -p %d …Run Code Online (Sandbox Code Playgroud) 我很清楚,perf总是记录一个或多个事件,并且采样可以是基于计数器的或基于时间的。但是,当未给出-e和-F开关时, 的默认行为是什么perf record?的联机帮助页perf-record没有告诉您它在这种情况下的作用。
我正在针对特定应用程序运行 C++ 基准测试。在此测试中,我在关键部分之前打开性能计数器文件(__NR_perf_event_open syscall),继续该部分,然后在读取指定的指标(指令、周期、分支、缓存未命中等)之后。
我验证了这需要在 sudo 下运行,因为该进程需要 CAP_PERFCOUNT 功能。我还必须验证它是否/proc/sys/kernel/perf_event_paranoid设置为大于 2 的数字,对于带有内核 5.11.0 的 Ubuntu 20.04.3 似乎总是如此,这是我在测试中标准化的操作系统。
此设置适用于我所有的本地计算机。然而,在云中,它仅适用于某些实例,例如 m5zn.6xlarge(Intel Xeon Platinum 8252C)。它不适用于 t3.medium、c3.4xlarge、c5a.8xlarge 等其他版本。
所有这些上的 AMI 都是相同的 ami-09e67e426f25ce0d7。
验证此行为的一种简单方法是运行以下命令:
sudo perf stat /bin/sleep 1
Run Code Online (Sandbox Code Playgroud)
在 m5zn 盒子上我会看到:
Performance counter stats for '/bin/sleep 1':
0.54 msec task-clock # 0.001 CPUs utiliz
1 context-switches # 0.002 M/sec
1 cpu-migrations # 0.002 M/sec
75 page-faults # 0.139 M/sec
2191485 cycles # 4.070 GHz
1292564 instructions # 0.59 insn per cyc
258373 branches …Run Code Online (Sandbox Code Playgroud) 我正在将perf stat用于某些目的,为了更好地理解该工具的工作原理,我编写了一个程序,将文件的内容复制到另一个文件中.我在一个750MB的文件上运行该程序,统计数据如下
31691336329 L1-dcache-loads
44227451 L1-dcache-load-misses
15596746809 L1-dcache-stores
20575093 L1-dcache-store-misses
26542169 cache-references
13410669 cache-misses
36859313200 cycles
75952288765 instructions
26542163 cache-references
Run Code Online (Sandbox Code Playgroud)
每个数字的单位是多少.我的意思是 .是比特/字节/或其他东西.提前致谢.
我正在使用read()in 阅读不同大小的文件(1KB - 1GB)C.但每次我检查page-faults使用时perf-stat,它总是给我相同(几乎)的值.
我的机器:( 虚拟机上的fedora 18,RAM - 1GB,磁盘空间 - 20 GB)
uname -a
Linux localhost.localdomain 3.10.13-101.fc18.x86_64 #1 SMP Fri Sep 27 20:22:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
mount | grep "^/dev"
/dev/mapper/fedora-root on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
Run Code Online (Sandbox Code Playgroud)
我的代码:
10 #define BLOCK_SIZE 1024
. . .
19 char text[BLOCK_SIZE];
21 int total_bytes_read=0;
. . .
81 while((bytes_read=read(d_ifp,text,BLOCK_SIZE))>0)
82 {
83 write(d_ofp, text, bytes_read); // writing …Run Code Online (Sandbox Code Playgroud) 我的教授请我跑步:
perf stat -e mem-loads,mem-stores ./test
Run Code Online (Sandbox Code Playgroud)
为了让我找到内存加载并存储了一个C文件。我是在VirtualBox Linux guest虚拟机中执行此操作的,问题是perf表示这是无效或不受支持的事件,有人可以建议我在这里做错什么吗?
invalid or unsupported event: 'mem-loads,'
Run 'perf list' for a list of valid events
Usage: perf stat [<options>] [<command>]
-e, --event <event> event selector. use 'perf list' to list available events
Run Code Online (Sandbox Code Playgroud)
在VirtualBox guest虚拟机中是否可以使用perf硬件事件?
perf ×10
linux ×6
c ×2
page-fault ×2
amazon-ec2 ×1
cpu-cache ×1
intel ×1
intel-pmu ×1
java ×1
jvm ×1
linux-kernel ×1
tlb ×1
virtualbox ×1