Joh*_*erg 8 .net c# wcf garbage-collection
一些事实:我们开发了wcf服务,充当客户端和数据库之间的层.它是自动主存并作为Windows服务运行.
该服务保留了几个缓存,其中最大的内存大约1-2gb.总内存使用量通常约为5-8gb.连接是双工的,使用tcp协议,序列化使用protobuf-net.我们的连接客户端数量通常在1000-1500之间.该服务器是一个8核xeon的新型号,内存为64GB,并且只运行该服务.
问题:经过一段时间后,从一天到一周,服务变得非常缓慢.需要0.5秒的请求可能需要一分钟.此行为持续15-40分钟或直到服务重新启动.
我们做了什么:我们检查了服务器的网络和网络连接,没有问题.从f.eks开始,这段时间CPU利用率有所上升.平均30%至40-50%.我们已经进行了内存转储,代码中没有逻辑锁来阻止用户,也没有多少活动.我们最新的领导是垃圾收集器.在perfmon中,我们可以看到"gc中的%时间"不断超过90%,(90-97%)并且收集计数增加.GC0和GC1都有.我们怀疑有一个阻止GC2运行,但我们不得不重新启动服务,因为它正在生产中,所以它在我们运行perfmon的5分钟窗口期间没有计数.内存使用量为7,6 Gb.注意:呼叫突出上升所以呼叫到达那里但服务不处理它们.
我的问题是,垃圾收集器是否可以进入运行状态并持续阻塞超过15分钟?或者问题可能与其他问题有关?
我们的服务在工作站模式和延迟模式下运行GC:交互式我们现在将其更改为Server和SustainedLowLatency,并希望这会有所帮助.如果它是垃圾收集器,还有什么我们可以做的吗?
编辑:大内存使用是按设计的,缓存中的数据很大,并且有更多的内存可用.
过多的垃圾收集通常是由代码问题引起的。您要么在短时间内创建了太多对象,要么不断分配内存而不释放它。
实际上, MSDN 上有一份内容广泛的检查表可以帮助您诊断问题。
非常大的 GC2 意味着其中的对象在多次垃圾回收中幸存下来,这意味着它们在内存中保留的时间更长。这可能是您问题的根本原因。也许有一种缓存机制可以使用一些调整/保留策略(删除长时间不使用的数据)。