这是我的第一篇文章,所以如果我错过了任何指导方针,请多多包涵。
我正在实现一个动态限制键的解决方案,它围绕一个必须在每个请求之前锁定的字典(因为多个线程可以同时请求和修改同一个键)。正如预期的那样,字典中的项目数无关紧要,但正在使用的线程数会增加锁争用。
如果我无法锁定字典,我会返回 OK,以免耽误调用者。每次成功锁定大约需要 5us,每次不成功大约需要 600uS。因此,锁争用不仅会导致可能被限制的密钥被允许继续进行,而且还需要大量时间。锁定机制是使用 Monitor.TryEnter。
测试参数:字典中的 20k 项,等权重
使用 10 个线程,我得到 140k tps,6% 的锁争用 使用 20 个线程,我得到 90k tps,10% 的锁争用 使用 30 个线程,我得到 80k tps,14% 的锁争用
虽然这些 TPS 数字高得离谱,可能永远不会在单个盒子上命中,但当访问线程的数量很高时问题仍然存在,即使 TPS 较低。
改善这种情况的最佳方法是什么?也许我可以为多个字典提供一个带有单独锁的分片机制,并单独查找以查找要使用的字典?
谢谢 :)