namespace crimson::os::seastore {
-SeaStore::~SeaStore() {}
+SeaStore::~SeaStore() {
+ perf_service->remove_from_collection();
+}
struct SeastoreCollection final : public FuturizedCollection {
template <typename... T>
segment_manager::block::BlockSegmentManager
>(device + "/block");
+ PerfServiceRef perf_service = PerfServiceRef(new PerfService());
+
auto segment_cleaner = std::make_unique<SegmentCleaner>(
SegmentCleaner::config_t::get_default(),
- false /* detailed */);
+ perf_service->get_counters(), false /* detailed */);
auto journal = std::make_unique<Journal>(*sm);
auto cache = std::make_unique<Cache>(*sm);
std::move(segment_cleaner),
std::move(journal),
std::move(cache),
- std::move(lba_manager));
+ std::move(lba_manager),
+ perf_service->get_counters());
auto cm = std::make_unique<collection_manager::FlatCollectionManager>(*tm);
return std::make_unique<SeaStore>(
std::move(sm),
std::move(tm),
std::move(cm),
- std::make_unique<crimson::os::seastore::onode::FLTreeOnodeManager>(*tm));
+ std::make_unique<crimson::os::seastore::onode::FLTreeOnodeManager>(*tm),
+ std::move(perf_service));
}
}
#include "crimson/os/seastore/onode_manager.h"
#include "crimson/os/seastore/omap_manager.h"
#include "crimson/os/seastore/collection_manager.h"
+#include "crimson/os/seastore/seastore_perf_counters.h"
namespace crimson::os::seastore {
SegmentManagerRef sm,
TransactionManagerRef tm,
CollectionManagerRef cm,
- OnodeManagerRef om
+ OnodeManagerRef om,
+ PerfServiceRef p_service
) : segment_manager(std::move(sm)),
transaction_manager(std::move(tm)),
collection_manager(std::move(cm)),
- onode_manager(std::move(om)) {}
+ onode_manager(std::move(om)),
+ perf_service(std::move(p_service)) {
+ perf_service->add_to_collection();
+ }
~SeaStore();
TransactionManagerRef transaction_manager;
CollectionManagerRef collection_manager;
OnodeManagerRef onode_manager;
+ PerfServiceRef perf_service;
using tm_ertr = TransactionManager::base_ertr;
using tm_ret = tm_ertr::future<>;
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+#pragma once
+
+#include "crimson/common/perf_counters_collection.h"
+
+namespace crimson::os::seastore {
+
+using PerfCountersRef = std::unique_ptr<PerfCounters>;
+enum {
+ seastore_perfcounters_first = 30000,
+ ss_tm_extents_mutated_total,
+ ss_tm_extents_mutated_bytes,
+ ss_tm_extents_retired_total,
+ ss_tm_extents_retired_bytes,
+ ss_tm_extents_allocated_total,
+ ss_tm_extents_allocated_bytes,
+ ss_sm_bytes_written,
+ ss_sm_segments_released,
+ ss_sm_bytes_released,
+ seastore_perfcounters_last,
+};
+
+class PerfService {
+ PerfCountersRef build_seastore_perf() {
+ std::string name = fmt::format("seastore::shard-{}", seastar::this_shard_id());
+ PerfCountersBuilder ss_plb(nullptr, name, seastore_perfcounters_first,
+ seastore_perfcounters_last);
+ ss_plb.add_u64_counter(
+ ss_tm_extents_mutated_total, "extents_mutated_num",
+ "the number of extents which have been mutated");
+ ss_plb.add_u64_counter(
+ ss_tm_extents_mutated_bytes, "extents_mutated_bytes",
+ "the total bytes of extents which have been mutated");
+ ss_plb.add_u64_counter(
+ ss_tm_extents_retired_total, "extents_retired_num",
+ "the number of extents which have been retired");
+ ss_plb.add_u64_counter(
+ ss_tm_extents_retired_bytes, "extents_retired_bytes",
+ "the total bytes of extents which have been retired");
+ ss_plb.add_u64_counter(
+ ss_tm_extents_allocated_total, "extents_allocated_num",
+ "the number of extents which have been allocated");
+ ss_plb.add_u64_counter(
+ ss_tm_extents_allocated_bytes, "extents_allocated_bytes",
+ "the total bytes of extents which have been allocated");
+ ss_plb.add_u64_counter(
+ ss_sm_bytes_written, "sm_bytes_written",
+ "the number of bytes written by segmentmanager");
+ ss_plb.add_u64_counter(
+ ss_sm_segments_released, "sm_segments_released",
+ "the number of segments released by segmentmanager");
+ ss_plb.add_u64_counter(
+ ss_sm_bytes_released, "sm_bytes_released",
+ "the number of bytes released by segmentmanager");
+ return PerfCountersRef(ss_plb.create_perf_counters());
+ }
+
+ PerfCountersRef ss_perf = nullptr;
+public:
+ PerfService()
+ : ss_perf(build_seastore_perf()) {}
+
+ ~PerfService() {}
+
+ PerfCounters& get_counters() {
+ return *ss_perf;
+ }
+ void add_to_collection() {
+ crimson::common::local_perf_coll().get_perf_collection()->add(ss_perf.get());
+ }
+ void remove_from_collection() {
+ crimson::common::local_perf_coll().get_perf_collection()->remove(ss_perf.get());
+ }
+};
+using PerfServiceRef = std::unique_ptr<PerfService>;
+}
#include "crimson/os/seastore/cached_extent.h"
#include "crimson/os/seastore/journal.h"
#include "crimson/os/seastore/seastore_types.h"
+#include "crimson/os/seastore/seastore_perf_counters.h"
#include "crimson/os/seastore/segment_manager.h"
#include "crimson/os/seastore/transaction.h"
size_t empty_segments;
int64_t used_bytes = 0;
bool init_complete = false;
+ PerfCounters &sc_perf;
/// target journal_tail for next fresh segment
journal_seq_t journal_tail_target;
std::optional<seastar::promise<>> blocked_io_wake;
public:
- SegmentCleaner(config_t config, bool detailed = false)
+ SegmentCleaner(config_t config, PerfCounters &perf, bool detailed = false)
: detailed(detailed),
config(config),
+ sc_perf(perf),
gc_process(*this) {}
void mount(SegmentManager &sm) {
}
void mark_segment_released(segment_id_t segment) {
+ sc_perf.inc(ss_sm_segments_released);
return mark_empty(segment);
}
SegmentCleanerRef _segment_cleaner,
JournalRef _journal,
CacheRef _cache,
- LBAManagerRef _lba_manager)
+ LBAManagerRef _lba_manager,
+ PerfCounters &perf)
: segment_manager(_segment_manager),
segment_cleaner(std::move(_segment_cleaner)),
cache(std::move(_cache)),
lba_manager(std::move(_lba_manager)),
- journal(std::move(_journal))
+ journal(std::move(_journal)),
+ tm_perf(perf)
{
segment_cleaner->set_extent_callback(this);
journal->set_write_pipeline(&write_pipeline);
t,
*ref);
cache->retire_extent(t, ref);
+ tm_perf.inc(ss_tm_extents_retired_total);
+ tm_perf.inc(ss_tm_extents_retired_bytes, ref->get_length());
}
return ret.refcount;
});
DEBUGT("offset {} refcount 0", t, offset);
return cache->retire_extent(
t, result.addr, result.length
- ).safe_then([] {
+ ).safe_then([result, this] {
+ tm_perf.inc(ss_tm_extents_retired_total);
+ tm_perf.inc(ss_tm_extents_retired_bytes, result.length);
return ref_ret(
ref_ertr::ready_future_marker{},
0);
#include "crimson/os/seastore/logging.h"
#include "crimson/os/seastore/segment_cleaner.h"
#include "crimson/os/seastore/seastore_types.h"
+#include "crimson/os/seastore/seastore_perf_counters.h"
#include "crimson/os/seastore/cache.h"
#include "crimson/os/seastore/segment_manager.h"
#include "crimson/os/seastore/lba_manager.h"
SegmentCleanerRef segment_cleaner,
JournalRef journal,
CacheRef cache,
- LBAManagerRef lba_manager);
+ LBAManagerRef lba_manager,
+ PerfCounters &perf);
/// Writes initial metadata to disk
using mkfs_ertr = crimson::errorator<
auto ret = cache->duplicate_for_write(
t,
ref)->cast<LogicalCachedExtent>();
+ tm_perf.inc(ss_tm_extents_mutated_total);
+ tm_perf.inc(ss_tm_extents_mutated_bytes, ret->get_length());
if (!ret->has_pin()) {
DEBUGT(
"duplicating {} for write: {}",
hint,
len,
ext->get_paddr()
- ).safe_then([ext=std::move(ext)](auto &&ref) mutable {
+ ).safe_then([ext=std::move(ext), len, this](auto &&ref) mutable {
ext->set_pin(std::move(ref));
+ tm_perf.inc(ss_tm_extents_allocated_total);
+ tm_perf.inc(ss_tm_extents_allocated_bytes, len);
return alloc_extent_ertr::make_ready_future<TCachedExtentRef<T>>(
std::move(ext));
});
CacheRef cache;
LBAManagerRef lba_manager;
JournalRef journal;
+ PerfCounters &tm_perf;
WritePipeline write_pipeline;
#include "crimson/common/log.h"
#include "crimson/common/config_proxy.h"
-#include "crimson/common/perf_counters_collection.h"
+#include "crimson/os/seastore/seastore_perf_counters.h"
#include "test/crimson/seastar_runner.h"
}
sc.run([=] {
- return crimson::common::sharded_conf(
- ).start(EntityName{}, string_view{"ceph"}
- ).then([=] {
- auto backend = get_backend(backend_config);
- return seastar::do_with(
- NBDHandler(*backend, nbd_config),
- std::move(backend),
- [](auto &nbd, auto &backend) {
- return backend->mount(
- ).then([&] {
- logger().debug("Running nbd server...");
- return nbd.run();
- }).then([&] {
- return backend->close();
- });
+ return crimson::common::sharded_perf_coll().start().then([=] {
+ return crimson::common::sharded_conf(
+ ).start(EntityName{}, string_view{"ceph"}
+ ).then([=] {
+ auto backend = get_backend(backend_config);
+ return seastar::do_with(
+ NBDHandler(*backend, nbd_config),
+ std::move(backend),
+ [](auto &nbd, auto &backend) {
+ return backend->mount(
+ ).then([&] {
+ logger().debug("Running nbd server...");
+ return nbd.run();
+ }).then([&] {
+ return backend->close();
+ });
});
+ });
}).then([=] {
return crimson::common::sharded_perf_coll().stop().then([] {
return crimson::common::sharded_conf().stop();
{
auto segment_cleaner = std::make_unique<SegmentCleaner>(
SegmentCleaner::config_t::get_default(),
- false /* detailed */);
+ perf_service->get_counters(), false /* detailed */);
segment_cleaner->mount(*segment_manager);
auto journal = std::make_unique<Journal>(*segment_manager);
auto cache = std::make_unique<Cache>(*segment_manager);
std::move(segment_cleaner),
std::move(journal),
std::move(cache),
- std::move(lba_manager));
+ std::move(lba_manager),
+ perf_service->get_counters());
}
void TMDriver::clear()
seastar::future<> TMDriver::mkfs()
{
assert(config.path);
+ perf_service->add_to_collection();
segment_manager = std::make_unique<
segment_manager::block::BlockSegmentManager
>(*config.path);
logger().debug("sm close");
return segment_manager->close();
}).safe_then([this] {
+ perf_service->remove_from_collection();
clear();
logger().debug("mkfs complete");
return TransactionManager::mkfs_ertr::now();
#include "block_driver.h"
#include "crimson/os/seastore/cache.h"
+#include "crimson/os/seastore/seastore_perf_counters.h"
#include "crimson/os/seastore/segment_cleaner.h"
#include "crimson/os/seastore/segment_manager.h"
#include "crimson/os/seastore/segment_manager/block.h"
using TransactionManager = crimson::os::seastore::TransactionManager;
std::unique_ptr<TransactionManager> tm;
+ using PerfServiceRef = crimson::os::seastore::PerfServiceRef;
+ using PerfService = crimson::os::seastore::PerfService;
+ PerfServiceRef perf_service = PerfServiceRef(new PerfService());
seastar::future<> mkfs();
void init();
transaction_manager_test_t()
: gen(rd()) {
- init();
}
laddr_t get_random_laddr(size_t block_size, laddr_t limit) {
#include "crimson/os/seastore/transaction_manager.h"
#include "crimson/os/seastore/segment_manager/ephemeral.h"
#include "crimson/os/seastore/seastore.h"
+#include "crimson/os/seastore/seastore_perf_counters.h"
#include "crimson/os/seastore/segment_manager.h"
#include "crimson/os/seastore/collection_manager/flat_collection_manager.h"
#include "crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h"
};
auto get_transaction_manager(
- SegmentManager &segment_manager
+ SegmentManager &segment_manager, PerfCounters &perf
) {
auto segment_cleaner = std::make_unique<SegmentCleaner>(
SegmentCleaner::config_t::get_default(),
- true);
+ perf, true);
auto journal = std::make_unique<Journal>(segment_manager);
auto cache = std::make_unique<Cache>(segment_manager);
auto lba_manager = lba_manager::create_lba_manager(segment_manager, *cache);
std::move(segment_cleaner),
std::move(journal),
std::move(cache),
- std::move(lba_manager));
+ std::move(lba_manager),
+ perf);
return ret;
}
auto get_seastore(
SegmentManagerRef sm
) {
- auto tm = get_transaction_manager(*sm);
+ PerfServiceRef perf_service = PerfServiceRef(new PerfService());
+ auto tm = get_transaction_manager(*sm, perf_service->get_counters());
auto cm = std::make_unique<collection_manager::FlatCollectionManager>(*tm);
return std::make_unique<SeaStore>(
std::move(sm),
std::move(tm),
std::move(cm),
- std::make_unique<crimson::os::seastore::onode::FLTreeOnodeManager>(*tm));
+ std::make_unique<crimson::os::seastore::onode::FLTreeOnodeManager>(*tm),
+ std::move(perf_service));
}
std::unique_ptr<TransactionManager> tm;
LBAManager *lba_manager;
SegmentCleaner *segment_cleaner;
+ PerfServiceRef perf_service = PerfServiceRef(new PerfService());
TMTestState() : EphemeralTestState() {}
virtual void _init() {
- tm = get_transaction_manager(*segment_manager);
+ perf_service->add_to_collection();
+ tm = get_transaction_manager(*segment_manager, perf_service->get_counters());
segment_cleaner = tm->get_segment_cleaner();
lba_manager = tm->get_lba_manager();
}
}
virtual seastar::future<> _teardown() {
+ perf_service->remove_from_collection();
return tm->close(
).handle_error(
crimson::ct_error::assert_all{"Error in teardown"}