我的延迟作业任务之一存在严重的内存泄漏,我很难解决它。谁能推荐一个好工具来分析delayed_job任务以解决这个内存泄漏?
问候,
鲁本
在 Xcode(当前版本 4.3.2)中,我为调试和发布版本设置了 DEBUG 和 NDEBUG 宏定义,因此我可以有选择地使用 ObjC 预处理器包含调试代码。
问题:当我选择产品 --> 构建 --> 归档时,DEBUG 和 NDEBUG 均未定义。我对产品 --> 构建 --> 分析也有类似的问题。
问题:如何在 xcode 中为存档和分析构建正确设置 DEBUG 和 NDEBUG,以便我的条件代码包含(预处理器)宏不会中断?
我当前在发送到 AppStore 之前存档构建的解决方法是暂时删除 DEBUG 代码;但这不是一个好的做法,即使我受到 git 的源版本控制系统的保护。
参考:Linux 时钟获取时间
我找到了一个可以很好地计算处理时间的公式,但有一些我不明白的地方。请参阅下面的结果。
前两行只是在各自的列中显示论坛。
我只显示快速运行的 3 个结果。
有趣的部分在最后一行,为什么5551 - 999896062纳秒= 18446744072709661105?
为什么18446744072709661105+1/1E9= 0.000109?
我认为正在进行一些数据转换会影响结果?
xx: | t1.tv_sec | | t1.tv_nsec | | t2.tv_sec | | t2.tv_nsec
xx: t2-t1(sec) t2-t1(nsec) (t2-t1(sec))+(t2-t1(nsec))/1E9
52291: | 30437 | | 999649886 | | 30437 | | 999759331
52291: 0 109445 0.000109
52292: | 30437 | | 999772970 | | 30437 | | 999882416
52292: 0 109446 0.000109
52293: | 30437 | | 999896062 | | 30438 | | 5551
52293: …Run Code Online (Sandbox Code Playgroud) 我一直在使用 oprofile 来尝试找出为什么我的程序在内核中花费如此多的时间。我现在拥有来自内核的符号,但显然我的程序和内核之间没有链接可以告诉我程序的哪些部分花费了这么长时间。
samples % image name app name symbol name
-------------------------------------------------------------------------------
201 0.8911 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic _raw_spin_lock_irq
746 3.3073 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic rb_get_reader_page
5000 22.1671 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic default_spin_lock_flags
16575 73.4838 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic _raw_spin_lock
22469 11.1862 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic __ticket_spin_lock
22469 99.6010 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic __ticket_spin_lock [self]
26 0.1153 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic ret_from_intr
Run Code Online (Sandbox Code Playgroud)
我该去哪里?如何发现程序中导致 __ticket_spin_lock 的位置?
我需要分析一个“慢”的函数,即它需要很长时间才能终止(如果有的话)。在我看来,仍然可以使用 SBCL 中的统计分析器来分析这个函数,因为它只是定期采样。然而,当我跑
(sb-sprof:with-profiling (:max-samples 1000 :report :flat :loop nil)
(the-function-in-question))
Run Code Online (Sandbox Code Playgroud)
探查器只是打印
Profiler 样本向量已满(537 条轨迹/10000 个样本),大小加倍
但永远不会带着报告回来。
我的想法是否可能,如果有,我该如何实现?
首先,是否有人对 GRPC 客户端-服务器实现与/sa websocket+protobuf 客户端-服务器实现之间的吞吐量/延迟进行了性能比较?或者至少是类似的东西。
为了达到这个目标,我正在尝试示例 JAVA helloworld grpc 客户端-服务器,并尝试将响应的延迟与类似的 websocket 客户端-服务器进行比较。目前我正在我的本地机器上用客户端和服务器尝试这个。
websocket 客户端-服务器在服务器端有一个简单的 while 循环。对于 grpc 服务器,我注意到它使用异步执行模型。我怀疑它为每个客户端请求创建一个新线程,从而导致额外的处理开销。例如,我测量的 websocket 响应延迟大约为 6-7 毫秒,grpc 示例显示大约 600-700 毫秒的延迟,占 protobuf 开销。
为了对grpc做类似的比较,有没有办法同步运行grpc服务器?我希望能够消除线程创建/调度的开销以及异步处理引入的其他此类内部开销。
我确实理解 grpc 中涉及的 protobuf 开销在我的 websocket 客户端 - 服务器示例中不存在。但是,我可以通过测量 protobuf 处理引入的开销来解释这一点。
另外,如果我不能同步运行 grpc 服务器,我至少可以测量线程调度/异步处理开销吗?
我对 JAVA 比较陌生,所以请原谅我的无知。
该%timeit魔术支持行模式和小区模式执行。使用单元格模式,调用%%timeit(注意:两个百分比符号),可用于从测量中排除一些设置代码:
%%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code code code...
Run Code Online (Sandbox Code Playgroud)
但是你如何使用它呢?这给出了一个错误:
>>> %%timeit sleep(0.1); sleep(0.1)
...
UsageError: %%timeit is a cell magic, but the cell body is empty.
Did you mean the line magic %timeit (single %)?
Run Code Online (Sandbox Code Playgroud)
这并不排除基准测试中的第一行:
>>> %%timeit
... sleep(0.1)
... sleep(0.1)
...
200 ms ± 17.6 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud) 在节点 ( v10.15.3) 中,我一直在分析,node --prof <script>然后用 总结输出node --prof-process <output>。生成的摘要中有很多未计算的滴答声,在运行第二步时,这些滴答声可能与大量错误有关,类似于以下内容:
...
Code move event for unknown code: 0x3663777f8b98
Code move event for unknown code: 0x3663777f9018
Code move event for unknown code: 0x3663777f9790
Code move event for unknown code: 0x36635f5fb5a8
Code move event for unknown code: 0x3663777f9b78
Code move event for unknown code: 0x3663777f9d00
Code move event for unknown code: 0x3663777fa150
Code move event for unknown code: 0x3663777fa7f8
Code move event for unknown code: 0x36635f5fe630
Run Code Online (Sandbox Code Playgroud)
这个“未知代码的代码移动事件”错误意味着什么?是否有补救措施可以在我的分析调查中为我提供更多详细信息?
通过https://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-wp-2008279.pdf,我遇到了以下引用:
今天用于监视、管理和分析 Java 运行时的大多数技术都使用相当侵入性的技术,如字节码检测和 JVMTI。
这让我想知道 JFR 进行堆栈跟踪采样的方式。
我能在网上找到的最接近答案的是这篇博文:http : //psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html,提到诸如 Honest profiler 和 async-profiler 之类的探查器使用没有详细记录的 AsyncGetCallTrace,但事实是它没有提到 JFR 进行堆栈跟踪采样/记录的具体方式。
这里有没有人对 JFR 内部有关此主题的内容有任何见解?
当通过Thread#getStackTrace()or从另一个线程请求堆栈跟踪时ThreadMXBean#getThreadInfo(long[], int),是否所有线程都必须进入安全点,从而必须等到所有其他线程都进入安全点?
这个博客似乎表明情况是这样的:
无论您是对单个线程还是所有线程进行采样,您都达到了全局安全点(至少在 OpenJDK 上,Zing 略有不同,但作为分析器供应商 OpenJDK 是您的假设。)
这意味着从单个线程获取堆栈跟踪与获取所有堆栈跟踪一样具有侵入性(就高开销而言,由于全局安全点命中的频率增加)。
但是对于 OpenJDK 来说,这实际上/仍然如此吗?您是否有任何指示为什么会这样或相关源代码?