GCLatencyMode.LowLatency是一个不错的选择吗?

Luc*_*tti 4 .net c# performance garbage-collection

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

平均搜索操作在<200ms内执行,服务最多可处理20个请求/秒.

我注意到一些严重的性能下降(> 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是一个好主意吗?

在什么条件下,GC会在低延迟块内进行?

注意:我在运行8核的x64服务器上运行

谢谢

adr*_*nks 9

我以前没用过GCLatencyMode,所以不能评论是否使用它是一个好主意.

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

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

<configuration>
    <runtime>
        <gcServer enabled="true" />
    </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

阅读Tess Ferrandez博客上的这篇文章,了解更多细节.