访问字典时改进锁争用的建议

时间:2018-04-18 17:31:31

标签: c# dictionary locking monitor contention

这是我的第一篇文章,如果我错过了任何指导方针,请耐心等待。

我正在实施一个动态限制密钥的解决方案,它围绕着一个必须在每个请求之前被锁定的字典(因为多个线程可以同时请求和修改相同的密钥)。正如预期的那样,字典中的项目数无关紧要,但正在使用的线程数会增加锁争用。

如果我无法锁定字典,我只需返回OK,以免延迟调用者。每次成功锁定大约需要5us,每次失败大约600uS。因此,锁争用不仅会导致允许进行潜在的限制密钥,还需要花费大量时间。锁定机制正在使用Monitor.TryEnter。

测试参数:字典中的20k项,等加权

有10个线程,我得到140k tps,锁定争用率为6% 有20个线程,我获得90k tps,锁定争用率为10% 有30个线程,我获得80k tps,锁定争用率为14%

虽然这些TPS数量非常高,可能永远不会被打到一个盒子上,但是当访问线程的数量很高时,问题仍然存在,即使TPS较低。

改善这种情况的最佳方法是什么?也许我可以为多个词典提供单独锁定的分片机制,并进行单独查找以查找要使用的字典?

谢谢:)

0 个答案:

没有答案