From: John Spray Date: Wed, 21 Dec 2016 11:22:30 +0000 (+0000) Subject: mds: add stats to PurgeQueue X-Git-Tag: v12.0.1~140^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d96d0b0aa0b81917a097956eb8e71ea1884f8a1c;p=ceph.git mds: add stats to PurgeQueue Signed-off-by: John Spray --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 1ae4beaab53a..f80fec6c5613 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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", diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 720f931476ed..2faef7ba25d8 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -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 diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 26bbf2a59b66..04269ef039b9 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -2410,6 +2410,7 @@ void MDSRank::create_logger() mdlog->create_logger(); server->create_logger(); + purge_queue.create_logger(); sessionmap.register_perfcounters(); mdcache->register_perfcounters(); } diff --git a/src/mds/PurgeQueue.cc b/src/mds/PurgeQueue.cc index d39b09b2cc49..5c4ba15ab3fb 100644 --- a/src/mds/PurgeQueue.cc +++ b/src/mds/PurgeQueue.cc @@ -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(); } diff --git a/src/mds/PurgeQueue.h b/src/mds/PurgeQueue.h index f6b4aa1569c3..c66a3b0a3766 100644 --- a/src/mds/PurgeQueue.h +++ b/src/mds/PurgeQueue.h @@ -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 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(); };