Skip to content

Commit a49ba9d

Browse files
salieri11vshankar
authored andcommitted
mds: aggregate and expose subvolume metrics
rank0 periodically receives subvolume metrics from other MDS instances and aggregate subvolume metrics using sliding window. The MetricsAggregator exposes PerfCounters and PerfQueries for these metrics. Fixes: https://tracker.ceph.com/issues/68931 Signed-off-by: Igor Golikov <[email protected]>
1 parent c376635 commit a49ba9d

File tree

6 files changed

+433
-9
lines changed

6 files changed

+433
-9
lines changed

src/common/options/mds.yaml.in

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,3 +1803,12 @@ options:
18031803
services:
18041804
- mds
18051805
min: 1
1806+
- name: subv_metrics_window_interval
1807+
type: secs
1808+
level: dev
1809+
desc: subvolume metrics sliding window interval, seconds
1810+
long_desc: interval in seconds to hold values in sliding window for subvolume metrics, in the metrics aggregator
1811+
default: 60
1812+
min: 30
1813+
services:
1814+
- mds

src/mds/MDSPerfMetricTypes.h

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#define CEPH_MDS_PERF_METRIC_TYPES_H
66

77
#include <ostream>
8+
#include <shared_mutex>
89

910
#include "common/Formatter.h"
1011
#include "include/cephfs/types.h" // for mds_rank_t
@@ -298,6 +299,7 @@ WRITE_CLASS_DENC(PinnedIcapsMetric)
298299
WRITE_CLASS_DENC(OpenedInodesMetric)
299300
WRITE_CLASS_DENC(ReadIoSizesMetric)
300301
WRITE_CLASS_DENC(WriteIoSizesMetric)
302+
WRITE_CLASS_DENC(SubvolumeMetric)
301303

302304
// metrics that are forwarded to the MDS by client(s).
303305
struct Metrics {
@@ -312,12 +314,13 @@ struct Metrics {
312314
OpenedInodesMetric opened_inodes_metric;
313315
ReadIoSizesMetric read_io_sizes_metric;
314316
WriteIoSizesMetric write_io_sizes_metric;
317+
SubvolumeMetric subvolume_metrics;
315318

316319
// metric update type
317320
uint32_t update_type = UpdateType::UPDATE_TYPE_REFRESH;
318321

319322
DENC(Metrics, v, p) {
320-
DENC_START(4, 1, p);
323+
DENC_START(5, 1, p);
321324
denc(v.update_type, p);
322325
denc(v.cap_hit_metric, p);
323326
denc(v.read_latency_metric, p);
@@ -335,6 +338,9 @@ struct Metrics {
335338
denc(v.read_io_sizes_metric, p);
336339
denc(v.write_io_sizes_metric, p);
337340
}
341+
if (struct_v >= 5) {
342+
denc(v.subvolume_metrics, p);
343+
}
338344
DENC_FINISH(p);
339345
}
340346

@@ -350,6 +356,7 @@ struct Metrics {
350356
f->dump_object("opened_inodes_metric", opened_inodes_metric);
351357
f->dump_object("read_io_sizes_metric", read_io_sizes_metric);
352358
f->dump_object("write_io_sizes_metric", write_io_sizes_metric);
359+
f->dump_object("subvolume_metrics", subvolume_metrics);
353360
}
354361

355362
friend std::ostream& operator<<(std::ostream& os, const Metrics& metrics) {
@@ -364,6 +371,7 @@ struct Metrics {
364371
<< ", opened_inodes_metric=" << metrics.opened_inodes_metric
365372
<< ", read_io_sizes_metric=" << metrics.read_io_sizes_metric
366373
<< ", write_io_sizes_metric=" << metrics.write_io_sizes_metric
374+
<< ", subvolume_metrics=" << metrics.subvolume_metrics
367375
<< "}]";
368376
return os;
369377
}
@@ -374,6 +382,7 @@ struct metrics_message_t {
374382
version_t seq = 0;
375383
mds_rank_t rank = MDS_RANK_NONE;
376384
std::map<entity_inst_t, Metrics> client_metrics_map;
385+
std::vector<SubvolumeMetric> subvolume_metrics;
377386

378387
metrics_message_t() {
379388
}
@@ -383,19 +392,23 @@ struct metrics_message_t {
383392

384393
void encode(bufferlist &bl, uint64_t features) const {
385394
using ceph::encode;
386-
ENCODE_START(1, 1, bl);
395+
ENCODE_START(2, 1, bl);
387396
encode(seq, bl);
388397
encode(rank, bl);
389398
encode(client_metrics_map, bl, features);
399+
encode(subvolume_metrics, bl);
390400
ENCODE_FINISH(bl);
391401
}
392402

393403
void decode(bufferlist::const_iterator &iter) {
394404
using ceph::decode;
395-
DECODE_START(1, iter);
405+
DECODE_START(2, iter);
396406
decode(seq, iter);
397407
decode(rank, iter);
398408
decode(client_metrics_map, iter);
409+
if (struct_v >= 2) {
410+
decode(subvolume_metrics, iter);
411+
}
399412
DECODE_FINISH(iter);
400413
}
401414

@@ -406,13 +419,21 @@ struct metrics_message_t {
406419
f->dump_object("client", client);
407420
f->dump_object("metrics", metrics);
408421
}
422+
f->open_array_section("subvolume_metrics");
423+
for (const auto &metric : subvolume_metrics) {
424+
f->open_object_section("metric");
425+
metric.dump(f);
426+
f->close_section();
427+
}
428+
f->close_section();
409429
}
410430

411-
friend std::ostream& operator<<(std::ostream& os, const metrics_message_t &metrics_message) {
412-
os << "[sequence=" << metrics_message.seq << ", rank=" << metrics_message.rank
413-
<< ", metrics=" << metrics_message.client_metrics_map << "]";
414-
return os;
415-
}
431+
friend std::ostream& operator<<(std::ostream& os, const metrics_message_t &m) {
432+
os << "[sequence=" << m.seq << ", rank=" << m.rank
433+
<< ", client_metrics=" << m.client_metrics_map
434+
<< ", subvolume_metrics=" << m.subvolume_metrics << "]";
435+
return os;
436+
}
416437
};
417438

418439
WRITE_CLASS_ENCODER_FEATURES(metrics_message_t)

0 commit comments

Comments
 (0)