【发布时间】:2017-03-11 15:09:08
【问题描述】:
我有一个服务器应用程序,它每秒 50 次从多个传感器接收大量 UDP 数据包(每 20 毫秒新数据包),进行一些分析、存储它们、进行一些调试日志记录和其他“服务器内容”。
问题在于 GC 每隔一段时间执行一次完全阻塞收集,暂停 所有线程 长达 200 毫秒(在某些罕见的百分位数中可能甚至更多)。我对每个数据包滞后几毫秒没有问题(即使每个数据包持续延迟 10 毫秒也不成问题),但长时间暂停真的很烦人。
根据 MSDN,GC 有 SustainedLowLatency mode,根据 MSDN:
启用垃圾回收,以尽量减少长时间的延迟。收集器尝试仅执行第 0 代、第 1 代和并发第 2 代收集。
如果系统处于内存压力之下,仍可能发生完全阻塞收集。
-
“延长期限”是否仍然意味着我不能简单地将模式设置为
SustainedLowLatency而忘记它? -
有什么方法可以防止完全阻塞集合,至少对于单核?
【问题讨论】:
-
启用垃圾收集,尝试在较长时间内尽量减少延迟。 意味着中等延迟会很低...偶尔它会很高。 至少对于单个核心这并不意味着什么...如果它被阻塞,那么它将阻塞所有应用程序:-)
标签: c# .net garbage-collection udp low-latency