我正在比较一些系统调用,我从/向内存读/写.是否有任何API定义来测量页面错误(页面输入/输出)C?
我找到了这个库 libperfstat.a,但它是为了AIX,我找不到任何关于linux的东西.
编辑:
我知道linux中的time&perf-stat命令,只是探索我是否可以在C程序中使用.
我尝试做使用Linux作为perf_events由布伦丹·格雷格描述的一些分析的NodeJS 这里.
工作流程如下:
--perf-basic-prof,这将创建/tmp/perf-(PID).map写入JavaScript符号映射的文件.perf record -F 99 -p `pgrep -n node` -g -- sleep 30stackcollapse-perf.pl脚本折叠堆栈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(预建和编译),但没有成功.
我想测量我的 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 无法实现,那么获取该信息的最简单方法是什么?
我使用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指的是?
我正在使用基于"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) 我读了一篇有趣的论文,名为"对最后一级缓存的高分辨率侧通道攻击",并希望找到我自己机器的索引哈希函数 - 即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.REFERENCES并LONGEST_LAT_CACHE.MISSES在第18的的3B卷英特尔架构软件开发手册,但我不知道如何使用它们.
我正在尝试一个程序,看看它的缓存行为是否与我的概念理解一致.
为此,我使用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%.
这些结果令我感到惊讶.
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语言中的代码,似乎一条指令占用了大约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) 我正在尝试在使用 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'
我现在应该怎么做?
perf ×10
c ×4
linux ×4
performance ×3
c++ ×2
caching ×2
linux-kernel ×2
cpu-cache ×1
docker ×1
memory ×1
node.js ×1
optimization ×1
page-fault ×1
profiling ×1
tlb ×1
v8 ×1
windows ×1
windows-subsystem-for-linux ×1
x86 ×1
x86-64 ×1