我已经整理了一个简单的键值存储,它代表了Redis协议的一个子集。它使用Linux上的pthread来共享哈希表;我使用pthreads rwlocks来管理对该表的访问。我一直在使用Redis基准测试工具测试K-V商店。
使用单个客户端,我可以每秒执行大约2500次SET操作。但是,它每秒只能做到大约25次GET;我期待相反的方式,所以这让我感到惊讶。它在一定程度上扩展,所以如果我抛出10个客户端,我将获得每秒近9000个SET和每秒250 GET。
我的GET代码非常简单;我锁定表,找到适当的哈希表位置,并在那里检查链表中的匹配键。对于GET,我完成后会使用pthread_rwlock_rdlock
和pthread_rwlock_unlock
。对于SET,我使用pthread_rwlock_wrlock
和pthread_rwlock_unlock
。 SET比GET复杂得多。
我还使用共享内存进程和它们自己的读/写锁实现使代码在Plan 9上运行。在那里,GET几乎和SET一样快,而不是慢100倍。这让我觉得我的哈希表代码可能没问题;我对两个操作系统使用完全相同的哈希表代码,我只是使用#defines为每个操作系统选择适当的锁(两种情况下接口都相同,幸运!)。
我对pthreads不太熟悉。任何人都可以帮我弄清楚为什么我的表现如此糟糕?
(注意:这并不意味着是一个高性能的KV商店,它意味着一个天真的书面测试应用程序/基准测试。它通过为每个人分离一个新线程来处理关于最简单方法的请求。客户端)
答案 0 :(得分:1)
我不知道rwlocks,但我使用pthreads进行条件锁的经验是,使用实时内核可以更快地唤醒条件。您甚至可以使用chrt
命令调整程序优先级。