From 1a5b7eaac572f1810d0453b053781e6bc8185dd2 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 13 Nov 2017 17:22:33 +0800 Subject: [PATCH] mds: fix request rate calculation Signed-off-by: "Yan, Zheng" Fixes: http://tracker.ceph.com/issues/21745 (cherry picked from commit e9689c1ff7e75394298c0e86aa9ed4e703391c3e) Conflicts: src/mds/MDBalancer.cc --- src/mds/MDBalancer.cc | 35 ++++++++++++++++++++++++++++++----- src/mds/MDBalancer.h | 21 ++++++++++----------- src/mds/MDSRank.cc | 4 ---- src/mds/MDSRank.h | 2 +- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/mds/MDBalancer.cc b/src/mds/MDBalancer.cc index 595f97710d6ff..cb729e9fd4482 100644 --- a/src/mds/MDBalancer.cc +++ b/src/mds/MDBalancer.cc @@ -164,8 +164,6 @@ void MDBalancer::tick() } // balance? - if (last_heartbeat == utime_t()) - last_heartbeat = now; if (mds->get_nodeid() == 0 && g_conf->mds_bal_interval > 0 && (num_bal_times || @@ -229,7 +227,26 @@ mds_load_t MDBalancer::get_load(utime_t now) dout(20) << "get_load no root, no load" << dendl; } - load.req_rate = mds->get_req_rate(); + uint64_t num_requests = mds->get_num_requests(); + bool new_req_rate = false; + if (last_get_load != utime_t() && + now > last_get_load && + num_requests >= last_num_requests) { + utime_t el = now; + el -= last_get_load; + if (el.sec() >= 1) { + load.req_rate = (num_requests - last_num_requests) / (double)el; + new_req_rate = true; + } + } + if (!new_req_rate) { + auto p = mds_load.find(mds->get_nodeid()); + if (p != mds_load.end()) + load.req_rate = p->second.req_rate; + } + last_get_load = now; + last_num_requests = num_requests; + load.queue_len = messenger->get_dispatch_queue_len(); ifstream cpu(PROCPREFIX "/proc/loadavg"); @@ -302,12 +319,14 @@ void MDBalancer::send_heartbeat() if (mds->get_nodeid() == 0) { beat_epoch++; - mds_load.clear(); } // my load mds_load_t load = get_load(now); + mds->logger->set(l_mds_load_cent, 100 * load.mds_load()); + mds->logger->set(l_mds_dispatch_queue_len, load.queue_len); + map::value_type val(mds->get_nodeid(), load); mds_load.insert(val); @@ -380,12 +399,18 @@ void MDBalancer::handle_heartbeat(MHeartbeat *m) if (who == 0) { dout(20) << " from mds0, new epoch " << m->get_beat() << dendl; if (beat_epoch != m->get_beat()) { + beat_epoch = m->get_beat(); mds_load.clear(); } - beat_epoch = m->get_beat(); + send_heartbeat(); mds->mdcache->show_subtrees(); + } else if (mds->get_nodeid() == 0) { + if (beat_epoch != m->get_beat()) { + dout(10) << " old heartbeat epoch, ignoring" << dendl; + goto out; + } } { diff --git a/src/mds/MDBalancer.h b/src/mds/MDBalancer.h index 59a2c901e4fed..2b2594f6d1d45 100644 --- a/src/mds/MDBalancer.h +++ b/src/mds/MDBalancer.h @@ -38,14 +38,7 @@ class MDBalancer { friend class C_Bal_SendHeartbeat; public: MDBalancer(MDSRank *m, Messenger *msgr, MonClient *monc) : - mds(m), - messenger(msgr), - mon_client(monc), - beat_epoch(0), - last_epoch_under(0), my_load(0.0), target_load(0.0) - { } - - mds_load_t get_load(utime_t); + mds(m), messenger(msgr), mon_client(monc) { } int proc_message(Message *m); @@ -92,6 +85,8 @@ private: void handle_export_pins(void); void export_empties(); + + mds_load_t get_load(utime_t now); int localize_balancer(); void send_heartbeat(); void handle_heartbeat(MHeartbeat *m); @@ -124,9 +119,9 @@ private: MDSRank *mds; Messenger *messenger; MonClient *mon_client; - int beat_epoch; + int beat_epoch = 0; - int last_epoch_under; + int last_epoch_under = 0; string bal_code; string bal_version; @@ -134,6 +129,9 @@ private: utime_t last_sample; utime_t rebalance_time; //ensure a consistent view of load for rebalance + utime_t last_get_load; + uint64_t last_num_requests = 0; + // Dirfrags which are marked to be passed on to MDCache::[split|merge]_dir // just as soon as a delayed context comes back and triggers it. // These sets just prevent us from spawning extra timer contexts for @@ -147,7 +145,8 @@ private: map mds_last_epoch_under_info; // per-epoch state - double my_load, target_load; + double my_load = 0; + double target_load = 0; }; #endif diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 65dd5efb430df..380cdbb4507c5 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -266,11 +266,7 @@ void MDSRankDispatcher::tick() } // log - mds_load_t load = balancer->get_load(ceph_clock_now()); - if (logger) { - logger->set(l_mds_load_cent, 100 * load.mds_load()); - logger->set(l_mds_dispatch_queue_len, messenger->get_dispatch_queue_len()); logger->set(l_mds_subtrees, mdcache->num_subtrees()); mdcache->log_stat(); diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 1bb4d2724d883..b13fcbc5c8438 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -408,7 +408,7 @@ class MDSRank { MDSMap *get_mds_map() { return mdsmap; } - int get_req_rate() const { return logger->get(l_mds_request); } + uint64_t get_num_requests() const { return logger->get(l_mds_request); } int get_mds_slow_req_count() const { return mds_slow_req_count; } -- 2.39.5