From: Mykola Golub Date: Mon, 19 Nov 2018 09:21:05 +0000 (+0200) Subject: osd: make use of osd perf query's limit param X-Git-Tag: v14.1.0~719^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0d0919fe06293ec78dfaa19d425937ed32722eec;p=ceph.git osd: make use of osd perf query's limit param Signed-off-by: Mykola Golub --- diff --git a/src/osd/DynamicPerfStats.h b/src/osd/DynamicPerfStats.h index 049451575c29..923649fdedd4 100644 --- a/src/osd/DynamicPerfStats.h +++ b/src/osd/DynamicPerfStats.h @@ -152,22 +152,84 @@ public: } void add_to_reports( + const std::map & limits, std::map *reports) { for (auto &it : data) { auto &query = it.first; + auto &counters = it.second; auto &report = (*reports)[query]; query.get_performance_counter_descriptors( &report.performance_counter_descriptors); - for (auto &it_counters : it.second) { - auto &bl = report.group_packed_performance_counters[it_counters.first]; - query.pack_counters(it_counters.second, &bl); + auto &descriptors = report.performance_counter_descriptors; + ceph_assert(descriptors.size() > 0); + + if (!is_limited(limits.at(query), counters.size())) { + for (auto &it_counters : counters) { + auto &bl = report.group_packed_performance_counters[it_counters.first]; + query.pack_counters(it_counters.second, &bl); + } + continue; + } + + for (auto &limit : limits.at(query)) { + size_t index = 0; + for (; index < descriptors.size(); index++) { + if (descriptors[index] == limit.order_by) { + break; + } + } + if (index == descriptors.size()) { + // should not happen + continue; + } + + typedef std::map::iterator + Iterator; + std::vector counter_iterators; + counter_iterators.reserve(counters.size()); + for (Iterator it_counters = counters.begin(); + it_counters != counters.end(); it_counters++) { + counter_iterators.push_back(it_counters); + } + std::sort(counter_iterators.begin(), counter_iterators.end(), + [index](const Iterator &a, const Iterator &b) -> bool { + return a->second[index].first > b->second[index].first; + }); + + uint64_t count = 0; + for (auto it_counters : counter_iterators) { + if (count == limit.max_count) { + break; + } + auto &bl = + report.group_packed_performance_counters[it_counters->first]; + if (bl.length() == 0) { + query.pack_counters(it_counters->second, &bl); + } + count++; + } } } } private: + static bool is_limited(const OSDPerfMetricLimits &limits, + size_t counters_size) { + if (limits.empty()) { + return false; + } + + for (auto &limit : limits) { + if (limit.max_count >= counters_size) { + return false; + } + } + + return true; + } + std::map> data; }; diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 0eeab719b4d0..ab7239912237 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -9819,6 +9819,7 @@ void OSD::set_perf_queries( { Mutex::Locker locker(m_perf_queries_lock); m_perf_queries = supported_queries; + m_perf_limits = queries; } std::vector pgs; @@ -9850,7 +9851,7 @@ void OSD::get_perf_reports( dps.merge(pg_dps); } } - dps.add_to_reports(reports); + dps.add_to_reports(m_perf_limits, reports); dout(20) << "reports for " << reports->size() << " queries" << dendl; } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 49d689b588c4..1aaf19b134da 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -2317,6 +2317,7 @@ private: Mutex m_perf_queries_lock = {"OSD::m_perf_queries_lock"}; std::list m_perf_queries; + std::map m_perf_limits; };