]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: add mon_reweight_max_osds to limit reweight-by-* commands
authorDan van der Ster <daniel.vanderster@cern.ch>
Fri, 26 Feb 2016 21:29:46 +0000 (22:29 +0100)
committerSage Weil <sage@redhat.com>
Thu, 10 Mar 2016 13:16:41 +0000 (08:16 -0500)
Add configurable mon_reweight_max_osds which limits the number
of OSDs modified each time reweight-by-* is called (by default
to 4 OSDs).

Also change the order in which we look at OSDs to go from most
to least utilized.

Signed-off-by: Dan van der Ster <daniel.vanderster@cern.ch>
(cherry picked from commit 3aa0ccefddc1790df5b808bfccd5da4857951220)

src/common/config_opts.h
src/mon/OSDMonitor.cc

index 0671b594e66e748af054d62015ec0f3462f1e6c5..b1bd720448f64deaf6a47d9e116d7ca521f9cbd2 100644 (file)
@@ -235,6 +235,7 @@ OPTION(mon_daemon_bytes, OPT_U64, 400ul << 20)  // mds, osd message memory cap (
 OPTION(mon_max_log_entries_per_event, OPT_INT, 4096)
 OPTION(mon_reweight_min_pgs_per_osd, OPT_U64, 10)   // min pgs per osd for reweight-by-pg command
 OPTION(mon_reweight_min_bytes_per_osd, OPT_U64, 100*1024*1024)   // min bytes per osd for reweight-by-utilization command
+OPTION(mon_reweight_max_osds, OPT_INT, 4)   // max osds to change per reweight-by-* command
 OPTION(mon_reweight_max_change, OPT_FLOAT, 0.05)   // max change to each osd per reweight-by-* command
 OPTION(mon_health_data_update_interval, OPT_FLOAT, 60.0)
 OPTION(mon_health_to_clog, OPT_BOOL, true)
index c6bce4f5b62fce693293ac9781e741deb8e79916..06d4e8a31a9370699de0634d565155b3a8acb492 100644 (file)
@@ -557,16 +557,35 @@ int OSDMonitor::reweight_by_utilization(int oload, std::string& out_str,
   std::string sep;
   oss << "reweighted: ";
   bool changed = false;
+  int num_changed = 0;
+
+  // precompute util for each OSD
+  std::vector<std::pair<int, float> > util_by_osd;
   for (ceph::unordered_map<int,osd_stat_t>::const_iterator p =
-        pgm.osd_stat.begin();
+       pgm.osd_stat.begin();
        p != pgm.osd_stat.end();
        ++p) {
-    float util;
+    std::pair<int, float> osd_util;
+    osd_util.first = p->first;
     if (by_pg) {
-      util = pgs_by_osd[p->first] / osdmap.crush->get_item_weightf(p->first);
+      osd_util.second = pgs_by_osd[p->first] / osdmap.crush->get_item_weightf(p->first);
     } else {
-      util = (double)p->second.kb_used / (double)p->second.kb;
+      osd_util.second = (double)p->second.kb_used / (double)p->second.kb;
     }
+    util_by_osd.push_back(osd_util);
+  }
+
+  // sort and iterate from most to least utilized
+  std::sort(util_by_osd.begin(), util_by_osd.end(), [](std::pair<int, float> l, std::pair<int, float> r) {
+    return l.second > r.second;
+  });
+
+  for (std::vector<std::pair<int, float> >::const_iterator p =
+        util_by_osd.begin();
+       p != util_by_osd.end();
+       ++p) {
+    float util = p->second;
+
     if (util >= overload_util) {
       sep = ", ";
       // Assign a lower weight to overloaded OSDs. The current weight
@@ -584,6 +603,8 @@ int OSDMonitor::reweight_by_utilization(int oload, std::string& out_str,
               (float)weight / (float)0x10000,
               (float)new_weight / (float)0x10000);
       oss << buf << sep;
+      if (++num_changed >= g_conf->mon_reweight_max_osds)
+       break;
     }
     if (!no_increasing && util <= underload_util) {
       // assign a higher weight.. if we can.
@@ -603,6 +624,8 @@ int OSDMonitor::reweight_by_utilization(int oload, std::string& out_str,
                 (float)weight / (float)0x10000,
                 (float)new_weight / (float)0x10000);
        oss << buf << sep;
+       if (++num_changed >= g_conf->mon_reweight_max_osds)
+         break;
       }
     }
   }