【问题标题】:Is GCLatencyMode.LowLatency a good choice?GCLatencyMode.LowLatency 是一个不错的选择吗?
【发布时间】:2009-07-15 22:50:27
【问题描述】:

我有一个 C# windows 服务充当服务器,该服务在内存中保存一些大型 (>8Gb) 数据结构,并通过远程处理向客户端公开搜索方法。

平均搜索操作在

我注意到一些严重的性能下降 (>6000ms) 在几秒钟内定期发生

我的最佳猜测是服务器线程不时被 gen2 垃圾收集停止。

我正在考虑从服务器 gc 切换到工作站 gc 并将我的搜索方法包装在其中以防止请求期间的 GC。

 static protected void DoLowLatencyAction(Action action)
    {
        GCLatencyMode oldMode = GCSettings.LatencyMode;
        try
        {
            GCSettings.LatencyMode = GCLatencyMode.LowLatency;
            // perform time-sensitive actions here
            action();
        }
        finally
        {
            GCSettings.LatencyMode = oldMode;
        }
    }

这是个好主意吗?

在什么条件下,GC 将在低延迟块内执行?

注意:我在具有 8 个内核的 x64 服务器上运行

谢谢

【问题讨论】:

  • 不要猜测原因。使用分析器、性能计数器、日志记录等来找出实际问题。
  • 是的。我使用了性能计数器和日志记录,现在是 GC 时间。

标签: c# .net performance garbage-collection


【解决方案1】:

我之前没有使用过GCLatencyMode,所以无法评论使用它是否是个好主意。

但是,您确定您正在使用服务器 GC 吗?默认情况下,Windows 服务使用工作站 GC。

我之前在 Windows 服务中遇到过类似的问题,并使用以下方法设置服务器 GC 模式:

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

在服务的app.config 文件中解决了它。

阅读 Tess Ferrandez 博客中的this post 了解更多详情。

【讨论】:

    【解决方案2】:

    我很惊讶您的搜索方法甚至触发了 GC,如果 8GB 数据结构是静态的(没有通过添加或删除对其进行大量修改),而您所做的只是搜索它,那么您应该尽量避免分配搜索方法中的临时对象(如果可以的话)。创建对象是触发 GC 的事情,如果您有一个很少修改的数据结构,那么一起避免 GC(或尽可能延迟它)是有意义的。

    GCSettings.LowLatency 的作用是提示 GC 进行急切收集,这样我们就可以在设置 LowLatency 模式时避免 Gen2 收集。这样做的副作用是让 GC 急于在设置了 LowLatency 模式的区域之外收集,并可能导致性能降低(在这种情况下,您可以尝试服务器 GC 模式)。

    【讨论】:

      【解决方案3】:

      这听起来不是个好主意。在某些时候,GC 会忽略您的提示并进行收集。

      我相信,通过实际分析和优化您的服务,您会取得更大的成功。在服务器运行时在您的服务器上运行PerfView(免费、真棒、Microsoft 工具)。查看谁拥有麻烦的对象以及特定长时间运行的 GC 事件需要多长时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        相关资源
        最近更新 更多