背景
我想为我的 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
我有同样的问题,让我认为这也是一个不太可能的原因。