相关疑难解决方法(0)

如何分析在Linux上运行的C++代码?

我有一个在Linux上运行的C++应用程序,我正在优化它.如何确定代码的哪些区域运行缓慢?

c++ unix profiling

1732
推荐指数
12
解决办法
49万
查看次数

分析Ruby代码

除了ruby-prof和核心Benchmark类之外,你用什么来分析你的Ruby代码?特别是,您如何找到代码中的瓶颈?几乎感觉我需要使用我自己的小工具才能找出在我的代码中花费的所有时间.

我意识到ruby-prof提供了这个,但输出坦率地说非常混乱,并且不容易找出你自己的代码的哪些实际块是问题的根源(它告诉你哪些方法调用占用了最多的时间)虽然).因此,我并没有像我想的那样得到更多的东西,而且还没有真正能够利用它.

也许我做错了?还有替代品吗?谷歌搜索不会为我带来任何东西.

ruby profiler profiling ruby-prof

31
推荐指数
2
解决办法
2万
查看次数

用于Python的CPU Flame图

Brendan Gregg的CPU Flame Graph是一种基于调用堆栈在一段时间内可视化CPU使用情况的方法.

他的FlameGraph github项目提供了一种与语言无关的绘制这些图形的方法:

对于每种语言,FlameGraph都需要一种以如下行的形式提供堆栈输入的方法:

grandparent_func;parent_func;func 42
Run Code Online (Sandbox Code Playgroud)

这意味着检测程序被观察到运行函数func,其中parent_func调用它从顶级函数调用grandparent_func.它说调用堆栈被观察了42次.

如何从Python程序中收集堆栈信息并将其提供给FlameGraph?

对于奖励积分:如何扩展以便显示C和Python堆栈,甚至是Linux上的内核(与Brendan网站上的某些Java和node.js火焰图类似)?

在此输入图像描述

c python performance visualization linux-kernel

28
推荐指数
1
解决办法
1929
查看次数

如何使用linux`perf`工具生成"Off-CPU"配置文件

Brendan D. Gregg(DTrace书的作者)有一个有趣的分析变体:"Off-CPU"分析(和Off-CPU Flame Graph ; 幻灯片2013,p112-137),以查看线程或应用程序被阻止的位置(是不是由CPU执行,而是等待I/O,页面故障处理程序或由于CPU资源而导致的计划外停机:

这一次揭示了哪些代码路径在CPU外被阻塞和等待,以及准确的持续时间.这与传统的分析不同,后者通常以给定的间隔对线程的活动进行采样,并且(通常)只检查线程是否在CPU上执行工作.

他还可以将Off-CPU配置文件数据和On-CPU配置文件结合在一起:http://www.brendangregg.com/FlameGraphs/hotcoldflamegraphs.html

Gregg给出的示例是使用的dtrace,这在Linux OS中通常不可用.但是有一些类似的工具(ktap,systemtap,perf)和perf我认为最广泛的安装基础.通常perf生成On-CPU配置文件(这些功能在CPU上执行得更频繁).

  • 如何将Gregg的非CPU示例翻译perf成Linux中的分析工具?

PS:来自LISA13,p124幻灯片中有关于CPU外部火焰图的systemtap变体的链接:" Yichun Zhang创建了这些,并且已经在Linux上使用SystemTap来收集专业数据.请参阅:• http:// agentzh .org/misc/slides/off-cpu-flame-graphs.pdf " "(2013年8月23日的CloudFlare啤酒会议)

linux profiling wait perf

13
推荐指数
2
解决办法
3522
查看次数

使用 perf 记录包含睡眠/阻塞时间的配置文件

我想获取我的程序的采样配置文件,其中包括阻塞时间(等待网络服务)以及 CPU 时间。

perf 的默认分析模式 ( perf record -F 99 -g -- ./binary) 对整个系统的运行时间进行采样,但没有明确说明我的程序在程序的哪些部分花费了多少时间:它偏向于 CPU 密集型部分并且不显示 IO 密集型部分。在睡眠时间分析模式与上SO节目)的睡眠时间,但没有一般的个人资料。

我想要的是一些非常简单的东西:每 10 毫秒记录一次我的程序的调用堆栈,无论它是正在运行还是当前被阻塞。然后用它制作一个火焰图

linux profiling perf

5
推荐指数
0
解决办法
1361
查看次数

如何分析 Java 中的阻塞代码 – 测量执行时间而不是 CPU 时间

我正在尝试分析经常在数据库和休息调用中阻塞的情况。该代码不受 cpu 限制。以下示例 junit 方法应该可以说明该问题:

@RepeatedTest(10)
void fast() throws InterruptedException {
    Thread.sleep(100);
}

@RepeatedTest(10)
void slow() throws InterruptedException {
    // imagine a slow database or rest call or any other blocking code
    Thread.sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 IntelliJ 和 Java Flight Recorder。我预计该方法fast将使用大约 10% 的执行时间,而该方法slow将使用大约 90% 的执行时间。但它们根本没有被报告,因为它们不占用 CPU 时间。

如何分析实际执行时间(包括阻塞代码中的等待时间而不仅仅是 CPU 时间)?

java profiling jfr

5
推荐指数
1
解决办法
871
查看次数

gprof和(unix)时间之间的差异; gprof报告较低的运行时间

我有简单的排序程序,我正在分析,以便有一个案例来研究gprof; 我后来计划分析一个更大的算法.

我编译-pg并运行./sort来生成gmon.out文件.但是,当我运行gprof ./sort gmon.out累积秒数和自秒时产生的值时,我认为不准确.

首先,跑步time(./sort)我得到:

real    0m14.352s
user    0m14.330s
sys     0m0.005s
Run Code Online (Sandbox Code Playgroud)

我的秒表准确无误.

但是,平面轮廓的gprof结果是:

Each sample counts as 0.01 seconds.
%   cumulative   self              self     total           
time   seconds   seconds    calls   s/call   s/call  name    
56.18      2.76     2.76        1     2.76     4.71  sort(std::vector<int, std::allocator<int> >&)
35.01      4.49     1.72 1870365596     0.00     0.00  std::vector<int, std::allocator<int> >::operator[](unsigned long)
8.96      4.93     0.44   100071     0.00     0.00  std::vector<int, std::allocator<int> >::size() const
0.00      4.93     0.00    50001     0.00     0.00  __gnu_cxx::new_allocator<int>::construct(int*, int const&)
0.00      4.93 …
Run Code Online (Sandbox Code Playgroud)

c++ profiler profiling g++ gprof

2
推荐指数
1
解决办法
428
查看次数

标签 统计

profiling ×6

c++ ×2

linux ×2

perf ×2

profiler ×2

c ×1

g++ ×1

gprof ×1

java ×1

jfr ×1

linux-kernel ×1

performance ×1

python ×1

ruby ×1

ruby-prof ×1

unix ×1

visualization ×1

wait ×1