标签: perf

从交流程序测量页面错误

我正在比较一些系统调用,我从/向内存读/写.是否有任何API定义来测量页面错误(页面输入/输出)C

我找到了这个库 libperfstat.a,但它是为了AIX,我找不到任何关于linux的东西.

编辑: 我知道linux中的time&perf-stat命令,只是探索我是否可以在C程序中使用.

c linux page-fault perf

8
推荐指数
2
解决办法
3821
查看次数

node_s/v8 flamegraph中使用perf_events的未知事件

我尝试做使用Linux作为perf_events由布伦丹·格雷格描述的一些分析的NodeJS 这里.

工作流程如下:

  1. 运行节点> 0.11.13 with --perf-basic-prof,这将创建/tmp/perf-(PID).map写入JavaScript符号映射的文件.
  2. 使用捕获堆栈 perf record -F 99 -p `pgrep -n node` -g -- sleep 30
  3. 使用存储库中的stackcollapse-perf.pl脚本折叠堆栈
  4. 使用flamegraph.pl脚本生成svg火焰图

我得到以下结果(开头看起来非常好): 在此输入图像描述

问题是有很多[unknown]元素,我认为应该是我的nodejs函数调用.我假设整个过程在第3点失败,其中perf数据应该使用由node/v8生成的映射来折叠--perf-basic-prof./tmp/perf-PID.map在节点执行期间创建文件并将一些映射写入其中.

如何解决这个问题呢?

我使用的是CentOS 6.5 x64,并且已经尝试使用节点0.11.13,0.11.14(预建和编译),但没有成功.

performance profiling v8 node.js perf

8
推荐指数
2
解决办法
3414
查看次数

是否可以在 C++ 代码中使用 Linux Perf 分析器?

我想测量我的 C++ 代码某些部分的 L1、L2 和 L3 缓存命中/未命中率。我对在我的整个应用程序中使用 Perf 不感兴趣。Perf 可以用作 C++ 中的库吗?

int main() {
    ...
    ...
    start_profiling()
    // The part I'm interested in
    ...
    end_profiling()
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

我给了英特尔 PCM 一个机会,但我遇到了两个问题。首先,它给了我一些奇怪的数字。其次,它不支持 L1 缓存分析。

如果 Perf 无法实现,那么获取该信息的最简单方法是什么?

c++ linux performancecounter cpu-cache perf

8
推荐指数
1
解决办法
2296
查看次数

perf脚本输出是什么意思?

我使用perf脚本命令来查看perf.data文件的结果,但我真的不明白每个列的含义.例如,如果我有以下结果:

perf  3198 [000] 13156.201238: bus-cycles:  ffffffff81086e90 resched_task

perf  3198 [000] 13156.201267: instructions:  ffffffff811868e9 do_vfs_ioctl
Run Code Online (Sandbox Code Playgroud)

什么是价值观3198,[000],13156.201238指的是?

performancecounter perf

8
推荐指数
1
解决办法
1545
查看次数

如何在Docker容器中的linux perf工具中获得调试符号?

我正在使用基于"ubuntu"标签的Docker容器,并且无法获得linux perf工具来显示调试符号.

这是我正在做的来证明这个问题.

首先,我启动一个容器,这里有一个交互式shell.

$ docker run -t -i ubuntu:14.04 /bin/bash
Run Code Online (Sandbox Code Playgroud)

然后从容器提示我安装linux perf工具.

$ apt-get update
$ apt-get install -y linux-tools-common linux-tools-generic linux-tools-`uname -r`
Run Code Online (Sandbox Code Playgroud)

我现在可以使用该perf工具了.我的内核是3.16.0-77-generic.

现在我将安装gcc,编译测试程序,并尝试在其下运行它perf record.

$ apt-get install -y gcc
Run Code Online (Sandbox Code Playgroud)

我将测试程序粘贴到test.c:

#include <stdio.h>

int function(int i) {
    int j;
    for(j = 2; j <= i / 2; j++) {
        if (i % j == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    int i; …
Run Code Online (Sandbox Code Playgroud)

linux linux-kernel perf docker

8
推荐指数
2
解决办法
6075
查看次数

什么是确定英特尔Kaby Lake架构上最后一级缓存未命中数的确切代码

我读了一篇有趣的论文,名为"对最后一级缓存的高分辨率侧通道攻击",并希望找到我自己机器的索引哈希函数 - 即Intel Core i7-7500U(Kaby Lake架构) - 遵循这项工作的线索.

为了对散列函数进行逆向工程,本文提到了第一步:

 for (n=16; ; n++) 
 {
   // ignore any miss on first run
   for (fill=0; !fill; fill++) 
   {
     // set pmc to count LLC miss
     reset_pmc();
     for (a=0; a<n; a++)
       // set_count*line_size=2^19
       load(a*2^19);
   }

   // get the LLC miss count
   if (read_pmc()>0) 
   {
     min = n;
     break;
   }
 }
Run Code Online (Sandbox Code Playgroud)

我如何编写代码reset_pmc(),并read_pmc()在C++?从我到目前为止在线阅读的所有内容来看,我认为它需要内联汇编代码,但我不知道用什么指令来获取LLC未命中数.如果有人可以为这两个步骤指定代码,我将不得不承担责任.

我在VMware工作站上运行Ubuntu 16.04.1(64位).

PS:我发现这些记载LONGEST_LAT_CACHE.REFERENCESLONGEST_LAT_CACHE.MISSES在第18的的3B卷英特尔架构软件开发手册,但我不知道如何使用它们.

c++ x86 caching reverse-engineering perf

8
推荐指数
1
解决办法
575
查看次数

混淆简单C程序的缓存行为

我正在尝试一个程序,看看它的缓存行为是否与我的概念理解一致.

为此,我使用Perf命令:

perf stat -e cache-misses ./a.out
Run Code Online (Sandbox Code Playgroud)

记录以下简单C程序的缓存缺失率:

int main() {
    int N = 10000;
    double *arr = malloc(sizeof(double) * N * N);

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++){
            arr[i * N + j] = 10.0;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的缓存缺失率为50.212%.如果我更改数组访问模式如下:

arr[j * N + i]
Run Code Online (Sandbox Code Playgroud)

我得到缓存缺失率为22.206%.

这些结果令我感到惊讶.

  1. 对于具有非常规则的内存访问模式的这种简单程序,高速缓存未命中率为50.212%似乎非常高.我希望这更接近1 /(num-words-per-cache-line),肯定大于1/2.为什么缓存未命中率如此之高?
  2. 我对内存的理解(有限)表明以列主顺序迭代数组会导致更糟糕的缓存行为,但我得到的结果表明相反.这是怎么回事?

c memory performance caching perf

8
推荐指数
1
解决办法
161
查看次数

每个mmap/access/munmap有两个TLB-miss

for (int i = 0; i < 100000; ++i) {
    int *page = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
                            MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);

    page[0] = 0;

    munmap(page, PAGE_SIZE);
}
Run Code Online (Sandbox Code Playgroud)

我期望在用户空间中获得~100000 dTLB-store-miss,每次迭代一次(同样~100000页错误和内核的dTLB-load-miss).运行以下命令,结果大约是我期望的2倍.如果有人能澄清为什么会这样,我将不胜感激:

perf stat -e dTLB-store-misses:u ./test
Performance counter stats for './test':

           200,114      dTLB-store-misses

       0.213379649 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)

PS我已经验证并确定生成的代码没有引入任何可以证明这个结果的东西.此外,我确实得到~100000页错误和dTLB加载未命中:k.

c performance performancecounter tlb perf

8
推荐指数
1
解决办法
266
查看次数

如何减少花在一条指令上的时间?

我正在尝试优化C语言中的代码,似乎一条指令占用了大约22%的时间。

该代码是使用gcc 8.2.0编译的。标志是-O3 -DNDEBUG -g-Wall -Wextra -Weffc++ -pthread -lrt

    509529.517218      task-clock (msec)         #    0.999 CPUs utilized
            6,234      context-switches          #    0.012 K/sec
               10      cpu-migrations            #    0.000 K/sec
        1,305,885      page-faults               #    0.003 M/sec
1,985,640,853,831      cycles                    #    3.897 GHz                      (30.76%)
1,897,574,410,921      instructions              #    0.96  insn per cycle           (38.46%)
  229,365,727,020      branches                  #  450.152 M/sec                    (38.46%)
   13,027,677,754      branch-misses             #    5.68% of all branches          (38.46%)
  604,340,619,317      L1-dcache-loads           # 1186.076 M/sec                    (38.46%)
   47,749,307,910      L1-dcache-load-misses     #    7.90% of all L1-dcache hits    (38.47%)
   19,724,956,845      LLC-loads …
Run Code Online (Sandbox Code Playgroud)

c optimization x86-64 perf

8
推荐指数
1
解决办法
185
查看次数

如何在 WSL2 上使用 Linux perf 工具?如何获得正确内核的性能?

我正在尝试在使用 Windows10 机器的 WSL2 上使用 Linux 的 perf 工具。我已经在这里完成了已接受答案的每一步:Is there any method to run perf under WSL?

当我运行“make”评论时,我收到警告:

警告:“tools/include/uapi/linux/stat.h”处的内核 ABI 标头与“include/uapi/linux/stat.h”处的最新版本不同

但仍创建了 perf 可执行文件。但是,当我尝试像这样使用 perf 时:

sudo perf record -g myexe myargs
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

警告:未找到内核 5.10.16.3-microsoft 的性能

您可能需要为此特定内核安装以下软件包: linux-tools-5.10.16.3-microsoft-standard-WSL2 linux-cloud-tools-5.10.16.3-microsoft-standard-WSL2

然后我尝试运行这个:

sudo apt install linux-tools-5.10.16.3-microsoft-standard-WSL2
Run Code Online (Sandbox Code Playgroud)

但这也不起作用,我得到了这个:

正在读取软件包列表...已完成构建依赖关系树正在读取状态信息...已完成 E: 无法找到软件包 linux-tools-5.10.16.3-microsoft-standard-WSL2 E: 无法通过 glob 'linux-tools 找到任何软件包-5.10.16.3-微软标准-WSL2'

我现在应该怎么做?

linux windows linux-kernel perf windows-subsystem-for-linux

8
推荐指数
0
解决办法
5333
查看次数