]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add perf counters for openfiletable 33363/head
authorMilind Changire <mchangir@redhat.com>
Wed, 26 Feb 2020 06:39:57 +0000 (12:09 +0530)
committerMilind Changire <mchangir@redhat.com>
Wed, 26 Feb 2020 06:39:58 +0000 (12:09 +0530)
Add perf counters for:
* total omap objects
* total omap key-value pairs
* total omap updates
* total omap removes

Fixes: https://tracker.ceph.com/issues/43750
Signed-off-by: Milind Changire <mchangir@redhat.com>
qa/tasks/cephfs/test_openfiletable.py
src/mds/OpenFileTable.cc
src/mds/OpenFileTable.h

index 5a3c48cd3a152b3f789c461ec444e4d0de58ab6f..24f84e842c1fda74ca3def07c47b54a3120746d0 100644 (file)
@@ -1,12 +1,21 @@
 import time
+import logging
 from cephfs_test_case import CephFSTestCase
 from teuthology.exceptions import CommandFailedError
 from tasks.cephfs.cephfs_test_case import CephFSTestCase, for_teuthology
 
+log = logging.getLogger(__name__)
+
 class OpenFileTable(CephFSTestCase):
     CLIENTS_REQUIRED = 1
     MDSS_REQUIRED = 1
 
+    def _check_oft_counter(self, name, count):
+        perf_dump = self.fs.mds_asok(['perf', 'dump'])
+        if perf_dump['oft'][name] == count:
+            return True
+        return False
+
     def test_max_items_per_obj(self):
         """
         The maximum number of openfiles omap objects keys are now equal to
@@ -39,3 +48,40 @@ class OpenFileTable(CephFSTestCase):
 
         # Now close the file
         self.mount_a.kill_background(p)
+
+    def test_perf_counters(self):
+        """
+        Opening a file should increment omap_total_updates by 1.
+        """
+
+        self.set_conf("mds", "osd_deep_scrub_large_omap_object_key_threshold", "1")
+        self.fs.mds_restart()
+        self.fs.wait_for_daemons()
+
+        perf_dump = self.fs.mds_asok(['perf', 'dump'])
+        omap_total_updates_0 = perf_dump['oft']['omap_total_updates']
+        log.info("omap_total_updates_0:{}".format(omap_total_updates_0))
+        
+        # Open the file
+        p = self.mount_a.open_background("omap_counter_test_file")
+        self.wait_until_true(lambda: self._check_oft_counter('omap_total_updates', 2), timeout=30)
+        
+        perf_dump = self.fs.mds_asok(['perf', 'dump'])
+        omap_total_updates_1 = perf_dump['oft']['omap_total_updates']
+        log.info("omap_total_updates_1:{}".format(omap_total_updates_1))
+        
+        self.assertTrue((omap_total_updates_1 - omap_total_updates_0) == 2)
+        
+        # Now close the file
+        self.mount_a.kill_background(p)
+        # Ensure that the file does not exist any more
+        self.wait_until_true(lambda: self._check_oft_counter('omap_total_removes', 1), timeout=30)
+        self.wait_until_true(lambda: self._check_oft_counter('omap_total_kv_pairs', 1), timeout=30)
+
+        perf_dump = self.fs.mds_asok(['perf', 'dump'])
+        omap_total_removes = perf_dump['oft']['omap_total_removes']
+        omap_total_kv_pairs = perf_dump['oft']['omap_total_kv_pairs']
+        log.info("omap_total_removes:{}".format(omap_total_removes))
+        log.info("omap_total_kv_pairs:{}".format(omap_total_kv_pairs))
+        self.assertTrue(omap_total_removes == 1)
+        self.assertTrue(omap_total_kv_pairs == 1)
index 4c79cca9a5809f920c985ead679d962bc7a3736b..6bd310c82f17d5efbc18e9cb13416fa1acb5e4a7 100644 (file)
 #include "common/config.h"
 #include "common/errno.h"
 
+enum {
+  l_oft_first = 1000000,
+  l_oft_omap_total_objs,
+  l_oft_omap_total_kv_pairs,
+  l_oft_omap_total_updates,
+  l_oft_omap_total_removes,
+  l_oft_last
+};
+
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_mds
 #undef dout_prefix
@@ -31,6 +40,27 @@ static ostream& _prefix(std::ostream *_dout, MDSRank *mds) {
   return *_dout << "mds." << mds->get_nodeid() << ".openfiles ";
 }
 
+OpenFileTable::OpenFileTable(MDSRank *m) : mds(m) {
+  PerfCountersBuilder b(mds->cct, "oft", l_oft_first, l_oft_last);
+
+  b.add_u64(l_oft_omap_total_objs, "omap_total_objs");
+  b.add_u64(l_oft_omap_total_kv_pairs, "omap_total_kv_pairs");
+  b.add_u64(l_oft_omap_total_updates, "omap_total_updates");
+  b.add_u64(l_oft_omap_total_removes, "omap_total_removes");
+  logger.reset(b.create_perf_counters());
+  mds->cct->get_perfcounters_collection()->add(logger.get());
+  logger->set(l_oft_omap_total_objs, 0);
+  logger->set(l_oft_omap_total_kv_pairs, 0);
+  logger->set(l_oft_omap_total_updates, 0);
+  logger->set(l_oft_omap_total_removes, 0);
+}
+
+OpenFileTable::~OpenFileTable() {
+  if (logger) {
+    mds->cct->get_perfcounters_collection()->remove(logger.get());
+  }
+}
+
 void OpenFileTable::get_ref(CInode *in)
 {
   do {
@@ -536,8 +566,8 @@ void OpenFileTable::commit(MDSContext *c, uint64_t log_seq, int op_prio)
     loaded_dirfrags.clear();
   }
 
+  size_t total_items = 0;
   {
-    size_t total_items = 0;
     unsigned used_objs = 1;
     std::vector<unsigned> objs_to_write;
     bool journaled = false;
@@ -588,6 +618,9 @@ void OpenFileTable::commit(MDSContext *c, uint64_t log_seq, int op_prio)
     ceph_assert(!gather.has_subs());
   }
 
+  uint64_t total_updates = 0;
+  uint64_t total_removes = 0;
+
   for (unsigned omap_idx = 0; omap_idx < omap_updates.size(); omap_idx++) {
     auto& ctl = omap_updates[omap_idx];
     ceph_assert(ctl.to_update.empty() && ctl.to_remove.empty());
@@ -603,6 +636,7 @@ void OpenFileTable::commit(MDSContext *c, uint64_t log_seq, int op_prio)
        ctl.write_size = 0;
        first = false;
       }
+      total_updates++;
     }
 
     for (auto& key : ctl.journaled_remove) {
@@ -613,6 +647,7 @@ void OpenFileTable::commit(MDSContext *c, uint64_t log_seq, int op_prio)
        ctl.write_size = 0;
        first = false;
       }
+      total_removes++;
     }
 
     for (unsigned i = 0; i < ctl.journal_idx; ++i) {
@@ -636,6 +671,10 @@ void OpenFileTable::commit(MDSContext *c, uint64_t log_seq, int op_prio)
   } else {
     submit_ops_func();
   }
+  logger->set(l_oft_omap_total_objs, omap_num_objs);
+  logger->set(l_oft_omap_total_kv_pairs, total_items);
+  logger->inc(l_oft_omap_total_updates, total_updates);
+  logger->inc(l_oft_omap_total_removes, total_removes);
 }
 
 class C_IO_OFT_Load : public MDSIOContextBase {
index 70d4c09b42d5b66f99d887c21fa7f0ecb9076afa..15885909424c6950b137810e48c039c048a0bb50 100644 (file)
@@ -27,7 +27,8 @@ class MDSRank;
 class OpenFileTable
 {
 public:
-  explicit OpenFileTable(MDSRank *m) : mds(m) {}
+  explicit OpenFileTable(MDSRank *m);
+  ~OpenFileTable();
 
   void add_inode(CInode *in);
   void remove_inode(CInode *in);
@@ -146,6 +147,8 @@ protected:
 
   std::map<uint64_t, vector<inodeno_t> > logseg_destroyed_inos;
   std::set<inodeno_t> destroyed_inos_set;
+
+  std::unique_ptr<PerfCounters> logger;
 };
 
 #endif