C# BPlusTree斜拉闩锁性能
我正在开发一个内存版本的B+树,它使用了crabbing技术(在释放父级锁之前,必须先获得子级锁) 我的目标实现语言是C#在我的实现中,我有一个支持的C# BPlusTree斜拉闩锁性能,c#,.net,locking,b-plus-tree,C#,.net,Locking,B Plus Tree,我正在开发一个内存版本的B+树,它使用了crabbing技术(在释放父级锁之前,必须先获得子级锁) 我的目标实现语言是C#在我的实现中,我有一个支持的字典,对于X S和U闩锁,我为字典中的每个可用节点使用不同的ReaderWriterLockSlim。所以获得SLatch基本上看起来像: internal void SLatch(long page) { nodes[page].locker.EnterReadLock(); } 当我运行多线程测试时,我在树行为中看到一个非常奇怪的模式
字典
,对于X S和U闩锁,我为字典中的每个可用节点使用不同的ReaderWriterLockSlim。所以获得SLatch基本上看起来像:
internal void SLatch(long page)
{
nodes[page].locker.EnterReadLock();
}
当我运行多线程测试时,我在树行为中看到一个非常奇怪的模式。在测试中,我使用了16芯机器和10000长的机器。树键计数为16,因此有近
600000个DataNode对象和70000个IndexNode对象
当我在8个线程上运行测试时,同时在树中插入值。我看到,在第一个核心的使用率是线性上升,从1个核心到3个。但从一开始一段时间后,它平均恢复到1.5个内核,并且内核使用率变得恒定。在并行探查器中,我看到在峰值3之前,进程基本上都在休眠,彼此等待,但在峰值之后,它们开始等待对方被阻塞
有人能提出一些想法吗?我应该在哪里寻找问题,或者我使用的方法有哪些缺陷
谢谢。如果没有白盒分析,我想没什么好做的——你的资料有吗?