我们在 Azure 上运行的 C# Web 应用程序使用 System.Diagnostics.Trace 编写跟踪语句以进行调试/故障排除。一旦我们为这些日志启用 blob 存储(使用 Azure 门户中的“应用程序日志记录 (blob)”选项),应用程序的响应时间就会大大减慢。如果我关闭此选项,Web 应用程序会再次加速(尽管显然我们不再在 Blob 存储中获取日志)。
有谁知道这是否是预期的?我们当然会在每个请求上编写大量跟踪语句(每个请求 100 条左右),但我认为这对于 Web 应用程序来说并不罕见。是否有某种方法可以诊断为什么为日志启用 blob 存储会显着减慢这些跟踪语句的执行速度?例如,编写跟踪语句是否与 Blob 存储中更新的日志同步?
我无法找到有关如何在 Azure 中实现记录到 blob 存储的任何信息。然而,这是我能够推断出的:
我确认禁用全局锁 https://msdn.microsoft.com/en-us/library/system.diagnostics.trace.usegloballock(v=vs.110).aspx没有效果。因此,性能问题与锁争用没有直接关系。
我也确认如果我转身自动冲洗 https://msdn.microsoft.com/en-us/library/system.diagnostics.trace.autoflush(v=vs.110).aspx关闭后,没有出现性能问题。
从进一步的交叉引用.NET 跟踪 API 的源代码 http://www.dotnetframework.org/default.aspx/4@0/4@0/untmp/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/CompMod/System/Diagnostics/TraceInternal@cs/1305376/TraceInternal@cs,我的结论是,当您为日志启用 blob 存储时,它会向您的应用程序注入某种跟踪侦听器(与您在 web.config 中添加侦听器的方式相同),并且它会将收到的每个跟踪语句同步写入到斑点存储。
因此,似乎有几种方法可以解决此问题:
- 不要打开自动冲洗,而是定期手动冲洗。这将防止同步 blob 写入中断每个日志语句。
- 编写您自己的守护程序,定期将本地日志文件复制到 blob 存储或类似的东西
- 根本不要使用此 blob 存储功能,而是利用Application Insights 中的跟踪功能 https://learn.microsoft.com/en-us/azure/application-insights/app-insights-asp-net-trace-logs.
我最终做了#3,因为事实证明,我们已经配置并打开了 Application Insights,我们只是没有意识到它可以处理跟踪日志记录和查询。后禁用采样 https://learn.microsoft.com/en-us/azure/application-insights/app-insights-sampling对于跟踪事件,我们现在有一种方法可以轻松地远程查询任何日志语句,并获取符合任何条件的完整跟踪集(关键字匹配、特定请求的所有跟踪、特定时间段内的所有跟踪等)此外,使用 Application Insights 跟踪侦听器编写日志语句没有明显的同步开销,因此我们的应用程序中无需更改任何内容(我们可以继续使用 .NET 跟踪类)。另外,由于 Application Insights 跟踪对于跟踪源非常灵活,因此如果需要,我们甚至可以切换到另一个性能更高的日志记录 API(例如 ETW 或 log4net),并且 Application Insights 仍然可以工作。
最终,您应该考虑使用 Application Insights 来存储和查询跟踪。根据您最初希望将日志存储在 Blob 存储中的原因,它可能会也可能不会满足您的需求,但它对我们有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)