如何收集功能模块执行的详细堆栈跟踪?

Posted

技术标签:

【中文标题】如何收集功能模块执行的详细堆栈跟踪?【英文标题】:How to collect detailed stack trace for Function Module execution? 【发布时间】:2022-01-04 06:07:59 【问题描述】:

有没有一种方法/工具可以为 SAP 功能模块执行收集详细的 Stacktrace?

我们发现应用程序中出现间歇性性能问题。它正在调用 SAP FM(使用 PyRFC)。这个 FM 本身执行许多事情——逻辑、进一步的调用等。它还应用了多线程处理。它用于获取多个项目的价格。对于每次调用,它会按项目拆分调用,并为每个项目在并行线程中执行,等待所有线程完成,合并所有获取的价格并返回结果。

这些调用中的极少百分比花费的时间比平时长得多(99% 的调用不到 2 秒,而慢速调用则超过 10 秒)

在不同层启用跟踪后,我们看到调用按预期在多个 SAP 应用服务器之间拆分。对于突然的缓慢调用,其中一个应用服务器最终会占用大量时间,从而导致整体执行速度变慢。

我们仔细验证了这不是特定应用服务器的问题。它是在许多应用服务器上随机发生的。我们无法确定是什么情况导致了这种情况。从可用的应用服务器指标(CPU、内存、I/O 等)来看,在同一时间跨度内都处于非常健康的范围内。

我有两个问题是 -

    有没有办法在 SAP 应用服务器级别启用详细信息跟踪;揭示在这些缓慢执行过程中特定应用服务器上到底发生了什么的详细跟踪?例如,其中一个慢速调用耗时 7.8 秒。但是我们没有更多关于这 7.8 秒究竟是如何度过的。什么都进去了。 我正在寻找可以用 JVM 应用程序完成的类似于堆栈跟踪和分析的东西。如果没有这 7.8 秒的下一级破解,就像在黑暗中扔石头,希望它会撞到某个地方。

    以前有没有人遇到过类似的问题?如果是,那么在这种情况下,根本原因是什么? 为避免混淆,不要寻找神奇的解决方案。对于此类问题和可用的高级详细信息,无法提供解决方案。因此,如果您过去曾看到类似的问题以及当时的原因,我正在寻找见解,以便我们可以检查相同的内容以确保确定。或者,如果您可以提出任何其他想法来探索根本原因分析,那也很有帮助。

问候。 S.达斯

【问题讨论】:

我不知道 pyRFC,但通常 RFC SDK 提供带有“SAT 跟踪”的单元 RFC(可能在 pyRFC 或 NW RFC 文档中搜索“sattrace”或“sat_trace”) . SAT 对应于后端的一个工具,它保存所有已执行的 ABAP 程序和持续时间的列表。我不知道如何使用 RFC SDK 检索结果。也就是说,我认为您最好登录 ABAP 后端或数据库,这些后端或数据库已经适应了调整工具,或者请有经验的人为您执行此操作。 【参考方案1】:

你有几个选择:

    Legacy way 通过 SE37 的堆栈跟踪或调用图

    SAT runtime analysis 的 FM 积木

    SAP ST12 Single transaction analysis 更全面和扩展的工具

可以运行以跟踪外部调用! 您的首选工具!

    SAPUPL Usage & Procedure Logging

允许将 FM 分解为子程序甚至逻辑片段(IF、LOOP、WHILE、CASE)的跟踪工具,以及彼此之间的匹配程度

在事务中激活/SDF/UPL_CONTROL

自 SAP Netweaver 7.01 SP10 或 7.02 SP9 + 内核 720 补丁 94 或 7.31 SP3 和 7.40 起可用

需要 ST-PI 2008_1_x SP4

    ABAP SCMON,UPL 的继任者。允许与 UPL 相同,另外
同时捕获任何动态调用的 ABAP 例程 支持所有 ABAP 过程类型直至子例程 通过记录相应的根来记录调用堆栈信息

在事务SCMON/SDF/SCMON_ACTIVATE 中激活

自 NW 7.22 PL123 或 NW 7.42 PL310 或 NW 7.45+ 或 NW 7.50+ 起提供

需要 ST-PI 2008_1 SP14 或 ST-PI 740 SP4

    SAP CCLM (Custom Code Life Cycle Management) 一个更全面的工具,包含 45 的所有功能以及运行时性能分析。

不过,它需要解决方案管理器 7.2。

以下是它们如何通过功能相互站立的概述

我想指出选项 45 不是运行时分析,因此它们不能说明模块在每个变体上的行为方式,即在某些测试数据上,但它们允许了解结构和可能的瓶颈。

【讨论】:

以上是关于如何收集功能模块执行的详细堆栈跟踪?的主要内容,如果未能解决你的问题,请参考以下文章

详细的堆栈跟踪:错误:找不到模块“条带”

从堆栈跟踪中获取更多详细信息

如何使用 perf 收集一些可读的堆栈跟踪?

如何使用 ETW 编写自定义堆栈跟踪

如何从像 Asp.Net 这样的堆栈跟踪中获取“源错误”?

java 堆栈跟踪功能。