]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/kstore: Latency breakdown in each stage of transaction for Kstore 7850/head
authorJames Liu <james.liu@ssi.samsung.com>
Tue, 1 Mar 2016 00:11:25 +0000 (16:11 -0800)
committerJames Liu <james.liu@ssi.samsung.com>
Tue, 1 Mar 2016 18:29:36 +0000 (10:29 -0800)
Signed-off-by: James Liu <james.liu@ssi.samsung.com>
src/os/kstore/KStore.cc
src/os/kstore/KStore.h

index 3ae9cc4c6e9b1a40505bd9c07de946a3c541f408..3b44b0ec25f5b9fe2876b209ffb561be2aafa72e 100644 (file)
@@ -652,11 +652,22 @@ KStore::~KStore()
 void KStore::_init_logger()
 {
   // XXX
+  PerfCountersBuilder b(g_ceph_context, "KStore",
+                        l_kstore_first, l_kstore_last);
+  b.add_time_avg(l_kstore_state_prepare_lat, "state_prepare_lat", "Average prepare state latency");
+  b.add_time_avg(l_kstore_state_kv_queued_lat, "state_kv_queued_lat", "Average kv_queued state latency");
+  b.add_time_avg(l_kstore_state_kv_done_lat, "state_kv_done_lat", "Average kv_done state latency");
+  b.add_time_avg(l_kstore_state_finishing_lat, "state_finishing_lat", "Average finishing state latency");
+  b.add_time_avg(l_kstore_state_done_lat, "state_done_lat", "Average done state latency");
+  logger = b.create_perf_counters();
+  g_ceph_context->get_perfcounters_collection()->add(logger);
 }
 
 void KStore::_shutdown_logger()
 {
   // XXX
+  g_ceph_context->get_perfcounters_collection()->remove(logger);
+  delete logger;
 }
 
 int KStore::_open_path()
@@ -2170,6 +2181,7 @@ void KStore::_txc_state_proc(TransContext *txc)
             << " " << txc->get_state_name() << dendl;
     switch (txc->state) {
     case TransContext::STATE_PREPARE:
+      txc->log_state_latency(logger, l_kstore_state_prepare_lat);
       txc->state = TransContext::STATE_KV_QUEUED;
       if (!g_conf->kstore_sync_transaction) {
        std::lock_guard<std::mutex> l(kv_lock);
@@ -2184,15 +2196,18 @@ void KStore::_txc_state_proc(TransContext *txc)
       break;
 
     case TransContext::STATE_KV_QUEUED:
+      txc->log_state_latency(logger, l_kstore_state_kv_queued_lat);
       txc->state = TransContext::STATE_KV_DONE;
       _txc_finish_kv(txc);
       // ** fall-thru **
 
     case TransContext::STATE_KV_DONE:
+      txc->log_state_latency(logger, l_kstore_state_kv_done_lat);
       txc->state = TransContext::STATE_FINISHING;
       break;
 
     case TransContext::TransContext::STATE_FINISHING:
+      txc->log_state_latency(logger, l_kstore_state_finishing_lat);
       _txc_finish(txc);
       return;
 
@@ -2303,6 +2318,7 @@ void KStore::_osr_reap_done(OpSequencer *osr)
     }
 
     osr->q.pop_front();
+    txc->log_state_latency(logger, l_kstore_state_done_lat);
     delete txc;
     osr->qcond.notify_all();
     if (osr->q.empty())
index 1c163cce667dfaff5e4448ae8d2b280328b6f6c9..4b0066331deeac3ee3dc17dce121fc2acadea7fd 100644 (file)
@@ -30,6 +30,7 @@
 #include "common/RWLock.h"
 #include "common/WorkQueue.h"
 #include "os/ObjectStore.h"
+#include "common/perf_counters.h"
 #include "os/fs/FS.h"
 #include "kv/KeyValueDB.h"
 
 
 #include "boost/intrusive/list.hpp"
 
+enum {  
+  l_kstore_first = 832430,
+  l_kstore_state_prepare_lat,
+  l_kstore_state_kv_queued_lat,
+  l_kstore_state_kv_done_lat,
+  l_kstore_state_finishing_lat,
+  l_kstore_state_done_lat,
+  l_kstore_last
+};
+
 class KStore : public ObjectStore {
   // -----------------------------------------------------
   // types
@@ -192,6 +203,13 @@ public:
       return "???";
     }
 
+    void log_state_latency(PerfCounters *logger, int state) {      
+        utime_t lat, now = ceph_clock_now(g_ceph_context);
+        lat = now - start;
+        logger->tinc(state, lat);
+        start = now;
+    }
+
     OpSequencerRef osr;
     boost::intrusive::list_member_hook<> sequencer_item;
 
@@ -206,7 +224,7 @@ public:
     list<CollectionRef> removed_collections; ///< colls we removed
 
     CollectionRef first_collection;  ///< first referenced collection
-
+    utime_t start;
     explicit TransContext(OpSequencer *o)
       : state(STATE_PREPARE),
        osr(o),
@@ -214,7 +232,8 @@ public:
        bytes(0),
        oncommit(NULL),
        onreadable(NULL),
-       onreadable_sync(NULL) {
+       onreadable_sync(NULL),
+        start(ceph_clock_now(g_ceph_context)){
       //cout << "txc new " << this << std::endl;
     }
     ~TransContext() {
@@ -310,8 +329,8 @@ private:
   bool kv_stop;
   deque<TransContext*> kv_queue, kv_committing;
 
-  Logger *logger;
-
+  //Logger *logger;
+  PerfCounters *logger;
   std::mutex reap_lock;
   list<CollectionRef> removed_collections;