2

背景

我想为我的 ASP.NET Core 2.1 应用程序监控哪些方法分配最多,为此我想使用 LTTng 事件以及其他一些工具来提供帮助。我基本上尝试过遵循本指南:http: //blogs.microsoft.co.il/sasha/2018/02/06/getting-stacks-for-lttng-events-with-net-core-on-linux/

(我在网上的几个地方看到了基本相同的内容,变化很少/很小。这篇文章是格式较好的文章之一,但由于其内容已被其他人重复,我没有理由相信不知何故,这将是不正确的。)

设置

我正在使用命令启动我的服务器应用程序

COMPlus_EnableEventLog=1 /home/kqr/testserver/TestServer & >/dev/null

在后台安静地运行它。然后我通过发出 HTTP 请求并获得我期望的响应来验证它是否有效。

程序

然后我想做的是找出哪些方法做了很多堆分配,所以我stackcount从 BPF Compiler Collection (BCC) 运行该工具,如下所示:

sudo stackcount-bpfcc -p 19010 -f \
    /home/kqr/testserver/libcoreclr.so:EventXplatEnabledGCAllocationTick* \
    > allocticks.stacks

我提出了一些在内存使用方面应该很昂贵的请求,然后我用 Ctrl-C 取消了 stackcount 命令。

问题

此时,allocticks.stacks文件是空的,就好像在记录期间没有分配一样。

我本来希望allocticks.stacks至少包含一些东西

我究竟做错了什么?

进一步诊断

我还尝试用 perf 做同样的事情,首先为 GCAllocationTick 事件定义一个探针:

sudo perf probe -x /home/kqr/testserver/libcoreclr.so \
    -a EventXplatEnabledGCAllocationTick*

然后开始为流程记录这些事件:

sudo perf record -p 19010 -e probe_libcoreclr:* -g

再次,执行一些我知道在内存使用方面很昂贵的请求,然后使用 Ctrl-C 取消录制命令。

然后当我尝试通过运行查看记录的数据时

sudo perf report -f

我收到以下错误:

Error: The perf.data file has no samples!

排除:拼写错误

起初我怀疑我只是拼错了一些东西。因此,我尝试在命令中故意拼错重要的标识符,但每次我这样做时,工具都非常擅长告诉我我做错了。因此,我没有理由怀疑这是现在的问题。

排除:缺少依赖

与拼写错误的情况类似,我曾尝试有意卸载我知道是必需的依赖项,然后工具是否对此发出警告。

排除(?):错误libcoreclr.so

我不太确定整个 .NET 是如何组合在一起的,但我开始认为TestServer可执行文件可能没有使用libcoreclr.so其工作目录中的文件,因为它使用了一些系统范围的二进制文件。但是,我还没有找到libcoreclr.so系统上命名的任何其他文件,尽管我也没有很努力地寻找。

但是,我开始认为这可能是那些自包含部署的东西之一,并且它libcoreclr.so以某种方式嵌入到二进制文件中,因此它不必依赖它作为外部文件。但是,即使我使用

cd /home/kqr/testserver
COMPlus_EnableEventLog=1 dotnet TestServer.dll

我有同样的问题,让我认为这也是一个不太可能的原因。

4

0 回答 0