From d2627b98d0c1477d664d00384ef033d323b26957 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Mon, 23 Jul 2018 23:47:02 -0400 Subject: [PATCH] mds: track average uptime of sessions Average session age math improvements by Patrick. Signed-off-by: Patrick Donnelly Signed-off-by: Venky Shankar --- src/mds/MDSRank.cc | 3 +++ src/mds/SessionMap.cc | 16 ++++++++++++++++ src/mds/SessionMap.h | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 58180e8616edd..48b03fcb0dabf 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -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(); diff --git a/src/mds/SessionMap.cc b/src/mds/SessionMap.cc index 429238b7b8b30..838899f60ce9f 100644 --- a/src/mds/SessionMap.cc +++ b/src/mds/SessionMap.cc @@ -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(clock::now()-avg_birth_time).count(); + logger->set(l_mdssm_avg_session_uptime, (uint64_t)avg_uptime); +} + int SessionFilter::parse( const std::vector &args, std::stringstream *ss) diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index 2cbf4836d7e7e..726cbd58f0f5d 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -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* > by_state; uint64_t set_state(Session *session, int state); map 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, -- 2.39.5