【问题标题】:Poor performance of reads in pthreads hash table using read-write locks使用读写锁在 pthreads 哈希表中读取性能不佳
【发布时间】: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_rdlockpthread_rwlock_unlock。对于 SET,我使用 pthread_rwlock_wrlockpthread_rwlock_unlock。 SET 比 GET 复杂得多。

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

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

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

【问题讨论】:

  • 你在socket上设置TCP_NODELAY吗?
  • 你能显示代码的相关部分吗?

标签: c linux locking pthreads hashtable


【解决方案1】:

我不知道 rwlocks,但我使用 pthreads 条件锁的经验是,使用实时内核可以更快地唤醒条件。您甚至可以使用chrtcommand 调整程序优先级。

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2021-01-22
    • 2011-08-19
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多