标签: perf

从大型分配数组读取而不是仅仅存储时,页面错误数量是原来的两倍?

我正在使用下面的代码对监视页面错误进行简单的测试,我不知道下面的一行简单代码如何使我的页面错误计数增加一倍。如果我使用

 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)

linux page-fault perf

4
推荐指数
1
解决办法
256
查看次数

了解 perf.map

我知道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以及为什么它出现在顶部。

java linux jvm perf

4
推荐指数
1
解决办法
3760
查看次数

使用 -r 和 -x 运行时 perf-stat 中的列是什么

我正在尝试解释程序上运行的 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)

我的猜测是 % 列是第一列的标准差百分比,但我不确定。

总之我的问题是这些列代表什么?哪一列是标准差?

perf

4
推荐指数
1
解决办法
330
查看次数

Perf 事件:dTLB 加载和 dTLB 存储的含义是什么?

我试图理解性能事件的含义:dTLB 加载和 dTLB 存储?

intel tlb perf amd-processor

4
推荐指数
2
解决办法
3349
查看次数

如何摆脱性能中的“未知”部分

我所做的是:

\n\n
1. 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\n
Run 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\n
Run 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)

c linux perf

4
推荐指数
1
解决办法
6633
查看次数

perf record 的默认行为是什么?

我很清楚,perf总是记录一个或多个事件,并且采样可以是基于计数器的或基于时间的。但是,当未给出-e-F开关时, 的默认行为是什么perf record?的联机帮助页perf-record没有告诉您它在这种情况下的作用。

linux perf

4
推荐指数
1
解决办法
1616
查看次数

PMU x86-64 性能计数器未显示在 AWS 下的性能中

我正在针对特定应用程序运行 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)

amazon-ec2 linux-kernel amazon-web-services perf intel-pmu

4
推荐指数
1
解决办法
1712
查看次数

perf stat统计的单位

我正在将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)

每个数字的单位是多少.我的意思是 .是比特/字节/或其他东西.提前致谢.

cpu-architecture cpu-cache perf

3
推荐指数
1
解决办法
1209
查看次数

read()系统调用页面错误不依赖于文件大小

我正在使用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)

c linux page-fault perf

3
推荐指数
1
解决办法
1004
查看次数

在VirtualBox guest虚拟机中运行性能

我的教授请我跑步:

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硬件事件?

linux virtualbox perf

3
推荐指数
1
解决办法
815
查看次数