2

我整理了一个简单的键值存储,它使用Redis协议的一个子集。它在 Linux 上使用 pthreads 来共享哈希表;我使用 pthreads rwlocks 来管理对该表的访问。我一直在使用 Redis 基准测试工具测试 KV 存储。

使用单个客户端,我每秒可以执行大约 2500 次 SET 操作。但是,它每秒只能执行大约 25 次 GET;我期待相反的方式,所以这让我感到惊讶。它在一定程度上可以扩展,所以如果我向它扔 10 个客户端,我将每秒获得近 9000 个 SET 和大约 250 个 GET 每秒。

我的 GET 代码非常简单;我锁定表,找到适当的哈希表位置,并在那里检查链表中的匹配键。对于 GET,我在完成时使用pthread_rwlock_rdlockpthread_rwlock_unlock。对于 SET,我使用pthread_rwlock_wrlockand pthread_rwlock_unlock。SET 比 GET 复杂得多。

我还使用共享内存进程和它们自己的读/写锁实现使代码在计划 9 上运行。在那里,GET 几乎和 SET 一样快,而不是慢 100 倍。这让我觉得我的哈希表代码可能没问题;我对两个操作系统使用完全相同的哈希表代码,我只是使用#defines 为每个操作系统选择适当的锁(两种情况下的接口都是相同的,幸运!)。

我对pthreads不是很有经验。谁能帮我弄清楚为什么我的表现如此糟糕?

(注意:这并不是一个高性能的 KV 存储,它是一个天真的编写的测试应用程序/基准测试。它以尽可能简单的方法处理请求,通过为每个客户端分离一个新线程)

4

1 回答 1

1

I don't know rwlocks but the experience I made with conditional locks with pthreads was, that with a realtime kernel the conditions were woken up faster. You can even tune the programs priority with chrtcommand.

于 2012-06-03T11:56:09.230 回答