2

我已经设置并使用了https://github.com/jvm-profiling-tools/async-profiler这非常有用,但是我有一个奇怪的事情我无法解释。

我的设置正是多个演示文稿显示它可以提供帮助的地方:

  • 具有节点池的 AKS kubernetes 集群

  • 部署在一个节点上的 Pod

  • 在容器中,我使用 debuginfo 设置了 openjdk-11

  • 分析设置是一个简单的 ./profiler start -e malloc PID

  • 由于我在虚拟化环境中进行分析工作,我得到的唯一警告是

      [WARN] Kernel symbols are unavailable due to restrictions. Try
    sysctl kernel.kptr_restrict=0
    sysctl kernel.perf_event_paranoid=1
    

我认为关于可能不需要的 malloc 调用捕获。

问题是,经过一些分析时间后,我已经捕获了火焰图显示的分配部分:堆栈跟踪“未知”(参见附图)。可能是我在容器中还没有完整的设置,或者我真的需要那些 sysctl?

问题是虚拟化将它们放置到位并不是一件容易的事,因为据我所知,这实际上会影响我们正在运行的底层节点。

分配的火焰图

更新

现在,在我的微服务的所有主要功能至少触发一次之后,我重新启动了分析,似乎没有未知的分配。愚蠢的问题,但是我是否会在所有类加载发生之前立即开始分析(因为 bean 是惰性实例化的),这就是为什么它被这样分类的原因?

更新 2

实际上我的假设是错误的我做了一个很好的转储 未知分类最少的 OK 转储

此后不久,同样的现象再次发生,据报道捕获的大量 malloc 事件是未知的,顶部显示没有显着增加。这可能是由于虚拟化而我实际上是从同一节点上的其他容器中捕获事件吗?在我的容器中没有更多的 java 进程,我还直接指定了 PID 在此处输入图像描述

更新 3

因此,在 Andrei 为我提供了“矮人 stackwalker”之后,这看起来好多了。我只有一个问题还不清楚,但只有我一个人。我们在这里用我的: ./profile.sh start --cstack dwarf -e malloc PID 分析 malloc 事件所以我在这些火焰图上看到的是:它只是捕获的事件编号,可以同时释放还是它当前持有所有这些 malloc 的本机内存?

My current situation is that I see payara-micro healthcheck and autodeploy holds significant amount of memory which is weird and my first guess for the leak source.

自动部署百分比 健康检查百分比

I also made a jeprof output anybody has a guess what "updatewindow/inflate" can point to? Jeprof 输出

4

1 回答 1

0

Container environment is not related here.

It seems like libc (where malloc implementation resides) on your system is compiled without frame pointers. So the standard stack walking mechanism in the kernel is unable to find a parent of malloc frame.

我最近实现了一种替代堆栈行走算法,它依赖于DWARF 展开信息。新版本尚未发布,但您可以尝试从源代码构建它。或者,为了您的方便,我在这里准备了新版本:async-profiler-2.6-dwarf-linux-x64.tar.gz

然后添加--cstack dwarf选项,所有malloc堆栈跟踪都应该到位。

于 2022-01-28T01:02:59.093 回答