From 078f4c97f16dce426627f81a863a128d131d8c10 Mon Sep 17 00:00:00 2001 From: Bert Hubert Date: Wed, 3 Oct 2012 13:53:21 +0000 Subject: [PATCH] remove global distributor and replace by 1 distributor per receiver thread, thanks to Mark Zealey, who reports fourfold speedups this way. see http://wiki.powerdns.com/trac/ticket/583 for details git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2731 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- pdns/common_startup.cc | 21 ++++----------------- pdns/distributor.hh | 8 +++++--- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/pdns/common_startup.cc b/pdns/common_startup.cc index baedec590..bb289f1cc 100644 --- a/pdns/common_startup.cc +++ b/pdns/common_startup.cc @@ -212,15 +212,11 @@ void sendout(const DNSDistributor::AnswerData &AD) delete AD.A; } -static DNSDistributor* g_distributor; -static pthread_mutex_t d_distributorlock =PTHREAD_MUTEX_INITIALIZER; -static bool g_mustlockdistributor; - //! The qthread receives questions over the internet via the Nameserver class, and hands them to the Distributor for further processing void *qthread(void *number) { DNSPacket *P; - + DNSDistributor *distributor = new DNSDistributor(::arg().asNum("distributor-threads")); // the big dispatcher! DNSPacket question; DNSPacket cached; @@ -240,7 +236,7 @@ void *qthread(void *number) if(!((numreceived++)%250)) { // maintenance tasks S.set("latency",(int)avg_latency); int qcount, acount; - g_distributor->getQueueSizes(qcount, acount); + distributor->getQueueSizes(qcount, acount); S.set("qsize-q",qcount); } } @@ -291,7 +287,7 @@ void *qthread(void *number) continue; } - if(g_distributor->isOverloaded()) { + if(distributor->isOverloaded()) { if(logDNSQueries) L<<"Dropped query, db is overloaded"<question(P, &sendout); // otherwise, give to the distributor - } - else - g_distributor->question(P, &sendout); // otherwise, give to the distributor + distributor->question(P, &sendout); // otherwise, give to the distributor } return 0; } @@ -361,10 +352,6 @@ void mainthread() TN->go(); // tcp nameserver launch // fork(); (this worked :-)) - g_distributor = new DNSDistributor(::arg().asNum("distributor-threads")); // the big dispatcher! - if(::arg().asNum("receiver-threads") > 1) { - g_mustlockdistributor=true; - } unsigned int max_rthreads= ::arg().asNum("receiver-threads"); for(unsigned int n=0; n < max_rthreads; ++n) pthread_create(&qtid,0,qthread, reinterpret_cast(n)); // receives packets diff --git a/pdns/distributor.hh b/pdns/distributor.hh index bdca89bb6..38784e0d5 100644 --- a/pdns/distributor.hh +++ b/pdns/distributor.hh @@ -171,15 +171,16 @@ templatevoid *Distributorquestions.front(); + us->questions.pop(); + pthread_mutex_unlock(&us->q_lock); + Question *q=QD.Q; - us->questions.pop(); if(us->d_overloaded && qcount <= overloadQueueLength/10) { us->d_overloaded=false; } - pthread_mutex_unlock(&us->q_lock); Answer *a; #ifndef SMTPREDIR @@ -297,11 +298,12 @@ templateint Distributor(this)); } - pthread_mutex_lock(&q_lock); QuestionData QD; QD.Q=q; QD.id=nextid++; QD.callback=callback; + + pthread_mutex_lock(&q_lock); questions.push(QD); pthread_mutex_unlock(&q_lock); -- 2.40.0