From: Dan van der Ster Date: Fri, 26 Feb 2016 21:29:46 +0000 (+0100) Subject: osd: add mon_reweight_max_osds to limit reweight-by-* commands X-Git-Tag: v0.94.7~10^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d8372cea0c51db89cc48e5592236d53f7b01b6b3;p=ceph.git osd: add mon_reweight_max_osds to limit reweight-by-* commands 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 (cherry picked from commit 3aa0ccefddc1790df5b808bfccd5da4857951220) --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 0671b594e66e..b1bd720448f6 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -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) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index c6bce4f5b62f..06d4e8a31a93 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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 > util_by_osd; for (ceph::unordered_map::const_iterator p = - pgm.osd_stat.begin(); + pgm.osd_stat.begin(); p != pgm.osd_stat.end(); ++p) { - float util; + std::pair 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 l, std::pair r) { + return l.second > r.second; + }); + + for (std::vector >::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; } } }