Docker 在Linux容器中运行的ASP.NET Core 2.0应用程序在多次调用Trace.WriteLine()时遇到锁定问题

Docker 在Linux容器中运行的ASP.NET Core 2.0应用程序在多次调用Trace.WriteLine()时遇到锁定问题,docker,asp.net-core,.net-core,Docker,Asp.net Core,.net Core,我们的应用程序是一个ASP.NET Core 2.0 WebAPI,部署在Linux Docker容器中,运行在Kubernetes中 在负载测试期间,我们发现了CPU使用量的间歇性峰值,我们的应用程序将永远无法恢复 我们使用perfcollect从容器中收集跟踪,以便比较成功的测试和CPU峰值测试。我们发现,在失败测试中,大约75%的CPU时间花在了JIT MONREABLEEnter Protable上,这是一个锁操作接口。调用方是System.Diagnostics.TraceSource

我们的应用程序是一个ASP.NET Core 2.0 WebAPI,部署在Linux Docker容器中,运行在Kubernetes中

在负载测试期间,我们发现了CPU使用量的间歇性峰值,我们的应用程序将永远无法恢复

我们使用perfcollect从容器中收集跟踪,以便比较成功的测试和CPU峰值测试。我们发现,在失败测试中,大约75%的CPU时间花在了JIT MONREABLEEnter Protable上,这是一个锁操作接口。调用方是
System.Diagnostics.TraceSource.dll

我们的应用程序是从.NET Framework移植而来的,包含了大量对
System.Diagnostics.Trace.WriteLine()的调用。当我们删除所有这些,我们的CPU/内存使用减少了50%以上,我们不再看到CPU峰值

我想了解这个问题的原因

在corefx repo中,我可以看到默认跟踪侦听器设置在:

公共静态TraceListenerCollection侦听器
{
得到
{
初始化设置();
如果(s_侦听器==null)
{
锁(秒)
{
如果(s_侦听器==null)
{
//在没有配置支持的情况下,侦听器默认添加
//到侦听器集合的DefaultTraceListener。
s_侦听器=新的TraceListenerCollection();
TraceListener defaultListener=新的DefaultTraceListener();
defaultListener.IndentLevel=t_IndentLevel;
defaultListener.IndentSize=s_IndentSize;
添加(defaultListener);
}
}
}
返回s_侦听器;
}
}
我可以看到调用Debug.Write()

private void Write(字符串消息,bool useLogFile)
{
如果(需要缩进)
WriteIndent();
//巨大的消息将VS和dbmon都搞乱了,所以我们将其拆分为
//如果太大的话,合理的块

如果(message==null | | message.Length则解决方案可能是rsyslog未运行。它是否安装在容器中?请使用内置rsyslog的基本映像


也可以帮助。

您似乎正在运行.NET Core 1.1。您是否尝试用.NET Core 2.0重现此问题?我正在运行.NET Core 2.0。是什么让您认为我是专门使用.NET Core 1.1的?我更新了问题以澄清问题。您发布的源代码链接似乎是针对.NET Core 1.0的。好的,我已将其更新为.NET Core 1.0.0版本分支。我注意到的唯一区别是DefaultTraceListenerBy design中的useLogFile,容器中运行的唯一进程是dotnet。如果rsyslog未运行,为什么要调用syslog lock?因为您使用的服务似乎需要rsyslog。您可以使用任何其他服务来记录。
logger --socket-errors=on 'SysLog test'