]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add stats to PurgeQueue
authorJohn Spray <john.spray@redhat.com>
Wed, 21 Dec 2016 11:22:30 +0000 (11:22 +0000)
committerJohn Spray <john.spray@redhat.com>
Wed, 8 Mar 2017 10:20:58 +0000 (10:20 +0000)
Signed-off-by: John Spray <john.spray@redhat.com>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/MDSRank.cc
src/mds/PurgeQueue.cc
src/mds/PurgeQueue.h

index 1ae4beaab53ae39fb1b7666d30b5ca7bff74e8d1..f80fec6c5613c903ecea01a10b3f7e91fe7588e9 100644 (file)
@@ -7601,7 +7601,7 @@ bool MDCache::shutdown_pass()
     show_cache();
     //dump();
     return false;
-  } 
+  }
   
   // done!
   dout(2) << "shutdown done." << dendl;
@@ -12305,15 +12305,13 @@ void MDCache::register_perfcounters()
     pcb.add_u64(l_mdc_num_strays_delayed, "num_strays_delayed", "Stray dentries delayed");
     pcb.add_u64(l_mdc_num_strays_enqueuing, "num_strays_enqueuing", "Stray dentries enqueuing for purge");
 
-    pcb.add_u64(l_mdc_num_strays_purging, "num_strays_purging", "Stray dentries purging");
-    pcb.add_u64(l_mdc_num_purge_ops, "num_purge_ops", "Purge operations");
-
     pcb.add_u64_counter(l_mdc_strays_created, "strays_created", "Stray dentries created");
     pcb.add_u64_counter(l_mdc_strays_enqueued, "strays_enqueued",
-        "Stray dentries enqueued for purge", "purg");
+        "Stray dentries enqueued for purge");
     pcb.add_u64_counter(l_mdc_strays_reintegrated, "strays_reintegrated", "Stray dentries reintegrated");
     pcb.add_u64_counter(l_mdc_strays_migrated, "strays_migrated", "Stray dentries migrated");
 
+
     /* Recovery queue statistics */
     pcb.add_u64(l_mdc_num_recovering_processing, "num_recovering_processing", "Files currently being recovered");
     pcb.add_u64(l_mdc_num_recovering_enqueued, "num_recovering_enqueued",
index 720f931476eddbf10d8c562846caa3cd4cbd815c..2faef7ba25d8bae402ba632c12a6da86e33fcaa6 100644 (file)
@@ -78,13 +78,6 @@ enum {
   // How many stray dentries are currently being enqueued for purge
   l_mdc_num_strays_enqueuing,
 
-  // >> TODO populate from PurgeQueue
-  // How many stray dentries are currently enqueued for purge
-  l_mdc_num_strays_purging,
-  // How many purge RADOS ops might currently be in flight?
-  l_mdc_num_purge_ops,
-  // << TODO
-
   // How many dentries have ever been added to stray dir
   l_mdc_strays_created,
   // How many dentries have been passed on to PurgeQueue
index 26bbf2a59b66e2432fdb6b03f8dffb13b174151e..04269ef039b91d8ca2457e410b6bf98f54355edd 100644 (file)
@@ -2410,6 +2410,7 @@ void MDSRank::create_logger()
 
   mdlog->create_logger();
   server->create_logger();
+  purge_queue.create_logger();
   sessionmap.register_perfcounters();
   mdcache->register_perfcounters();
 }
index d39b09b2cc49077b0c16174c521a2e648b614bdf..5c4ba15ab3fb855f820d6fadcadd70863ac78ee5 100644 (file)
@@ -15,6 +15,7 @@
 #include "common/debug.h"
 #include "mds/mdstypes.h"
 #include "mds/CInode.h"
+#include "mds/MDCache.h"
 
 #include "PurgeQueue.h"
 
@@ -60,14 +61,6 @@ void PurgeItem::decode(bufferlist::iterator &p)
 // TODO: when we're deactivating, lift all limits on
 // how many OSD ops we're allowed to emit at a time to
 // race through the queue as fast as we can.
-// TODO: populate logger here to gather latency stat?
-//       ...and a stat for the size of the queue, if we can
-//       somehow track that?  Could do an initial pass through
-//       the whole queue to count the items at startup?
-// TODO: there is absolutely no reason to consume an inode number
-// for this.  Shoudl just give objects a string name with a rank
-// suffix, like we do for MDSTables.  Requires a little refactor
-// of Journaler.
 // TODO: if Objecter has any slow requests, take that as a hint and
 // slow down our rate of purging (keep accepting pushes though)
 PurgeQueue::PurgeQueue(
@@ -90,10 +83,32 @@ PurgeQueue::PurgeQueue(
 {
 }
 
+PurgeQueue::~PurgeQueue()
+{
+  if (logger) {
+    g_ceph_context->get_perfcounters_collection()->remove(logger.get());
+  }
+}
+
+void PurgeQueue::create_logger()
+{
+  PerfCountersBuilder pcb(g_ceph_context,
+          "purge_queue", l_pq_first, l_pq_last);
+    //pcb.add_u64(l_mdc_num_strays_purging, "num_strays_purging", "Stray dentries purging");
+   // pcb.add_u64(l_mdc_num_purge_ops, "num_purge_ops", "Purge operations");
+  pcb.add_u64(l_pq_executing, "pq_executing", "Purge queue tasks in flight");
+  pcb.add_u64_counter(l_pq_executed, "pq_executed", "Purge queue tasks executed");
+
+  logger.reset(pcb.create_perf_counters());
+  g_ceph_context->get_perfcounters_collection()->add(logger.get());
+}
+
 void PurgeQueue::init()
 {
   Mutex::Locker l(lock);
 
+  assert(logger != nullptr);
+
   finisher.start();
   timer.init();
 }
@@ -275,6 +290,7 @@ void PurgeQueue::_execute_item(
   assert(lock.is_locked_by_me());
 
   in_flight[expire_to] = item;
+  logger->set(l_pq_executing, in_flight.size());
 
   SnapContext nullsnapc;
 
@@ -341,6 +357,7 @@ void PurgeQueue::_execute_item(
     derr << "Invalid item (action=" << item.action << ") in purge queue, "
             "dropping it" << dendl;
     in_flight.erase(expire_to);
+    logger->set(l_pq_executing, in_flight.size());
     return;
   }
   assert(gather.has_subs());
@@ -371,6 +388,7 @@ void PurgeQueue::execute_item_complete(
            << std::dec << dendl;
 
   in_flight.erase(iter);
+  logger->set(l_pq_executing, in_flight.size());
 
 #if 0
   // Release resources
@@ -382,6 +400,8 @@ void PurgeQueue::execute_item_complete(
   files_purging -= 1;
 #endif
 
+  logger->inc(l_pq_executed);
+
   _consume();
 }
 
index f6b4aa1569c3b88daaf508e4fbdd5f544e9e7bfd..c66a3b0a3766b6b93faf347f92b888c2b61f3f04 100644 (file)
@@ -53,6 +53,21 @@ public:
 };
 WRITE_CLASS_ENCODER(PurgeItem)
 
+enum {
+  l_pq_first = 3500,
+  // >> TODO populate from PurgeQueue
+  // How many stray dentries are currently enqueued for purge
+  //l_mdc_num_strays_purging,
+  // How many purge RADOS ops might currently be in flight?
+  //l_mdc_num_purge_ops,
+  // << TODO
+
+  // How many items have been finished by PurgeQueue
+  l_pq_executing,
+  l_pq_executed,
+  l_pq_last
+};
+
 /**
  * A persistent queue of PurgeItems.  This class both writes and reads
  * to the queue.  There is one of these per MDS rank.
@@ -76,6 +91,8 @@ protected:
   SafeTimer timer;
   Filer filer;
   Objecter *objecter;
+  std::unique_ptr<PerfCounters> logger;
+
   Journaler journaler;
 
   // Map of Journaler offset to PurgeItem
@@ -88,7 +105,6 @@ protected:
   // Dynamic op limit per MDS based on PG count
   uint64_t max_purge_ops;
 
-  //PerfCounters *logger;
 
   bool can_consume();
 
@@ -104,6 +120,8 @@ public:
   void init();
   void shutdown();
 
+  void create_logger();
+
   // Write an empty queue, use this during MDS rank creation
   void create(Context *completion);
 
@@ -125,8 +143,7 @@ public:
       mds_rank_t rank_,
       const int64_t metadata_pool_,
       Objecter *objecter_);
-  ~PurgeQueue()
-  {}
+  ~PurgeQueue();
 };