Articles of perf

使用mmap和/ proc / mtrr访问无法访问的区域

我正在使用mmap和/ proc / mtrr来尝试对物理内存分析做一些深入的分析。 以下是我想要做的事情的基本概念以及迄今为止所做的工作的总结。 我在Ubuntu内核版本3.5.0-54-通用。 我基本上是映射到一个特定的物理地址(使用/ proc / iomem的提示),并测量这个物理地址范围的访问延迟。 这是我迄今为止所做的: 在/ proc / mtrr中创build了一个条目,使物理地址范围可以映射到不可取的地方。 使用/ dev / memconfiguration到特定的地址。 我不得不放宽安全限制,以便从/ dev / mem读取超过1 MB的数据。 虽然我能够执行这个程序没有问题,但我对这个不可兼容的部分是否真正起作用有一些怀疑。 这里是我正在使用的代码片段。 请注意,我使用了先前研究论文中的伪代码来创build此代码。 int main(int argc, char *argv[]) { int fd; // file descriptor to open /dev/mem struct timespec time1, time2; fd = open("/dev/mem", O_RDWR|O_SYNC); if (fd == -1) { printf("\n […]

不能用linux perf来取样硬件caching事件

出于某种原因,我不能采样(性能perf record )硬件caching事件: # perf record -e L1-dcache-stores -a -c 100 — sleep 5 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.607 MB perf.data (~26517 samples) ] # perf script 但我可以数它们( perf stat ): # perf stat -e L1-dcache-stores -a — sleep 5 Performance counter […]

SystemTap脚本来分析函数的caching行为

我想通过SystemTap(#cache引用,#cache未命中等)来剖析内核模块的caching行为。 在线示例脚本显示了SystemTap如何用于读取perf事件和计数器,包括与caching相关的脚本: https : //sourceware.org/systemtap/examples/profiling/perf.stp 此示例脚本默认情况下适用于进程: probe perf.hw.cache_references.process("/usr/bin/find").counter("find_insns") {} 我用modulereplace了process关键字,并用我的内核模块的名称replace了可执行文件的path: probe perf.hw.cache_references.module(MODULE_NAME).counter("find_insns") {} 我很确定,我的模块有debugging信息,但运行我得到的脚本: 语义错误:parsing探测点:在perf.stp:14:7源标识符'perf':probe perf.hw.instructions.module(MODULE_NAME).counter(“find_insns”){} 任何想法可能是错的? 编辑: 好吧,我意识到perf计数器可能会被绑定到只处理模块(这里解释: https : //sourceware.org/systemtap/man/stapprobes.3stap.html )。 所以我把它改回到: probe perf.hw.cache_references.process(PATH_TO_BINARY).counter("find_insns") {} 现在,如示例脚本所示,我有: probe module(MODULE_NAME).function(FUNC_NAME) { #save counter values on entrance … } 但现在运行它,我得到: 语义错误:perf计数器'find_insns'未定义语义错误:parsing探测点时:perf.stp:26:7处的标识符'module'source:探针模块(MODULE_NAME).function(FUNC_NAME) EDIT2: 所以这是我的完整脚本: #! /usr/bin/env stap # Usage: stap perf.stp <path-to-binary> <module-name> <function-name> global cycles_per_insn global […]

什么types的POWER8 PMU事件应该最大化?

在POWER8的CPI故障模型之后,我对在IBM POWER8服务器上运行的应用程序执行性能分析。 我知道我需要减less由于caching未命中( PM_CMPLU_STALL_DCACHE_MISS )或分支预测错误( PM_CMPLU_STALL_BRU )引起的停顿的百分比。 POWER7性能分析教程讲述了一个写得很好的应用程序具有较高的最终指令完成百分比( PM_1PLUS_PPC_CMPL )。 我是否正确理解对于POWER8,我需要最大化 PM_GRP_CMPL指标的百分比? 我应该尝试最大化哪些基于PMU的度量标准?

使用linux perf工具来每秒钟报告计数器,如vmstat

在Linux中有perf command-linux实用程序来访问硬件性能监视计数器,它使用perf_events内核子系统工作。 perf本身基本上有两种模式: perf record / perf toplogging采样configuration文件(例如,每隔10万cpu时钟周期或执行命令), perf stat模式报告应用程序的周期/执行命令总数(或为整个系统)。 是否存在打印系统范围或每CPU总计(每3秒,5秒,10秒)的perf模式,如打印在vmstat和systat-family工具( iostat , mpstat , sar -n DEV …就像http://techblog.netflix.com/2015/11/linux-performance-analysis-in-60s.html中列出的那样? 例如,对于周期和指令计数器,我将在系统(或每个CPU)的每一秒获得平均的IPC。 有没有非perf工具(在https://perf.wiki.kernel.org/index.php/Tutorial或http://www.brendangregg.com/perf.html )可以得到这样的统计与perf_events内核子系统? 那么系统范围内的每个进程IPC计算的分辨率为几秒?

用Babeltrace构buildPerf(Perf到CTF转换)

我正在尝试使用TraceCompass来进一步调查我的系统跟踪。 为此,您需要CTF格式,并且在Linux中有两种可能的方式来获取它:afaik: 使用LTTng来追踪和使用CTF格式 使用“perf数据转换”来创build来自perf.data的CTF数据 我一直在尝试使用第二个选项,因为第一个选项需要安装跟踪点,而我从perf获取的内容对我来说已经足够了。 所以假设我有我的perf.data可用,应用 perf data convert –to-ctf=./ctf 导致: 没有编译版本的支持。从lwn挖掘在线资源,我发现,这种转换不是没有babeltrace可用。 为了安装babeltrace,我尝试了以下方法: 第一个: sudo apt-get install libbabeltrace-ctf-dev libbabeltrace-ctf1 libbabeltrace1 libbabeltrace-dev python3-babeltrace 这并没有完全解决的问题: 没有版本支持编译在。 第二个 我已经尝试从源代码构buildbabeltrace。 我挖掘并预先发现了它的所有依赖关系: 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 […]

计算浮点指令

我想在我的程序中计算浮点运算的次数,我认为perf可能是我正在寻找的工具(有没有其他select?),但是我不能将它限制在某个函数/代码块。 让我们举一个例子: #include <complex> #include <cstdlib> #include <iostream> #include <type_traits> template <typename T> typename std::enable_if<std::is_floating_point<T>::value, T>::type myrand() { return static_cast <T> (std::rand()) / static_cast <T> (RAND_MAX); } template <typename T> typename std::enable_if<!std::is_floating_point<T>::value, std::complex<typename T::value_type>>::type myrand() { typedef typename T::value_type S; return std::complex<S>( static_cast <S> (std::rand()) / static_cast <S> (RAND_MAX), static_cast <S> (std::rand()) / static_cast <S> […]

perf调用图中的源行号?

我正在使用perf record -a –call-graph dwarf -p XXX sleep 1来logging一些函数调用,然后用perf report来查看这些数据,但是如果我也能看到源代码行号,每个函数调用都已经完成。 例如: – 4.18% testbinary testbinary [.] malloc – malloc – 99.57% operator new(unsigned long) + 7.28% MyFunction() 我想知道在MyFunction()中究竟是哪些new operators被调用(没有我通过查看整个函数源代码来猜测) PS:二进制是用-m64 -O2 -ggdb3编译的

用perf_events / oprofile分析Linux上JIT的输出结果?

我想使用硬件性能计数器来剖析由JIT在Linux上生成的代码。 据我所知,最常见的configuration文件是oprofile和perf 。 我如何整合JIT和oprofile / perf? 我的JIT不是已经在oprofile中支持的JAVA。 (PERF?) 比如我们可以考虑LLVM的JIT。 我要 从JIT代码中查看最热门的函数(他们的名字) 查看最热门function的反汇编,并将性能计数器统计信息分配给每条指令

性能如何与function相关联?

更确切地说,perf工具如何将PMU事件与函数联系起来,我已经意识到,当内核perf子系统logging事件计数器时,它还会logging程序计数器(PC),以便将计数与函数相关联。 但是要真正得到好的结果,你需要以很高的速率对计数器进行采样,否则你可能会把计数器与一组函数关联起来。 但是读取计数器并将采样数据(计数器,PC,调用堆栈)写入perf mmap空间是非常具有侵入性的。 我在一些消息来源读到,这种采样只发生在PMU计数器溢出时,但这可能是非常粗糙的,除非我设置计数器很快溢出 我在这里错过了什么?