]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: smooth pg stat rates over last N pgmaps
authorSage Weil <sage@inktank.com>
Tue, 29 Jan 2013 03:46:33 +0000 (19:46 -0800)
committerSage Weil <sage@inktank.com>
Tue, 29 Jan 2013 03:46:33 +0000 (19:46 -0800)
This smooths the recovery and throughput stats over the last N pgmaps,
defaulting to 2.

Signed-off-by: Sage Weil <sage@inktank.com>
src/common/config_opts.h
src/mon/PGMap.cc
src/mon/PGMap.h
src/mon/PGMonitor.cc

index a778268d51a48eb4aecaedd826a7ceccb957b2e6..0d2e011721a3586944305b4c56a8eb186b1d3255 100644 (file)
@@ -130,6 +130,7 @@ OPTION(mon_osd_down_out_interval, OPT_INT, 300) // seconds
 OPTION(mon_osd_down_out_subtree_limit, OPT_STR, "rack")   // largest crush unit/type that we will automatically mark out
 OPTION(mon_osd_min_up_ratio, OPT_DOUBLE, .3)    // min osds required to be up to mark things down
 OPTION(mon_osd_min_in_ratio, OPT_DOUBLE, .3)   // min osds required to be in to mark things out
+OPTION(mon_stat_smooth_intervals, OPT_INT, 2)  // smooth stats over last N PGMap maps
 OPTION(mon_lease, OPT_FLOAT, 5)       // lease interval
 OPTION(mon_lease_renew_interval, OPT_FLOAT, 3) // on leader, to renew the lease
 OPTION(mon_lease_ack_timeout, OPT_FLOAT, 10.0) // on leader, if lease isn't acked by all peons
index 4ad12966520c931766347c448794ae9b93b48971..ae089bd47951a6393b64228970d95816181eddd8 100644 (file)
@@ -153,13 +153,14 @@ void PGMap::Incremental::generate_test_instances(list<PGMap::Incremental*>& o)
 
 // --
 
-void PGMap::apply_incremental(const Incremental& inc)
+void PGMap::apply_incremental(CephContext *cct, const Incremental& inc)
 {
   assert(inc.version == version+1);
   version++;
 
-  stamp_delta = inc.stamp;
-  stamp_delta -= stamp;
+  utime_t delta_t;
+  delta_t = inc.stamp;
+  delta_t -= stamp;
   stamp = inc.stamp;
 
   pool_stat_t pg_sum_old = pg_sum;
@@ -236,8 +237,18 @@ void PGMap::apply_incremental(const Incremental& inc)
     full_osds.erase(*p);
   }
 
-  pg_sum_delta = pg_sum;
-  pg_sum_delta.stats.sub(pg_sum_old.stats);
+  // calculate a delta, and average over the last 2 deltas.
+  pool_stat_t d = pg_sum;
+  d.stats.sub(pg_sum_old.stats);
+  pg_sum_deltas.push_back(make_pair(d, delta_t));
+  stamp_delta += delta_t;
+
+  pg_sum_delta.stats.add(d.stats);
+  if (pg_sum_deltas.size() > MIN(1, cct ? cct->_conf->mon_stat_smooth_intervals : 1)) {
+    pg_sum_delta.stats.sub(pg_sum_deltas.front().first.stats);
+    stamp_delta -= pg_sum_deltas.front().second;
+    pg_sum_deltas.pop_front();
+  }
   
   if (inc.osdmap_epoch)
     last_osdmap_epoch = inc.osdmap_epoch;
@@ -702,7 +713,7 @@ void PGMap::generate_test_instances(list<PGMap*>& o)
   Incremental::generate_test_instances(inc);
   inc.pop_front();
   while (!inc.empty()) {
-    o.back()->apply_incremental(*inc.front());
+    o.back()->apply_incremental(NULL, *inc.front());
     delete inc.front();
     inc.pop_front();
   }
index 6bb158a0d0c2b60a43f75ef48e83b75ea3707c96..4794a16f0305eab44d0f3e9f9d03340a5e6c05e5 100644 (file)
@@ -73,7 +73,8 @@ public:
 
   utime_t stamp;
 
-  // delta since the previous map
+  // recent deltas, and summation
+  list< pair<pool_stat_t, utime_t> > pg_sum_deltas;
   pool_stat_t pg_sum_delta;
   utime_t stamp_delta;
 
@@ -95,7 +96,7 @@ public:
       num_osd(0)
   {}
 
-  void apply_incremental(const Incremental& inc);
+  void apply_incremental(CephContext *cct, const Incremental& inc);
   void redo_full_sets();
   void register_nearfull_status(int osd, const osd_stat_t& s);
   void calc_stats();
index aaeb7bfeeafd84fd1a2e9fccdcec186a2afbb4ba..7e9b83ba5e0d7b72c97daff25183266fd65d5b0f 100644 (file)
@@ -186,7 +186,7 @@ void PGMonitor::update_from_paxos()
       return;
     }
 
-    pg_map.apply_incremental(inc);
+    pg_map.apply_incremental(g_ceph_context, inc);
     
     dout(10) << pg_map << dendl;