我正在使用捕捉技术开发内存版本的B + Tree(你必须在释放锁定之前获得子锁定)。
我的实现目标语言是C#,在我的实现中我有一个支持Dictionary<Page, Node>
,对于X S和U锁存器,我对Dictionary中的每个可用节点使用不同的ReaderWriterLockSlim。所以获得SLatch基本上看起来像:
internal void SLatch(long page)
{
nodes[page].locker.EnterReadLock();
}
当我运行多线程测试时,我在树行为中看到一个非常奇怪的模式。对于测试,我使用16核心机器和10 000 000长。树密钥数是16所以有近 600 000个DataNode对象和70 000个IndexNode对象。
当我在8个线程上运行测试时,同时在树中插入值。我看到,最初的核心使用率从1核心线性上升到3核心。但是从开始一段时间后,它平均返回到1.5个核心,核心使用率变得不变。在并行分析器中,我看到在高峰3核心进程之前大部分时间都在等待,但是在高峰之后它们开始等待彼此被阻塞。
任何人都可以提出任何想法,我应该在哪里查看问题或我使用的方法有哪些缺陷。
感谢。