1

我正在使用螃蟹技术开发 B+Tree 的内存版本(在释放父锁之前,您必须获得子锁)。

我的目标实现语言是 C# 在我的实现中我有一个支持Dictionary<Page, Node>,对于 XS 和 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 core 线性上升到 3 。但在开始一段时间后,它平均恢复到 1.5 个核心,并且核心使用率变得恒定。在并行分析器中,我看到在峰值之前 3 个核心进程大部分都在休眠,但在峰值之后,它们开始互相等待被阻塞。

任何人都可以提出任何想法,我应该在哪里查看问题或我使用的方法有哪些缺陷。

谢谢。

4

0 回答 0