]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: track average uptime of sessions
authorVenky Shankar <vshankar@redhat.com>
Tue, 24 Jul 2018 03:47:02 +0000 (23:47 -0400)
committerVenky Shankar <vshankar@redhat.com>
Mon, 3 Sep 2018 05:26:04 +0000 (01:26 -0400)
Average session age math improvements by Patrick.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/mds/MDSRank.cc
src/mds/SessionMap.cc
src/mds/SessionMap.h

index 58180e8616eddae70829fe24a9d5683a1ae342a2..48b03fcb0dabfdc91e1e7ba27083101ca53b67ad 100644 (file)
@@ -303,6 +303,9 @@ void MDSRankDispatcher::tick()
   // make sure mds log flushes, trims periodically
   mdlog->flush();
 
+  // update average session uptime
+  sessionmap.update_average_session_age();
+
   if (is_active() || is_stopping()) {
     mdcache->trim();
     mdcache->trim_client_leases();
index 429238b7b8b30816a06998ed99dbf8109f49e3a8..838899f60ce9fc76500b0e4af656dd1b5cf958e8 100644 (file)
@@ -62,6 +62,9 @@ void SessionMap::register_perfcounters()
               "Sessions currently stale");
   plb.add_u64(l_mdssm_total_load, "total_load", "Total Load");
   plb.add_u64(l_mdssm_avg_load, "average_load", "Average Load");
+  plb.add_u64(l_mdssm_avg_session_uptime, "avg_session_uptime",
+               "Average session uptime");
+
   logger = plb.create_perf_counters();
   g_ceph_context->get_perfcounters_collection()->add(logger);
 }
@@ -627,6 +630,8 @@ void SessionMap::add_session(Session *s)
   by_state_entry->second->push_back(&s->item_session_list);
   s->get();
 
+  update_average_birth_time(*s);
+
   logger->set(l_mdssm_session_count, session_map.size());
   logger->inc(l_mdssm_session_add);
 }
@@ -635,6 +640,8 @@ void SessionMap::remove_session(Session *s)
 {
   dout(10) << __func__ << " s=" << s << " name=" << s->info.inst.name << dendl;
 
+  update_average_birth_time(*s, false);
+
   s->trim_completed_requests(0);
   s->item_session_list.remove_myself();
   session_map.erase(s->info.inst.name);
@@ -1002,6 +1009,15 @@ void SessionMap::handle_conf_change(const ConfigProxy &conf,
   }
 }
 
+void SessionMap::update_average_session_age() {
+  if (!session_map.size()) {
+    return;
+  }
+
+  double avg_uptime = std::chrono::duration<double>(clock::now()-avg_birth_time).count();
+  logger->set(l_mdssm_avg_session_uptime, (uint64_t)avg_uptime);
+}
+
 int SessionFilter::parse(
     const std::vector<std::string> &args,
     std::stringstream *ss)
index 2cbf4836d7e7e44de90e1257fea067ec2d58d4a9..726cbd58f0f5dba42082d8f8f92bfd190bc40021 100644 (file)
@@ -46,6 +46,7 @@ enum {
   l_mdssm_session_stale,
   l_mdssm_total_load,
   l_mdssm_avg_load,
+  l_mdssm_avg_session_uptime,
   l_mdssm_last,
 };
 
@@ -112,6 +113,12 @@ private:
   // request load average for this session
   DecayCounter load_avg;
 
+  // session start time -- used to track average session time
+  // note that this is initialized in the constructor rather
+  // than at the time of adding a session to the sessionmap
+  // as journal replay of sessionmap will not call add_session().
+  time birth_time;
+
 public:
 
   void push_pv(version_t pv)
@@ -224,6 +231,10 @@ public:
     load_avg.adjust();
   }
 
+  time get_birth_time() const {
+    return birth_time;
+  }
+
   // -- caps --
 private:
   version_t cap_push_seq;        // cap push seq #
@@ -348,8 +359,8 @@ public:
 
   Session(Connection *con) :
     state(STATE_CLOSED), state_seq(0), importing_count(0),
-    recall_count(0), recall_release_count(0),
-    auth_caps(g_ceph_context),
+    birth_time(clock::now()), recall_count(0),
+    recall_release_count(0), auth_caps(g_ceph_context),
     connection(NULL), item_session_list(this),
     requests(0),  // member_offset passed to front() manually
     cap_push_seq(0),
@@ -497,6 +508,7 @@ public:
   map<int,xlist<Session*>* > by_state;
   uint64_t set_state(Session *session, int state);
   map<version_t, MDSInternalContextBase::vec > commit_waiters;
+  void update_average_session_age();
 
   explicit SessionMap(MDSRank *m) : mds(m),
                       projected(0), committing(0), committed(0),
@@ -717,10 +729,32 @@ public:
                      MDSGatherBuilder *gather_bld);
 
 private:
+  time avg_birth_time = clock::zero();
+
   uint64_t get_session_count_in_state(int state) {
     return !is_any_state(state) ? 0 : by_state[state]->size();
   }
 
+  void update_average_birth_time(const Session &s, bool added=true) {
+    uint32_t sessions = session_map.size();
+    time birth_time = s.get_birth_time();
+
+    if (sessions == 1) {
+      avg_birth_time = added ? birth_time : clock::zero();
+      return;
+    }
+
+    if (added) {
+      avg_birth_time = clock::time_point(
+        ((avg_birth_time - clock::zero()) / sessions) * (sessions - 1) +
+        (birth_time - clock::zero()) / sessions);
+    } else {
+      avg_birth_time = clock::time_point(
+        ((avg_birth_time - clock::zero()) / (sessions - 1)) * sessions -
+        (birth_time - clock::zero()) / (sessions - 1));
+    }
+  }
+
 public:
   void hit_session(Session *session);
   void handle_conf_change(const ConfigProxy &conf,