1

使用来自 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 包时也会发生此问题。

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

4

1 回答 1

0

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

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

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

于 2018-01-22T15:15:13.187 回答