我有一个作为服务器的C# Windows服务,该服务在内存中保存一些大型(>8Gb)数据结构,并通过远程调用向客户端公开搜索方法。
平均搜索操作执行时间小于200毫秒,服务每秒处理多达20个请求。
我注意到定期出现严重的性能下降(> 6000毫秒),持续几秒钟。
我最好的猜测是服务器线程不时被gen2垃圾回收器停止。
我正在考虑从服务器GC切换到工作站GC,并将我的搜索方法包装在其中以防止请求期间发生GC。
平均搜索操作执行时间小于200毫秒,服务每秒处理多达20个请求。
我注意到定期出现严重的性能下降(> 6000毫秒),持续几秒钟。
我最好的猜测是服务器线程不时被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服务器上运行。
谢谢。