【问题标题】:Memory leak using Google.Cloud.Logging.V2 package in C#在 C# 中使用 Google.Cloud.Logging.V2 包的内存泄漏
【发布时间】:2017-10-18 14:21:18
【问题描述】:

使用来自 nuget 的最新 Google.Cloud.Logging.V2 包,1.0.0

我的日志发送函数:

private static void WriteLogEntry(string message, Google.Cloud.Logging.Type.LogSeverity severity)
{
    string threadName = System.Threading.Thread.CurrentThread.Name;
    if (string.IsNullOrEmpty(threadName))
    {
        threadName = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
    }

    LogEntry logEntry = new LogEntry
    {
        LogName = logName.ToString(),
        Severity = severity,
        TextPayload = string.Format("[{0}]: {1}", threadName, message)
    };

    CloudLogClient.WriteLogEntriesAsync(LogResource, Monitor, EntryLabels, new[] { logEntry });
}

进行了压力测试,使用此函数从 40 个线程发送约 50 个日志/秒/线程。该测试会大量泄漏内存,与禁用测试相比,运行大约 100MB/10 分钟。

这是内存分析器的差异:

通过 Google.Cloud.Logging.Log4Net 包时也会出现此问题。

任何关于如何进一步缩小范围的建议将不胜感激。是否有任何可用于云日志记录包的源代码可以检查以找到内存泄漏的来源?

【问题讨论】:

    标签: c# .net google-app-engine google-cloud-logging


    【解决方案1】:

    我建议检查您通过 NuGet 添加的依赖项的版本,因为较新的版本已经修复了一些过去导致内存泄漏的问题。

    如果您使用早于 1.7.0 的 Grpc.Core,则会出现 C# 取消令牌注册未取消注册的问题,因此会导致内存泄漏,如 here 所示。更高版本的 Grpc.Core 修复了此问题,因此您可以尝试使用更新版本的 Grpc.Core,它在 NuGet 包管理器中可用。

    此外,您可以将 Log4Net 附加程序更新到最新版本 (2.2.0),NuGet 包管理器中也提供了该版本。一旦你更新了你的依赖,你可以再试一次并检查是否有内存泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 2017-07-25
      • 2012-02-03
      • 2014-11-13
      • 2015-02-17
      • 2010-12-20
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多