一些事实:
我们开发了一个WCF服务,它充当客户端和数据库之间的层。它是自托管的,并作为Windows服务运行。
该服务保持了几个缓存,其中最大的缓存在1-2GB内存范围内。总内存使用量通常约为5-8GB。连接是双工的,使用TCP协议,并且序列化是用protobuf-net完成的。我们连接的客户端数通常在1000-1500之间。
服务器是一台新型的8核Xeon,具有64GB内存,并且只运行服务。
问题:在一定时间后,从一天到一周不等,服务变得极其缓慢。需要0.5秒的请求可能需要超过一分钟。这种行为会持续15-40分钟,或直到重新启动服务。
我们所做的: 我们已经检查了网络和与服务器的网络连接,没有问题。此时CPU利用率稍微上升,例如平均值从30%增加到40-50%的平均值。 我们已经获取了内存转储,代码中没有逻辑锁定阻止用户,并且基本上没有任何活动。 我们最近的线索是垃圾回收器。在perfmon中,我们可以看到“%time in gc”不断超过90%(90-97%),并且收集计数上升。两者都是GC0和GC1。我们怀疑还有一个阻塞的GC2正在运行,但由于这是在生产中,所以我们不得不重新启动服务,因此它没有在我们运行perfmon的5分钟窗口期间计算。内存使用量为7.6 GB。 注意:未处理调用会增加,因此调用会到达,但服务无法处理它们。
我的问题是,垃圾回收器是否可能处于运行和阻止状态超过15分钟?或者问题可能与其他问题有关?
我们的服务在工作站模式下运行GC,并且latencymode:Interactive 现在我们已将其更改为Server和SustainedLowLatency,并希望这会有所帮助。如果是垃圾回收器,我们还能做些什么吗?
编辑:大内存使用是设计要求,缓存中的数据很大,并且还有很多可用内存。
该服务保持了几个缓存,其中最大的缓存在1-2GB内存范围内。总内存使用量通常约为5-8GB。连接是双工的,使用TCP协议,并且序列化是用protobuf-net完成的。我们连接的客户端数通常在1000-1500之间。
服务器是一台新型的8核Xeon,具有64GB内存,并且只运行服务。
问题:在一定时间后,从一天到一周不等,服务变得极其缓慢。需要0.5秒的请求可能需要超过一分钟。这种行为会持续15-40分钟,或直到重新启动服务。
我们所做的: 我们已经检查了网络和与服务器的网络连接,没有问题。此时CPU利用率稍微上升,例如平均值从30%增加到40-50%的平均值。 我们已经获取了内存转储,代码中没有逻辑锁定阻止用户,并且基本上没有任何活动。 我们最近的线索是垃圾回收器。在perfmon中,我们可以看到“%time in gc”不断超过90%(90-97%),并且收集计数上升。两者都是GC0和GC1。我们怀疑还有一个阻塞的GC2正在运行,但由于这是在生产中,所以我们不得不重新启动服务,因此它没有在我们运行perfmon的5分钟窗口期间计算。内存使用量为7.6 GB。 注意:未处理调用会增加,因此调用会到达,但服务无法处理它们。
我的问题是,垃圾回收器是否可能处于运行和阻止状态超过15分钟?或者问题可能与其他问题有关?
我们的服务在工作站模式下运行GC,并且latencymode:Interactive 现在我们已将其更改为Server和SustainedLowLatency,并希望这会有所帮助。如果是垃圾回收器,我们还能做些什么吗?
编辑:大内存使用是设计要求,缓存中的数据很大,并且还有很多可用内存。