【发布时间】:2012-05-12 09:04:21
【问题描述】:
我整理了一个简单的键值存储,它使用Redis 协议的子集。它在 Linux 上使用 pthreads 来共享哈希表;我使用 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 复杂得多。
我还使用共享内存进程和它们自己的读/写锁实现使代码在计划 9 中运行。在那里,GET 几乎和 SET 一样快,而不是慢 100 倍。这让我觉得我的哈希表代码可能没问题;我为两个操作系统使用完全相同的哈希表代码,我只是使用#defines 为每个操作系统选择适当的锁(两种情况下的接口都是相同的,幸运!)。
我对 pthread 不是很有经验。谁能帮我弄清楚为什么我的表现如此糟糕?
(注意:这并不是一个高性能的 KV 存储,它是一个天真的编写的测试应用程序/基准测试。它以尽可能简单的方法处理请求,为每个客户)
【问题讨论】:
-
你在socket上设置
TCP_NODELAY吗? -
你能显示代码的相关部分吗?
标签: c linux locking pthreads hashtable