#2135·garnet

LightEpoch: 在 epoch-table 竞争下, waiterSemaphore 计数无限增长 → SemaphoreFullException 会杀死每个会话,并永久停止过期/收集任务 (v1.0.98 → v2.1.7)

作者: gabrieltarpian25创建于 2026年9月15日更新于 2026年9月16日

环境 Garnet 1.1.8,独立运行,Windows Server 2022,.NET 10.0.8,x64,24 个逻辑处理器 → kTableSize = max(128, 242) = 128 非默认选项:MemorySize 5g,PageSize 4m,IndexSize 64m,IndexMaxSize 1g,ObjectStoreHeapMemorySize 1g,SegmentSize 16m,ObjectStoreSegmentSize 16m,EnableStorageTier false,CompactionType None,ExpiredKeyDeletionScanFrequencySecs 120,ExpiredObjectCollectionFrequencySecs 60,LogLevel Information 工作负载:~35 个客户端进程(StackExchange.Redis)驱动一个数百万个键的文件处理管线;混合 SET/GET/HSET/HGET/HDEL/HEXISTS/RPUSH/LINDEX/LRANGE/LREM/INFO 我们观察到的情况 Garnet 在启动后运行了约 47 小时,然后: [2026-09-10 07:40:50.5731] (Critical) [127.0.0.1:54366] ProcessMessages 发生了异常: System.Threading.SemaphoreFullException: 向信号量添加指定的数量会导致其超过最大数量。 at System.Threading.SemaphoreSlim.Release(Int32 releaseCount) at Garnet.server.GarnetApi`3.SET(ArgSlice key, ArgSlice value) in //libs/server/API/GarnetApi.cs:line 172 at Garnet.server.RespServerSession.NetworkSET[TGarnetApi](TGarnetApi& storageApi) in //libs/server/Resp/BasicCommands.cs:line 287 at Garnet.server.RespServerSession.ProcessMessages() in /_/libs/server/Resp/RespServerSession.cs:line 639 at Garnet.server.RespServerSession.TryConsumeMessages(Byte reqBuffer, Int32 bytesReceived) in /_/libs/server/Resp/RespServerSession.cs:line 484 (LightEpoch.Release() 采用了积极内联,因此通常会被消除从日志中,但在 SuspendResume 路径上显式出现。) 开始时是一个同步的爆发,而不是一个

内容来源: microsoft/garnet