将Azure诊断日志写入blob存储的性能影响

时间:2017-11-06 23:55:21

标签: azure azure-storage-blobs azure-diagnostics

我们在Azure上运行的C#Web应用程序使用System.Diagnostics.Trace编写跟踪语句以进行调试/故障排除。一旦我们为这些日志启用blob存储(使用Azure门户中的"应用程序日志记录(blob)"选项),我们的应用程序的响应时间就会大大减慢。如果我关闭此选项,Web应用程序将再次加速(尽管显然我们不再在blob存储中获取日志)。

有人知道这是否是预期的?我们当然在每个请求上写了很多跟踪语句(每个请求大约100个),但我不认为这对于Web应用程序来说是不寻常的。有没有办法诊断为什么为日志启用blob存储会大大减慢这些跟踪语句的执行速度?是否将跟踪语句与blob存储中正在更新的日志同步?

1 个答案:

答案 0 :(得分:2)

我无法找到有关如何在Azure中记录blob存储的信息。然而,这是我能够推断的:

我确认禁用global lock没有效果。因此,性能问题与锁争用没有直接关系。

我还确认,如果我关闭AutoFlush,则不会出现性能问题。

从进一步的交叉引用the source code for the .NET trace API,我得出的结论是,当您为日志启用blob存储时,它会向您的应用程序注入某种跟踪侦听器(就像您可以在Web中添加侦听器一样)。 config)并且它同步将它收到的每个trace语句写入blob存储。

因此,似乎有几种方法可以解决此问题:

  1. 不要打开AutoFlush,而是定期手动刷新。这将防止同步blob写入中断每个日志语句。
  2. 编写自己的守护程序,它将定期将本地日志文件复制到blob存储或类似的东西
  3. 根本不要使用此blob存储功能,而是使用the tracing functionality in Application Insights

我最终做了#3,因为事实证明,我们已经配置了Application Insights,我们只是没有意识到它可以处理跟踪日志记录和查询。在追踪事件disabling sampling之后,我们现在可以轻松地远程查询任何日志语句,并获得符合任何条件的完整跟踪集(关键字匹配,特定请求的所有跟踪,特定的所有跟踪)此外,使用Application Insights跟踪侦听器编写日志语句没有明显的同步开销,因此我们的应用程序中的任何内容都不得更改(我们可以继续使用.NET跟踪类)。作为奖励,由于Application Insights跟踪对跟踪源非常灵活,我们甚至可以根据需要切换到另一个更高性能的日志记录API(例如ETW或log4net),Application Insights仍然有效。

最终,您应该考虑使用Application Insights来存储和查询跟踪。根据您最初想要blob存储日志的原因,它可能会或可能不会满足您的需求,但它对我们有用。