gpt4 book ai didi

c# - .NET 垃圾收集器的麻烦。 block 15-40 分钟

转载 作者:太空狗 更新时间:2023-10-29 19:40:58 24 4
gpt4 key购买 nike

一些事实:我们开发了 wcf 服务,充当客户端和数据库之间的层。它是自托管的并作为 Windows 服务运行。

该服务保留多个缓存,其中最大的内存约为 1-2gb。总内存使用量通常约为 5-8gb。连接是双工的,使用 tcp 协议(protocol),序列化是用 protobuf-net 进行的。我们连接的客户数量通常在 1000-1500 之间。服务器是新型号的 8 核至强处理器,内存为 64GB,仅运行服务。

问题:x 时间后,从一天到一周,服务变得非常缓慢。需要 0.5 秒的请求可能需要一分钟多的时间。此行为会持续 15-40 分钟或直到服务重新启动。

我们做了什么:我们已经检查了网络和与服务器的网络连接,没有问题。 f.eks 在此期间 CPU 利用率有所上升。平均 30% 至 40-50%。我们进行了内存转储,并且代码中没有逻辑锁来阻止用户,也没有太多事件。我们最新的领导是垃圾收集器。在 perfmon 中,我们可以看到“% time in gc”不断超过 90%,(90-97%) 并且收集计数上升。 GC0 和 GC1。我们怀疑 GC2 也在运行,但我们不得不重新启动该服务,因为它正在生产中,因此在我们运行 perfmon 的 5 分钟窗口内它没有计数。内存使用量为 7,6 Gb。注意:未完成的调用会增加,因此调用会到达那里,但服务不会处理它们。

我的问题是,垃圾收集器能否进入运行并持续阻塞超过 15 分钟的状态?或者这个问题可能与其他问题有关?

我们的服务以工作站模式和延迟模式运行 GC:交互式我们现在已将其更改为 Server 和 SustainedLowLatency,希望这会有所帮助。如果它是垃圾收集器,我们还有什么可以做的吗?

编辑:大内存使用是设计使然,缓存中的数据很大,还有更多可用内存。

最佳答案

过多的垃圾收集通常是由代码问题引起的。您要么在短时间内创建了太多对象,要么一直分配内存而不释放它。

实际上有一个extensive checklist available on MSDN这应该可以帮助您诊断问题。

非常大的 GC2 意味着其中的对象在多次垃圾回收中幸存下来,这意味着它们在内存中保留的时间更长。这可能是您问题的根本原因。也许有一种缓存机制可以使用一些调整/保留策略(删除长时间不使用的数据)。

关于c# - .NET 垃圾收集器的麻烦。 block 15-40 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28850042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com