Articles of 分析

-finstrument-functions不适用于dynamic加载的g ++共享对象(.so)

我正在用Ubuntu上的g ++共享对象(.so)文件testing-finstrument函数。 我发现了一个奇怪的行为,即只有库是静态链接的,函数似乎才起作用。 如果我用dlopen / dlsym等链接到库,代码的function仍然有效,但它不会调用__cyg_profile *函数。 这里有一些代码来快速重现问题: MyLib.h #ifndef __MYLIB_H__ #define __MYLIB_H__ class MyLib { public: void sayHello(); }; #endif MyLib.cpp #include "MyLib.h" #include <iostream> using namespace std; void MyLib::sayHello() { cout<<"Hello"<<endl; } MyLibStub.cpp(到.so的C接口) #include "MyLib.h" extern "C" void LoadMyLib () { MyLib().sayHello(); } Trace.cpp #include <stdio.h> #ifdef __cplusplus extern "C" { void __cyg_profile_func_enter(void […]

在程序启动时测量dynamic链接所花的时间?

我如何测量在程序启动时dynamic链接的时间? 想到的解决scheme,为什么我犹豫不决: 1)在运行程序之前和主程序开始之前打印一些时间。 这并没有考虑可能的代码,这些代码在全局variables的主要初始化和任何结果函数调用之前运行。 它不是自动出来的,它让我觉得很粗鲁,而且很可疑。 2)一个空程序的时间命令,它与被测程序具有相同的标题,并dynamic链接到相同的库。 我不确定这个。 我不知道编译器和链接器是否可以合谋缩短基于客户端代码内容的dynamic链接,但似乎是可能的。 编辑:问了6分钟后,我仔细检查了谷歌显而易见的search条件,“度量dynamic链接时间”,最终成为第一个search结果。

用很多系统呼叫等待分析networking软件/分析软件

我正在研究一个复杂的networking软件,我无法确定如何提高系统性能。 特别是在使用阻塞同步调用的软件的一部分中。 由于这部分系统正在进行繁重的计算,所以几乎不可能确定这个组件的慢度是由这些计算引起还是等待系统的其他部分。 是否有轻量级的分析器可以捕获这些信息? 我不能使用像valgrind这样的重型轮廓,因为这样会完全扭曲结果(虽然valgrind会是完美的,因为它捕获了所有必需的信息)。 我试图使用oProfile,但我只是无法得到任何有意义的结果(也许如果有一个简明的教程的地方…)。

C ++vector数组运算符的高计算成本?

我一直知道C ++的丰富抽象带有一定的计算开销,但是我一直认为,一旦正确的编译器优化被应用,这个开销就会微乎其微。 我很好奇这个开销的大小,所以我写了一个简单的testing来确定这个。 该testing是一个模板化函数,它接受一个容器variables,为容器中的每个元素赋值,然后在一个单独的循环中跨容器求和值。 该过程重复预设的循环次数。 我发现,令我非常不安的是,vector实现花费了标准数组实现的近3倍。 在通过大量的编译器优化select而没有任何成功的情况下,我决定硬着头皮直接看看汇编代码,试着看看造成时间损失的原因。 我包含了一些汇编指令,这些指令使我能够准确地确定数组索引操作发生的位置,并详细检查了代码。 我发现,在我的完全混淆中,vector实现和数组实现之间的差异是微不足道的。 汇编代码可以在这里find。 这是我用来构build二进制文件的命令: g++ -O3 vectorArrayOp.cpp -o vectorArrayOp 这是我用来构build程序集的命令: g++ -O3 -DTAGASM vectorArrayOp.cpp -S -o vectorArrayOp.s 这是我从运行二进制文件中看到的输出: gmurphy@interloper:Reference$ ./vectorArrayOp Duration 0.027678 Duration 0.090212 当您在stdoutstream中包含计算值时,结果将保持不变,为清晰起见,我将其删除。 我的系统规格如下(我也见过我的AMD相同的结果): Linux 3.2.0-32-generic x86_64 GNU/Linux Intel(R) Xeon(R) CPU X5550 @ 2.67GH g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 代码如下,如果有人能够提供一些见解,说明为什么当程序集如此相似时,时序是如此不同,我将不胜感激。 #include <vector> #include <iostream> #include <sys/time.h> #ifdef […]

使用C ++在Linux中计算磁盘读/写

我的要求是通过总磁盘读/写操作(或读/写数据量)来分析当前进程磁盘读/写操作。 我需要先抽取样品,并在这两者之间绘制图表。 我需要在c ++中的Linux(Ubuntu 12.10)上执行此操作。 有任何可用于此任务的API /工具吗? 我发现一个工具,即iotop但我不知道如何使用这个当前进程与系统的广泛使用。 谢谢

是否有可能在某个二进制文件中使用vtune而不是整个二进制文件?

我正在将一个小型库的使用添加到一个现有的大型软件中,并且想要分析(在查找程序中的细节,而不仅仅是在rdtsc()或gettimeofday调用中)的开销和小型库的归属。 使用诸如rdtsc()之类的东西我可以感觉到调用我的库函数的延迟,但是我不能做延迟归因,除非我也能够看到分支是否被预测得不好,caching工作不正常等。我考虑PAPI是因为我想像在一个更大的二进制文件中查看某些硬件事件进入和退出我的库的例程,但似乎我需要一个特定的内核模块来为我工作(Linux 2.6。 18 && Intel Xeon 5570)… Vtune专门针对英特尔处理器,但它好像是用来分析性能的整个二进制文件,而不是特定的代码片段(3-4个调用到我的库中)。 有没有办法让我使用Vtune来实现我的目标,或者可能让我能够访问这样的计数器,而无需修补我的内核?

我怎样才能衡量在Linux的真正的CPU使用情况?

我知道有一些像top和ps这样的测量CPU使用率的工具,但是他们测量CPU使用率的方式是测量空闲任务没有运行的时间。 因此,例如,即使CPU因高速caching未命中而失速,这些工具仍会考虑占用CPU。 不过,我想要的是,分析工具在失速期间将CPU视为空闲。 有没有什么工具可以做到这一点?

如何衡量Linux上单个分支的预测失误?

我知道在执行一个perf stat程序时,我可以得到分支错误预测的总百分比。 但是,我怎么能得到一个特定的分支统计( if或C语言switch语句)?

分析(可能是I / O绑定)进程以减less延迟

我想在一个更大的应用程序中改进特定方法的性能。 目标是提高延迟(在特定function中花费的挂钟时间),而不是(必须)系统负载。 要求: 正如我所预料的那样,由于I / O造成了很多延迟,所以要考虑等待/阻塞所花费的时间(换句话说,看看挂钟时间而不是CPU时间) 由于该程序比我想优化的片段要多得多。 需要有一种方法来以编程方式启动/停止分析,或筛选输出以仅显示进入和退出我正在优化的function之间的时间。 对方法级别进行分析是可以接受的(如果可以在指令级别上完成的话,甚至更好,如果只是对系统调用进行configuration,那可能是不够的) 这是一个爱好项目,所以昂贵的工具不是一个真正的select 仪表(-finstrument-functions)是可以接受的 我感兴趣的关键代码很难手工中断(因为它已经相对较快,很难实际地在一个循环中调用),所以需要某种自动化。 目前丢弃的工具: gprof,oprofile,callgrind(要求1) 使用getrusage构build自定义的东西(需求1) poormansprofiler.org(要求2) strace -T,dtrace, http://perf.wiki.kernel.org (要求2和3) VTune,缩放(要求4) 手动调用堆栈抽样(要求6) 谷歌perftools(应该能够测量墙的时间,但这似乎并没有在我的情况下工作,大概是因为SIGALRM的干扰。 systemtap(我的内核不打补丁包括utrace) 其他选项,我还没有进一步评估: cprof(这里不是开箱即用的,似乎只有i386) 手动插入跟踪点(例如用lttng) 我很想听听: 其他选项 也许我过早放弃了一些工具? 我还没有评估的选项是否有工作的机会,如果是的话,如何做到最好。 我终于解决了: build立自定义使用函数 – 函数我自己,基于http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/ 这个粗糙的工具产生的痕迹很难解释,我可以很容易地想象一些工具来进一步处理它的输出,使它更有用。 不过,现在这个工作已经完成了,所以我把这个项目放到了后面)。

在Linux程序中跟踪积极使用的内存

我想跟踪各种程序在特定状态下触摸多less内存。 比如说我有一个graphics程序。 当它最小化时,可能会占用更less的内存,因为它不会重新绘制窗口,这需要读取图像和字体,并执行大量的库函数。 这些对象在内存中仍然可以访问,但实际上并没有被使用。 像top这样的工具的使用是有限的,因为他们只是告诉有多less内存映射到一个程序的地址空间,多less是驻留在物理RAM中。 同样,泄漏检测器只会告诉何时内存不可访问,而不是如果它没有被使用。 有没有一种现有的工具可以跟踪积极使用/未使用的内存这种方式? 如果可能的话,我想跟踪使用不仅在堆上,而且在stored procedures/库代码的内存。 编辑:我想澄清:我想知道一个程序实际上读取,写入或执行一定的点后,即一旦它达到一定的状态很多的内存。 尽pipe地址空间中的页面数量和驻留页面的数量是重要的度量,但这并不是我正在寻找的。 我现在正在追求三种方法: 我写了一个库,它清除了使用`mprotect`从/ proc / self / maps读取的所有内存区域(除了堆栈和自己的代码)的保护位。 它有一个段故障处理程序,恢复保护位并增加一个计数器。 我用`LD_PRELOAD`加载它,并在接收到信号时开始跟踪内存访问。 这产生了一些看似虚假地址的真正故障(在故障发生时它们不存储在任何寄存器或附近的存储器中)。 我写了一个`purge`程序,它使用`mmap`分配和读取内存,直到`mmap`返回一个错误。 这有希望强制执行目标进程中的所有页面,这些页面在“purge”运行时暂停。 然后,我使用`pidstat`来计算目标进程恢复时的页面插入次数。 这似乎工作,但它是一个非常钝的工具。 它没有给出任何关于哪些页面被触摸的信息。 我已经被告知valgrind允许你编写插件,这些插件会导致某些事件被执行,比如内存访问。 这看起来很有希望。