使用C#中的Google.Cloud.Logging.V2包进行内存泄漏

时间:2017-05-18 16:33:08

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

使用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 log / sec / thread。该测试大量泄漏内存,大约100MB / 10分钟的运行时间与禁用测试相比。

以下是内存分析器的差异: Memory profiler

通过Google.Cloud.Logging.Log4Net软件包时也会发生此问题。

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

1 个答案:

答案 0 :(得分:0)

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

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

此外,您可以将Log4Net appender更新到最新版本(2.2.0),该版本也可以在NuGet包管理器中找到。一旦更新了依赖项,就可以再试一次,检查是否存在内存泄漏。