From: Samuel Just Date: Mon, 22 Oct 2012 18:09:18 +0000 (-0700) Subject: Finisher: add perf counter for queue len X-Git-Tag: v0.55~130^2~41^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=550ef509ed769f307a23e32ed3c5d35d37cf3199;p=ceph.git Finisher: add perf counter for queue len Signed-off-by: Samuel Just --- diff --git a/src/common/Finisher.cc b/src/common/Finisher.cc index be4bba5f11d..c2029f2d668 100644 --- a/src/common/Finisher.cc +++ b/src/common/Finisher.cc @@ -62,6 +62,8 @@ void *Finisher::finisher_thread_entry() delete c; ls_rval.pop_front(); } + if (logger) + logger->dec(l_finisher_queue_len); } ldout(cct, 10) << "finisher_thread done with " << ls << dendl; ls.clear(); diff --git a/src/common/Finisher.h b/src/common/Finisher.h index f727968b249..eb2ac243c99 100644 --- a/src/common/Finisher.h +++ b/src/common/Finisher.h @@ -19,9 +19,16 @@ #include "common/Mutex.h" #include "common/Cond.h" #include "common/Thread.h" +#include "common/perf_counters.h" class CephContext; +enum { + l_finisher_first = 997082, + l_finisher_queue_len, + l_finisher_last +}; + class Finisher { CephContext *cct; Mutex finisher_lock; @@ -29,6 +36,7 @@ class Finisher { bool finisher_stop, finisher_running; vector finisher_queue; list > finisher_queue_rval; + PerfCounters *logger; void *finisher_thread_entry(); @@ -48,6 +56,8 @@ class Finisher { finisher_queue.push_back(c); finisher_cond.Signal(); finisher_lock.Unlock(); + if (logger) + logger->inc(l_finisher_queue_len); } void queue(vector& ls) { finisher_lock.Lock(); @@ -55,6 +65,8 @@ class Finisher { finisher_cond.Signal(); finisher_lock.Unlock(); ls.clear(); + if (logger) + logger->inc(l_finisher_queue_len); } void queue(deque& ls) { finisher_lock.Lock(); @@ -62,6 +74,8 @@ class Finisher { finisher_cond.Signal(); finisher_lock.Unlock(); ls.clear(); + if (logger) + logger->inc(l_finisher_queue_len); } void start(); @@ -69,8 +83,30 @@ class Finisher { void wait_for_empty(); - Finisher(CephContext *cct_) : cct(cct_), finisher_lock("Finisher::finisher_lock"), - finisher_stop(false), finisher_running(false), finisher_thread(this) {} + Finisher(CephContext *cct_) : + cct(cct_), finisher_lock("Finisher::finisher_lock"), + finisher_stop(false), finisher_running(false), + logger(0), + finisher_thread(this) {} + Finisher(CephContext *cct_, string name) : + cct(cct_), finisher_lock("Finisher::finisher_lock"), + finisher_stop(false), finisher_running(false), + logger(0), + finisher_thread(this) { + PerfCountersBuilder b(cct, string("finisher-") + name, + l_finisher_first, l_finisher_last); + b.add_fl_avg(l_finisher_queue_len, "queue_len"); + logger = b.create_perf_counters(); + cct->get_perfcounters_collection()->add(logger); + logger->set(l_finisher_queue_len, 0); + } + + ~Finisher() { + if (logger && cct) { + cct->get_perfcounters_collection()->remove(logger); + delete logger; + } + } }; class C_OnFinisher : public Context {