我正在比较一些系统调用,我从/向内存读/写.是否有任何API定义来测量页面错误(页面输入/输出)C?
我找到了这个库 libperfstat.a,但它是为了AIX,我找不到任何关于linux的东西.
编辑:
我知道linux中的time&perf-stat命令,只是探索我是否可以在C程序中使用.
我正在尝试优化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) 8.014196 task-clock # 0.004 CPUs utilized
204 context-switches # 0.025 M/sec
32 cpu-migrations # 0.004 M/sec
0 page-faults # 0.000 K/sec
11,841,196 cycles # 1.478 GHz [46.17%]
9,982,788 stalled-cycles-frontend # 84.31% frontend cycles idle [80.26%]
8,122,708 stalled-cycles-backend # 68.60% backend cycles idle
5,462,302 instructions # 0.46 insns per cycle
# 1.83 stalled cycles per insn
1,098,309 branches # 137.045 M/sec
94,430 branch-misses # 8.60% of all branches [77.23%]
Run Code Online (Sandbox Code Playgroud)
周期注释中的1.478 GHz和[46.17%]是什么意思?
我正在尝试使用 TraceCompass 来进一步调查我的系统跟踪。为此,您需要 CTF 格式,在 Linux 中有两种可能的方法来获取它,据我所知:
我一直在尝试使用第二个选项,因为第一个选项需要安装跟踪点,而我从 perf 获得的内容对我来说已经足够了。所以假设我有我的 perf.data 可用,
perf data convert --to-ctf=./ctf
Run Code Online (Sandbox Code Playgroud)
结果是: 没有编译版本支持。 深入研究lwn的在线资源,我发现如果没有babeltrace,这种转换是不可用的。为了安装 babeltrace 我尝试了以下方法:
第一个:
sudo apt-get install libbabeltrace-ctf-dev libbabeltrace-ctf1 libbabeltrace1 libbabeltrace-dev python3-babeltrace
Run Code Online (Sandbox Code Playgroud)
这并没有完全解决以下问题:没有编译版本支持。
第二个
我尝试过从源代码构建 babeltrace。我事先挖掘并找到了它的所有依赖项:
sudo apt-get install dh-autoreconf bison libdw-dev libelf-dev flex uuid-dev libpopt-dev
git clone git://git.efficios.com/babeltrace.git
cd babeltrace
./bootstrap
sudo ./configure --prefix=/opt/libbabeltrace LDFLAGS=-L/usr/local/lib
sudo make -j4 prefix=/opt/libbabeltrace
sudo make install prefix=/opt/libbabeltrace
Run Code Online (Sandbox Code Playgroud)
然后尝试了,
LD_LIBRARY_PATH=/opt/libbabeltrace/lib perf data convert …Run Code Online (Sandbox Code Playgroud) 当我使用 perf 收集系统统计信息时,像这样
sudo perf record -a -g -F 997 -p pid sleep 30
Run Code Online (Sandbox Code Playgroud)
然后我得到了
Error:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid:
-1 - Not paranoid at all
0 - Disallow raw tracepoint access for unpriv
1 - Disallow cpu events for unpriv
2 - Disallow kernel profiling for unpriv
Run Code Online (Sandbox Code Playgroud)
我无权修改/proc/sys/kernel/perf_event_paranoid,即使在root. 我尝试添加"kernal.perf_event_paranoid=-1"到/etc/sysctl.conf,并使用
sysctl -p
Run Code Online (Sandbox Code Playgroud)
重新加载参数。我再次无权加载参数 kernal.perf_event_paranoid。
如何使用 perf 收集统计信息?
当我运行时,perf list我看到一堆Hardware Cache Events,如下所示:
$ perf list | grep 'cache event'
L1-dcache-load-misses [Hardware cache event]
L1-dcache-loads [Hardware cache event]
L1-dcache-stores [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
LLC-load-misses [Hardware cache event]
LLC-loads [Hardware cache event]
LLC-store-misses [Hardware cache event]
LLC-stores [Hardware cache event]
branch-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-loads [Hardware cache event]
dTLB-store-misses [Hardware cache event]
dTLB-stores [Hardware cache event]
iTLB-load-misses [Hardware cache event]
iTLB-loads [Hardware cache event]
node-load-misses …Run Code Online (Sandbox Code Playgroud) 当我perf record在我的代码上使用 时,我找到了三个--call-graph选项:(lbr最后一个分支记录)dwarf和fp.
这些有什么区别?
Mac OS 上有等效的性能统计吗?我想对 CLI 命令做同样的事情,但谷歌搜索没有产生任何结果。
我正在尝试了解 myApp 非常忙的事情(90% cpu 单线程)。这是一个我不应该重新启动的服务器。我收集了样本
\nperf record -p 5068 -F 99 --call-graph dwarf sleep 10\nRun Code Online (Sandbox Code Playgroud)\n并perf report给了我这个:
+ 100.00% 0.00% myApp [unknown] [.] 0xffffffffffffffff \xe2\x97\x86\n+ 80.67% 0.67% myApp myApp [.] pipeline_run \xe2\x96\x92\n+ 67.71% 0.00% myApp myApp [.] QueryProcessor::process\nRun Code Online (Sandbox Code Playgroud)\n我花了一些时间谷歌搜索和阅读文档,我怀疑 0xffffffffffffffff 无法解析,因为perf不知道堆栈底部在哪里,因为它没有启动该过程。但有人可以证实这一点或指出我正确的方向吗?
从这里的一个很好的答案来看,我的理解是perf每次事件计数器超过阈值时都会进行采样。当要求以特定频率采样时,它会尝试通过调整每次事件速率的估计来设置事件计数器阈值,以便在指定间隔发生溢出。
我问自己这如何与多个线程一起工作,例如使用默认的“cycles”事件。
\n我希望能够解释像这些 \xe2\x80\x93 这样的模式,显然事件的发生率正在重新校准,但我不清楚为什么:
\ntid timestamp event counter\n5881 187296.210979: 15736902 cycles:\n5881 187296.215945: 15664720 cycles:\n5881 187296.221356: 15586918 cycles:\n5881 187296.227022: 1 cycles:\n5881 187296.227032: 1 cycles:\n5881 187296.227037: 62 cycles:\n5881 187296.227043: 6902 cycles:\n5881 187296.227048: 822728 cycles:\n5881 187296.231842: 90947120 cycles:\nRun Code Online (Sandbox Code Playgroud)\n我希望它计算每个样本的下一个计数器阈值,因此在 处的样本之后187296.215945,它会将下一个样本设置为在15586918循环后发生,对吗?187296.221356但当200Hz的目标频率之前已经稳定时,将阈值设置为1个周期之后是没有意义的。这是来自另一个线程的干扰吗?
perf ×10
linux ×6
performance ×3
c ×2
intel-pmu ×2
linux-kernel ×2
profiling ×2
babeltrace ×1
macos ×1
optimization ×1
page-fault ×1
permissions ×1
trace ×1
x86 ×1
x86-64 ×1