【问题标题】:C# service performance issue with Json.NET and GC WaitJson.NET 和 GC 等待的 C# 服务性能问题
【发布时间】:2017-12-26 16:41:19
【问题描述】:

我有一个做一些业务工作的 Windows 服务。我使用 dotTrace 对其进行分析以查找性能问题并有这样的图片: GC Wait 88%

GC Wait 需要 88% 的时间似乎很奇怪,所以我关闭了一些小间隔并得到: Thread stats

我发现在非阻塞期间,线程分配对象 通过 JSON.Net 反序列化以及 GC 阻止的此代码:

    using (var response = await _httpClient.SendAsync(request, combinedTokenSource.Token))
    {
        response.EnsureSuccessStatusCode();
        if (response.Content == null)
            throw new InvalidOperationException("No HTTP response received.");

        using (var responseStream = await response.Content.ReadAsStreamAsync())
        {
            using (var textReader = new JsonTextReader(new StreamReader(responseStream)))
            {
                var results = new JsonSerializer().Deserialize<ElasticResponse>(textReader);
                return results;
            }
        }
    }

有人遇到过类似的问题吗?还是我错过了什么?

【问题讨论】:

  • 那么您是否有实际的性能问题或只是决定测量?
  • 是的,我在这种情况下的表现不佳。
  • 您可以选择“.NET Memory Allocations”然后向我们展示“Call Stack”面板的内容吗?如果你可以将跟踪文件上传到某个地方就更好了
  • 另外,看起来 GC 是在单线程上运行的。启用并发 GC 会让你松一口气。 docs.microsoft.com/en-us/dotnet/framework/configure-apps/…
  • 上传跟踪到yadi.sk/d/64xfxnrY3Qz7zg

标签: c# multithreading garbage-collection json.net dottrace


【解决方案1】:

最后我发现我的应用程序没有使用“后台服务器垃圾收集”(微软说它在 .net 4.5 - gc description 中是默认的)。所以我添加到配置中:

   <runtime>  
      <gcServer enabled="true"/>  
   </runtime>

它将 GC 等待时间减少到 8.5%,因此我获得了 5 倍的性能进步。

【讨论】:

  • 哇,这解决了我的性能问题!我有一个客户端和一个服务器应用程序。服务器是生产者,客户端是消费者。生产和消费物品之间的平均延迟为 150 毫秒,现在在服务器应用程序上应用此功能后,平均延迟为 7 毫秒!我已经对应用程序进行了 2 周的分析和重构,低延迟是实现的关键目标。我从来没有想过是 GC 阻塞了我的线程,我很确定这是一些低效的锁定
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 2019-05-08
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多