前言
pthread_mutex 和 pthread_cond_broadcast是在多线程编程中必不可少的一个工具,其底层采用了futex实现,能够在用户态解决大部分的锁竞争,其性能是非常高效的。
背景
最近上线的一个多进程间消息队列就采用了pthread_mutex_lock和pthread_cond_t来实现pub sub模型。生产者在写入消息的时候,调用pthread_cond_broadcast来唤醒消费者。本来以为这样很完美,在测试环境也没有测出什么问题。
然而上线后上游直接报ring buffer full,定位出下游接收数据端也就是我们这边的生产者qps不够导致的,测试环境测试生产者每秒写入800w应该是没有问题的,上游qps最多也就100w怎么会有性能问题呢?
定位
经过仔细阅读代码,推测可能是在pthread_cond_broadcast的时候有一把互斥锁来保护条件,消费者对这把锁竞争太激烈,导致生产者写入数据时迟迟获取不到锁,导致qps直线下降。
写个demo测试,通过测试不同的线程数总耗时来观察是否存在这个问题。
#include <thread>
#include <pthread.h>
#include <unistd.h>
#include <sys/time.h>
pthread_mutex_t mutex_;
pthread_cond_t pcond_;
bool ready = false;
void waiter() {
while(true) {
pthread_mutex_lock(&mutex_);
pthread_cond_wait(&am