我整理了一个简单的键值存储,它使用Redis协议的一个子集。它在 Linux 上使用 pthreads 来共享哈希表;我使用 pthreads rwlocks 来管理对该表的访问。我一直在使用 Redis 基准测试工具测试 KV 存储。
使用单个客户端,我每秒可以执行大约 2500 次 SET 操作。但是,它每秒只能执行大约 25 次 GET;我期待相反的方式,所以这让我感到惊讶。它在一定程度上可以扩展,所以如果我向它扔 10 个客户端,我将每秒获得近 9000 个 SET 和大约 250 个 GET 每秒。
我的 GET 代码非常简单;我锁定表,找到适当的哈希表位置,并在那里检查链表中的匹配键。对于 GET,我在完成时使用pthread_rwlock_rdlock
和pthread_rwlock_unlock
。对于 SET,我使用pthread_rwlock_wrlock
and pthread_rwlock_unlock
。SET 比 GET 复杂得多。
我还使用共享内存进程和它们自己的读/写锁实现使代码在计划 9 上运行。在那里,GET 几乎和 SET 一样快,而不是慢 100 倍。这让我觉得我的哈希表代码可能没问题;我对两个操作系统使用完全相同的哈希表代码,我只是使用#defines 为每个操作系统选择适当的锁(两种情况下的接口都是相同的,幸运!)。
我对pthreads不是很有经验。谁能帮我弄清楚为什么我的表现如此糟糕?
(注意:这并不是一个高性能的 KV 存储,它是一个天真的编写的测试应用程序/基准测试。它以尽可能简单的方法处理请求,通过为每个客户端分离一个新线程)