你们使用哪些工具?demangle c ++符号如何能够将它传递给探查器工具,例如opannotate?
谢谢
我正在研究接收和处理JSON请求的Haskell守护程序.虽然守护进程的操作很复杂,但主要结构有意保持简单:它的内部状态只是IORef一个数据结构,所有线程都对此执行原子操作IORef.然后有几个线程在触发器上取值时用它做一些事情.
问题是守护进程泄漏了内存,我无法找到原因.它肯定与请求相关:当守护进程每秒收到多个请求时,它会泄漏大小为1MB/s(由Linux工具报告).内存消耗稳步增长.没有请求,内存消耗保持不变.
令我感到困惑的是,这些都没有在GHC分析中显示出来.要么我在配置文件参数中缺少某些内容,要么内存被其他内容消耗:
运行+RTS -hc -xt -p:

运行+RTS -hr -xt -p:

在此测试运行期间,守护程序随后消耗超过1GB.因此,分析数据显然与实际消耗的内存数量级不对应.(我知道RTS,GC和性能分析本身会增加实际内存消耗,但这种差异太大了,并不符合不断增加的消耗.)
我已经尝试rnf了守护进程内的所有状态数据IORef,以及解析的JSON请求(以避免部分JSON字符串保留在某处),但没有太大的成功.
欢迎任何想法或建议.
更新:守护程序没有运行-threaded,因此没有操作系统级别的线程.
GC统计信息更接近堆分析而不是Linux报告的数字:
Alloc Copied Live GC GC TOT TOT Page Flts
bytes bytes bytes user elap user elap
[...]
5476616 44504 2505736 0.00 0.00 23.21 410.03 0 0 (Gen: 0)
35499296 41624 2603032 0.00 0.00 23.26 410.25 0 0 (Gen: 0)
51841800 46848 2701592 0.00 0.00 23.32 410.49 0 0 (Gen: …Run Code Online (Sandbox Code Playgroud) 我开发了一个python C扩展,它从python接收数据并计算一些cpu密集型计算.可以分析C扩展吗?
这里的问题是在C中编写样本测试以进行分析将是一项挑战,因为代码依赖于特定的输入和数据结构(由python控制代码生成).
你有什么建议吗?
我需要一些方法来记录Linux机器上的应用程序的性能.我不会有IDE.
理想情况下,我需要一个应用程序,它将附加到进程并记录定期快照:内存使用数线程CPU使用率
有任何想法吗?
是否有任何valgrind的扩展,可以在命令窗口中使用,这将帮助我知道我的C代码中每个函数花费的时间(以秒为单位)?
谢谢=)
我想找到一种方法来确定PHP中的每个函数以及PHP中的每个文件运行的时间.我有一个旧的遗留PHP应用程序,我正试图找到"粗糙点",所以我想找到客观上需要很长时间加载的例程和页面.
是否有任何预制工具可以实现这一点,或者我是否坚持使用microtime,并构建自己的分析框架?
章节旧问题包含初始问题(此后已添加进一步调查和结论).
跳到部分进一步调查下面的不同的定时的方法(详细比较rdtsc,clock_gettime和QueryThreadCycleTime).
我相信CGT的不稳定行为可归因于有缺陷的内核或有缺陷的CPU(参见结论部分).
用于测试的代码位于此问题的底部(请参阅附录部分).
道歉的长度.
简而言之:我clock_gettime用来衡量许多代码段的执行时间.我在单独的运行之间经历了非常不一致的测量.与其他方法相比,该方法具有极高的标准偏差(参见下面的说明).
问题:clock_gettime与其他方法相比,有没有理由给出如此不一致的测量结果?是否有一种替代方法具有相同的分辨率来解决线程空闲时间?
说明:我正在尝试分析C代码的一些小部分.每个代码段的执行时间不超过几微秒.在单次运行中,每个代码段将执行数百次,从而产生runs × hundreds测量值.
我还必须只测量线程实际执行的时间(这就是为什么rdtsc不适合).我还需要一个高分辨率(这就是为什么times不适合).
我尝试了以下方法:
rdtsc (在Linux和Windows上),
clock_gettime (在Linux上使用'CLOCK_THREAD_CPUTIME_ID';)和
QueryThreadCycleTime (在Windows上).
方法:分析在25次运行中进行.在每次运行中,单独的代码段重复101次.因此我有2525次测量.然后我查看测量的直方图,并计算一些基本的东西(如平均值,std.dev.,中位数,模式,最小值和最大值).
我没有介绍我如何测量三种方法的"相似性",但这仅仅涉及对每个代码段花费的时间比例的基本比较("比例"意味着时间被标准化).然后我看看这些比例的纯粹差异.这种比较表明,在25次运行中平均所有'rdtsc','QTCT'和'CGT'的比例相同.但是,下面的结果表明'CGT'具有非常大的标准偏差.这使得它在我的用例中无法使用.
结果:
的比较clock_gettime与rdtsc对于相同的代码段(101个测量= 2525个读数25次运行):
clock_gettime:
其余的在900到5000 ns之间.
最小值:11 ns
根据perf教程,perf stat应该使用硬件计数器报告缓存未命中.但是,在我的系统(最新的Arch Linux)上,它没有:
[joel@panda goog]$ perf stat ./hash
Performance counter stats for './hash':
869.447863 task-clock # 0.997 CPUs utilized
92 context-switches # 0.106 K/sec
4 cpu-migrations # 0.005 K/sec
1,041 page-faults # 0.001 M/sec
2,628,646,296 cycles # 3.023 GHz
819,269,992 stalled-cycles-frontend # 31.17% frontend cycles idle
132,355,435 stalled-cycles-backend # 5.04% backend cycles idle
4,515,152,198 instructions # 1.72 insns per cycle
# 0.18 stalled cycles per insn
1,060,739,808 branches # 1220.015 M/sec
2,653,157 branch-misses # 0.25% of …Run Code Online (Sandbox Code Playgroud) 大多数IPython的"神奇功能"的工作对我罚款马上蝙蝠: %hist,%time,%prun等.然而,我注意到,%lprun无法IPython中找到,因为我想最初安装它.
然后我发现我应该安装line_profiler模块.我已经安装了这个模块,但似乎仍然无法使魔术功能正常工作.如果我试图打电话%lprun,iPython仍然无法找到该功能.如果我用全名(line_profiler.magic_lprun)调用它,可以找到该函数,但我根本无法使用它.下面是我所做的一个例子(从"Python for Data Analysis"一书中逐步采用):
%prun[在:]
def add_and_sum(x, y):
added = x + y
summed = added.sum(axis=1)
return summed
x = randn(3000, 3000)
y = randn(3000, 3000)
add_and_sum(x, y)
Run Code Online (Sandbox Code Playgroud)
有了这个,我得到了一个很好的答案,正如所料:
[输出:]
array([-23.6223074 , -10.08590736, -31.2957222 , ..., -14.17271747,
63.84057725, -50.28469621])
Run Code Online (Sandbox Code Playgroud)
我可以做剖析魔术功能%prun:
[在:]
%prun add_and_sum(x, y)
Run Code Online (Sandbox Code Playgroud)
[输出:]
6 function calls in 0.042 seconds
Ordered by: internal time
ncalls tottime percall cumtime …Run Code Online (Sandbox Code Playgroud) 我最近重新安装了Windows,我使用的是内置VisualVM的JDK 1.8 u91.我已经检查了我的代理设置,以确保它们都在Windows代理设置和VisualVM的代理设置中全部关闭.
我也尝试重新安装JDK,重新启动计算机,重新安装Windows.我只安装了一个JDK,并且类路径设置为Windows中的JDK bin文件夹.
除了CPU和内存分析之外的所有功能都在VisualVM中工作.我的应用程序是从IntelliJ运行的,但我也尝试从命令行定期运行应用程序,VisualVM也无法连接到那些应用程序.
我也试过从http://visualvm.java.net下载VisualVM,这也不起作用.
我没有安装插件.
它为什么挂?这是新JDK引入的错误吗?