From 194d93de993591729af6e7e6d410a72248457280 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Fri, 23 Jul 2021 09:06:51 -0700 Subject: [PATCH 01/27] add redwood local historam registry --- fdbserver/VersionedBTree.actor.cpp | 35 ++++++++++++++++-------------- flow/Histogram.h | 9 ++++---- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index ecd6540ffb..b0adc20ba0 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1449,6 +1449,7 @@ int nextPowerOf2(uint32_t x) { struct RedwoodMetrics { static constexpr unsigned int btreeLevels = 5; static int maxRecordCount; + HistogramRegistry* redwoodHistograms; struct EventReasonsArray { unsigned int eventReasons[(size_t)PagerEvents::MAXEVENTS][(size_t)PagerEventReasons::MAXEVENTREASONS]; @@ -1528,24 +1529,24 @@ struct RedwoodMetrics { Level() { clear(); } - void clear(int level = 0) { + void clear(int level = 0, HistogramRegistry* registry = nullptr) { metrics = {}; if (level > 0) { - if (!buildFillPctSketch) { + if (!buildFillPctSketch && registry!=nullptr) { std::string levelString = format("L%d", level); buildFillPctSketch = Histogram::getHistogram( - LiteralStringRef("buildFillPct"), levelString, Histogram::Unit::percentage); + LiteralStringRef("buildFillPct"), levelString, Histogram::Unit::percentage, registry); modifyFillPctSketch = Histogram::getHistogram( - LiteralStringRef("modifyFillPct"), levelString, Histogram::Unit::percentage); + LiteralStringRef("modifyFillPct"), levelString, Histogram::Unit::percentage, registry); buildStoredPctSketch = Histogram::getHistogram( - LiteralStringRef("buildStoredPct"), levelString, Histogram::Unit::percentage); + LiteralStringRef("buildStoredPct"), levelString, Histogram::Unit::percentage, registry); modifyStoredPctSketch = Histogram::getHistogram( - LiteralStringRef("modifyStoredPct"), levelString, Histogram::Unit::percentage); + LiteralStringRef("modifyStoredPct"), levelString, Histogram::Unit::percentage, registry); buildItemCountSketch = Histogram::getHistogram( - LiteralStringRef("buildItemCount"), levelString, Histogram::Unit::count, 0, maxRecordCount); + LiteralStringRef("buildItemCount"), levelString, Histogram::Unit::count, registry, 0, maxRecordCount); modifyItemCountSketch = Histogram::getHistogram( - LiteralStringRef("modifyItemCount"), levelString, Histogram::Unit::count, 0, maxRecordCount); + LiteralStringRef("modifyItemCount"), levelString, Histogram::Unit::count, registry, 0, maxRecordCount); } buildFillPctSketch->clear(); @@ -1583,22 +1584,24 @@ struct RedwoodMetrics { }; RedwoodMetrics() { + if (redwoodHistograms == nullptr) { + redwoodHistograms = new HistogramRegistry(); + } kvSizeWritten = - Histogram::getHistogram(LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes); + Histogram::getHistogram(LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistograms); kvSizeReadByGet = - Histogram::getHistogram(LiteralStringRef("kvSize"), LiteralStringRef("ReadByGet"), Histogram::Unit::bytes); + Histogram::getHistogram(LiteralStringRef("kvSize"), LiteralStringRef("ReadByGet"), Histogram::Unit::bytes, redwoodHistograms); kvSizeReadByGetRange = Histogram::getHistogram( - LiteralStringRef("kvSize"), LiteralStringRef("ReadByGetRange"), Histogram::Unit::bytes); - clear(); + LiteralStringRef("kvSize"), LiteralStringRef("ReadByGetRange"), Histogram::Unit::bytes, redwoodHistograms); + clear(redwoodHistograms); } - void clear() { + void clear(HistogramRegistry* registry = nullptr) { unsigned int levelCounter = 0; for (RedwoodMetrics::Level& level : levels) { - level.clear(levelCounter); + level.clear(levelCounter, registry); ++levelCounter; } - level(100).clear(); metric = {}; kvSizeWritten->clear(); @@ -1672,7 +1675,7 @@ struct RedwoodMetrics { { "", 0 } }; double elapsed = now() - startTime; - + redwoodHistograms->logReport(); if (e != nullptr) { for (auto& m : metrics) { char c = m.first[0]; diff --git a/flow/Histogram.h b/flow/Histogram.h index fef99d949c..b375e7b8a0 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -86,16 +86,17 @@ public: static Reference getHistogram(StringRef group, StringRef op, Unit unit, + HistogramRegistry* regis = nullptr, uint32_t lower = 0, uint32_t upper = UINT32_MAX) { std::string group_str = group.toString(); std::string op_str = op.toString(); std::string name = generateName(group_str, op_str); - HistogramRegistry& registry = GetHistogramRegistry(); - Histogram* h = registry.lookupHistogram(name); + HistogramRegistry* registry = (regis == nullptr) ? &GetHistogramRegistry() : regis; + Histogram* h = registry->lookupHistogram(name); if (!h) { - h = new Histogram(group_str, op_str, unit, registry, lower, upper); - registry.registerHistogram(h); + h = new Histogram(group_str, op_str, unit, *registry, lower, upper); + registry->registerHistogram(h); return Reference(h); } else { return Reference::addRef(h); From c9cddd65a052e9199c549c044c4509c48bc8617e Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Fri, 23 Jul 2021 09:18:11 -0700 Subject: [PATCH 02/27] initialize pointer in constructor and format --- fdbserver/VersionedBTree.actor.cpp | 30 ++++++++++++++++++------------ flow/Histogram.h | 2 +- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index b0adc20ba0..041798822d 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1533,7 +1533,7 @@ struct RedwoodMetrics { metrics = {}; if (level > 0) { - if (!buildFillPctSketch && registry!=nullptr) { + if (!buildFillPctSketch && registry != nullptr) { std::string levelString = format("L%d", level); buildFillPctSketch = Histogram::getHistogram( LiteralStringRef("buildFillPct"), levelString, Histogram::Unit::percentage, registry); @@ -1543,10 +1543,18 @@ struct RedwoodMetrics { LiteralStringRef("buildStoredPct"), levelString, Histogram::Unit::percentage, registry); modifyStoredPctSketch = Histogram::getHistogram( LiteralStringRef("modifyStoredPct"), levelString, Histogram::Unit::percentage, registry); - buildItemCountSketch = Histogram::getHistogram( - LiteralStringRef("buildItemCount"), levelString, Histogram::Unit::count, registry, 0, maxRecordCount); - modifyItemCountSketch = Histogram::getHistogram( - LiteralStringRef("modifyItemCount"), levelString, Histogram::Unit::count, registry, 0, maxRecordCount); + buildItemCountSketch = Histogram::getHistogram(LiteralStringRef("buildItemCount"), + levelString, + Histogram::Unit::count, + registry, + 0, + maxRecordCount); + modifyItemCountSketch = Histogram::getHistogram(LiteralStringRef("modifyItemCount"), + levelString, + Histogram::Unit::count, + registry, + 0, + maxRecordCount); } buildFillPctSketch->clear(); @@ -1584,13 +1592,11 @@ struct RedwoodMetrics { }; RedwoodMetrics() { - if (redwoodHistograms == nullptr) { - redwoodHistograms = new HistogramRegistry(); - } - kvSizeWritten = - Histogram::getHistogram(LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistograms); - kvSizeReadByGet = - Histogram::getHistogram(LiteralStringRef("kvSize"), LiteralStringRef("ReadByGet"), Histogram::Unit::bytes, redwoodHistograms); + redwoodHistograms = new HistogramRegistry(); + kvSizeWritten = Histogram::getHistogram( + LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistograms); + kvSizeReadByGet = Histogram::getHistogram( + LiteralStringRef("kvSize"), LiteralStringRef("ReadByGet"), Histogram::Unit::bytes, redwoodHistograms); kvSizeReadByGetRange = Histogram::getHistogram( LiteralStringRef("kvSize"), LiteralStringRef("ReadByGetRange"), Histogram::Unit::bytes, redwoodHistograms); clear(redwoodHistograms); diff --git a/flow/Histogram.h b/flow/Histogram.h index b375e7b8a0..7e79838659 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -86,7 +86,7 @@ public: static Reference getHistogram(StringRef group, StringRef op, Unit unit, - HistogramRegistry* regis = nullptr, + HistogramRegistry* regis = nullptr, uint32_t lower = 0, uint32_t upper = UINT32_MAX) { std::string group_str = group.toString(); From 77fa1aadabf10bf0f253a0e4aacd9c702e9db908 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Fri, 23 Jul 2021 16:32:58 -0700 Subject: [PATCH 03/27] rename variable --- fdbserver/VersionedBTree.actor.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 041798822d..eeb515bf13 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1449,7 +1449,7 @@ int nextPowerOf2(uint32_t x) { struct RedwoodMetrics { static constexpr unsigned int btreeLevels = 5; static int maxRecordCount; - HistogramRegistry* redwoodHistograms; + HistogramRegistry* redwoodHistogramRegistry; struct EventReasonsArray { unsigned int eventReasons[(size_t)PagerEvents::MAXEVENTS][(size_t)PagerEventReasons::MAXEVENTREASONS]; @@ -1592,14 +1592,14 @@ struct RedwoodMetrics { }; RedwoodMetrics() { - redwoodHistograms = new HistogramRegistry(); + redwoodHistogramRegistry = new HistogramRegistry(); kvSizeWritten = Histogram::getHistogram( - LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistograms); + LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistogramRegistry); kvSizeReadByGet = Histogram::getHistogram( - LiteralStringRef("kvSize"), LiteralStringRef("ReadByGet"), Histogram::Unit::bytes, redwoodHistograms); + LiteralStringRef("kvSize"), LiteralStringRef("ReadByGet"), Histogram::Unit::bytes, redwoodHistogramRegistry); kvSizeReadByGetRange = Histogram::getHistogram( - LiteralStringRef("kvSize"), LiteralStringRef("ReadByGetRange"), Histogram::Unit::bytes, redwoodHistograms); - clear(redwoodHistograms); + LiteralStringRef("kvSize"), LiteralStringRef("ReadByGetRange"), Histogram::Unit::bytes, redwoodHistogramRegistry); + clear(redwoodHistogramRegistry); } void clear(HistogramRegistry* registry = nullptr) { @@ -1681,7 +1681,7 @@ struct RedwoodMetrics { { "", 0 } }; double elapsed = now() - startTime; - redwoodHistograms->logReport(); + redwoodHistogramRegistry->logReport(); if (e != nullptr) { for (auto& m : metrics) { char c = m.first[0]; From 98e92ebde4dc9b2520b364af6d2c2d27b92556a0 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Mon, 26 Jul 2021 09:36:55 -0700 Subject: [PATCH 04/27] set local registry to null in destructor --- fdbserver/VersionedBTree.actor.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 74b46638cc..8d2cf91e29 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1595,10 +1595,14 @@ struct RedwoodMetrics { redwoodHistogramRegistry = new HistogramRegistry(); kvSizeWritten = Histogram::getHistogram( LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistogramRegistry); - kvSizeReadByGet = Histogram::getHistogram( - LiteralStringRef("kvSize"), LiteralStringRef("ReadByGet"), Histogram::Unit::bytes, redwoodHistogramRegistry); - kvSizeReadByGetRange = Histogram::getHistogram( - LiteralStringRef("kvSize"), LiteralStringRef("ReadByGetRange"), Histogram::Unit::bytes, redwoodHistogramRegistry); + kvSizeReadByGet = Histogram::getHistogram(LiteralStringRef("kvSize"), + LiteralStringRef("ReadByGet"), + Histogram::Unit::bytes, + redwoodHistogramRegistry); + kvSizeReadByGetRange = Histogram::getHistogram(LiteralStringRef("kvSize"), + LiteralStringRef("ReadByGetRange"), + Histogram::Unit::bytes, + redwoodHistogramRegistry); clear(redwoodHistogramRegistry); } @@ -1616,6 +1620,24 @@ struct RedwoodMetrics { startTime = g_network ? now() : 0; } + + ~RedwoodMetrics() { + kvSizeWritten.clear(); + kvSizeReadByGet.clear(); + kvSizeReadByGetRange.clear(); + for (RedwoodMetrics::Level& level : levels) { + level.buildFillPctSketch.clear(); + level.modifyFillPctSketch.clear(); + level.buildStoredPctSketch.clear(); + level.modifyStoredPctSketch.clear(); + level.buildItemCountSketch.clear(); + level.modifyItemCountSketch.clear(); + } + if (redwoodHistogramRegistry) + delete redwoodHistogramRegistry; + redwoodHistogramRegistry = nullptr; + } + // btree levels and one extra level for non btree level. Level levels[btreeLevels + 1]; metrics metric; From 98db02f66bc8d1d524d0d4a88846c73dd57557ba Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Mon, 26 Jul 2021 13:49:35 -0700 Subject: [PATCH 05/27] fix a minor error --- fdbserver/VersionedBTree.actor.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 8d2cf91e29..522c894184 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1531,9 +1531,9 @@ struct RedwoodMetrics { void clear(int level = 0, HistogramRegistry* registry = nullptr) { metrics = {}; - + // These histograms are used for Btree events, hence level > 0 if (level > 0) { - if (!buildFillPctSketch && registry != nullptr) { + if (!buildFillPctSketch && registry) { std::string levelString = format("L%d", level); buildFillPctSketch = Histogram::getHistogram( LiteralStringRef("buildFillPct"), levelString, Histogram::Unit::percentage, registry); @@ -1603,13 +1603,13 @@ struct RedwoodMetrics { LiteralStringRef("ReadByGetRange"), Histogram::Unit::bytes, redwoodHistogramRegistry); - clear(redwoodHistogramRegistry); + clear(); } - void clear(HistogramRegistry* registry = nullptr) { + void clear() { unsigned int levelCounter = 0; for (RedwoodMetrics::Level& level : levels) { - level.clear(levelCounter, registry); + level.clear(levelCounter, redwoodHistogramRegistry); ++levelCounter; } metric = {}; From 0f363eb624cc0a72e85bba598e12c4073cdd1454 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Mon, 26 Jul 2021 18:20:40 -0700 Subject: [PATCH 06/27] use fastRef --- fdbserver/VersionedBTree.actor.cpp | 21 ++++++++++----------- flow/Histogram.h | 12 ++++++------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 522c894184..f58379cc69 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1449,7 +1449,7 @@ int nextPowerOf2(uint32_t x) { struct RedwoodMetrics { static constexpr unsigned int btreeLevels = 5; static int maxRecordCount; - HistogramRegistry* redwoodHistogramRegistry; + Reference redwoodHistogramRegistry; struct EventReasonsArray { unsigned int eventReasons[(size_t)PagerEvents::MAXEVENTS][(size_t)PagerEventReasons::MAXEVENTREASONS]; @@ -1529,11 +1529,11 @@ struct RedwoodMetrics { Level() { clear(); } - void clear(int level = 0, HistogramRegistry* registry = nullptr) { + void clear(int level = 0, Reference registry = Reference()) { metrics = {}; // These histograms are used for Btree events, hence level > 0 if (level > 0) { - if (!buildFillPctSketch && registry) { + if (!buildFillPctSketch.isValid() && registry.isValid()) { std::string levelString = format("L%d", level); buildFillPctSketch = Histogram::getHistogram( LiteralStringRef("buildFillPct"), levelString, Histogram::Unit::percentage, registry); @@ -1592,7 +1592,7 @@ struct RedwoodMetrics { }; RedwoodMetrics() { - redwoodHistogramRegistry = new HistogramRegistry(); + redwoodHistogramRegistry = Reference(new HistogramRegistry()); kvSizeWritten = Histogram::getHistogram( LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistogramRegistry); kvSizeReadByGet = Histogram::getHistogram(LiteralStringRef("kvSize"), @@ -1633,9 +1633,7 @@ struct RedwoodMetrics { level.buildItemCountSketch.clear(); level.modifyItemCountSketch.clear(); } - if (redwoodHistogramRegistry) - delete redwoodHistogramRegistry; - redwoodHistogramRegistry = nullptr; + redwoodHistogramRegistry.clear(); } // btree levels and one extra level for non btree level. @@ -1703,7 +1701,8 @@ struct RedwoodMetrics { { "", 0 } }; double elapsed = now() - startTime; - redwoodHistogramRegistry->logReport(); + if (redwoodHistogramRegistry) + redwoodHistogramRegistry->logReport(); if (e != nullptr) { for (auto& m : metrics) { char c = m.first[0]; @@ -1794,7 +1793,7 @@ struct RedwoodMetrics { // Using a global for Redwood metrics because a single process shouldn't normally have multiple storage engines int RedwoodMetrics::maxRecordCount = 315; -RedwoodMetrics g_redwoodMetrics = {}; +RedwoodMetrics g_redwoodMetrics; Future g_redwoodMetricsActor; ACTOR Future redwoodMetricsLogger() { @@ -1947,7 +1946,7 @@ public: evictionOrder.swap(self->evictionOrder); state typename EvictionOrderT::iterator i = evictionOrder.begin(); - state typename EvictionOrderT::iterator iEnd = evictionOrder.begin(); + state typename EvictionOrderT::iterator iEnd = evictionOrder.end(); while (i != iEnd) { if (!i->item.evictable()) { @@ -2950,7 +2949,7 @@ public: Future> readExtent(LogicalPageID pageID) override { debug_printf("DWALPager(%s) op=readExtent %s\n", filename.c_str(), toString(pageID).c_str()); PageCacheEntry* pCacheEntry = extentCache.getIfExists(pageID); - auto& eventReasons = g_redwoodMetrics.level(0).metrics.events; + auto& eventReasons = g_redwoodMetrics.level(nonBtreeLevel).metrics.events; if (pCacheEntry != nullptr) { eventReasons.addEventReason(PagerEvents::CacheLookup, PagerEventReasons::MetaData); debug_printf("DWALPager(%s) Cache Entry exists for %s\n", filename.c_str(), toString(pageID).c_str()); diff --git a/flow/Histogram.h b/flow/Histogram.h index 7e79838659..8ce2a1385b 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -36,7 +36,7 @@ class Histogram; -class HistogramRegistry { +class HistogramRegistry : public ReferenceCounted { public: void registerHistogram(Histogram* h); void unregisterHistogram(Histogram* h); @@ -86,17 +86,17 @@ public: static Reference getHistogram(StringRef group, StringRef op, Unit unit, - HistogramRegistry* regis = nullptr, + Reference regis = Reference(), uint32_t lower = 0, uint32_t upper = UINT32_MAX) { std::string group_str = group.toString(); std::string op_str = op.toString(); std::string name = generateName(group_str, op_str); - HistogramRegistry* registry = (regis == nullptr) ? &GetHistogramRegistry() : regis; - Histogram* h = registry->lookupHistogram(name); + HistogramRegistry& registry = (regis.isValid()) ? *regis : GetHistogramRegistry(); + Histogram* h = registry.lookupHistogram(name); if (!h) { - h = new Histogram(group_str, op_str, unit, *registry, lower, upper); - registry->registerHistogram(h); + h = new Histogram(group_str, op_str, unit, registry, lower, upper); + registry.registerHistogram(h); return Reference(h); } else { return Reference::addRef(h); From 145bb9ef422b9096d0c19ea3779a07a85be418f4 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Mon, 26 Jul 2021 20:15:32 -0700 Subject: [PATCH 07/27] add back the default parameter --- fdbserver/VersionedBTree.actor.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index f58379cc69..33b929e6b5 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1603,13 +1603,13 @@ struct RedwoodMetrics { LiteralStringRef("ReadByGetRange"), Histogram::Unit::bytes, redwoodHistogramRegistry); - clear(); + clear(redwoodHistogramRegistry); } - void clear() { + void clear(Reference registry = Reference()) { unsigned int levelCounter = 0; for (RedwoodMetrics::Level& level : levels) { - level.clear(levelCounter, redwoodHistogramRegistry); + level.clear(levelCounter, registry); ++levelCounter; } metric = {}; @@ -1701,8 +1701,7 @@ struct RedwoodMetrics { { "", 0 } }; double elapsed = now() - startTime; - if (redwoodHistogramRegistry) - redwoodHistogramRegistry->logReport(); + redwoodHistogramRegistry->logReport(); if (e != nullptr) { for (auto& m : metrics) { char c = m.first[0]; From a5cb17374994857a11ade7a78b7972f59548134b Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Mon, 26 Jul 2021 22:53:23 -0700 Subject: [PATCH 08/27] initialize all memeber variables --- fdbserver/VersionedBTree.actor.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 33b929e6b5..0ffca14029 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1449,7 +1449,6 @@ int nextPowerOf2(uint32_t x) { struct RedwoodMetrics { static constexpr unsigned int btreeLevels = 5; static int maxRecordCount; - Reference redwoodHistogramRegistry; struct EventReasonsArray { unsigned int eventReasons[(size_t)PagerEvents::MAXEVENTS][(size_t)PagerEventReasons::MAXEVENTREASONS]; @@ -1527,7 +1526,16 @@ struct RedwoodMetrics { Reference buildItemCountSketch; Reference modifyItemCountSketch; - Level() { clear(); } + Level() { + metrics = {}; + buildFillPctSketch = Reference(); + modifyFillPctSketch = Reference(); + buildStoredPctSketch = Reference(); + modifyStoredPctSketch = Reference(); + buildItemCountSketch = Reference(); + modifyItemCountSketch = Reference(); + clear(); + } void clear(int level = 0, Reference registry = Reference()) { metrics = {}; @@ -1592,6 +1600,8 @@ struct RedwoodMetrics { }; RedwoodMetrics() { + metric = {}; + startTime = g_network ? now() : 0; redwoodHistogramRegistry = Reference(new HistogramRegistry()); kvSizeWritten = Histogram::getHistogram( LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistogramRegistry); @@ -1613,12 +1623,11 @@ struct RedwoodMetrics { ++levelCounter; } metric = {}; + startTime = g_network ? now() : 0; kvSizeWritten->clear(); kvSizeReadByGet->clear(); kvSizeReadByGetRange->clear(); - - startTime = g_network ? now() : 0; } ~RedwoodMetrics() { @@ -1635,7 +1644,7 @@ struct RedwoodMetrics { } redwoodHistogramRegistry.clear(); } - + Reference redwoodHistogramRegistry; // btree levels and one extra level for non btree level. Level levels[btreeLevels + 1]; metrics metric; @@ -1792,7 +1801,7 @@ struct RedwoodMetrics { // Using a global for Redwood metrics because a single process shouldn't normally have multiple storage engines int RedwoodMetrics::maxRecordCount = 315; -RedwoodMetrics g_redwoodMetrics; +RedwoodMetrics g_redwoodMetrics = {}; Future g_redwoodMetricsActor; ACTOR Future redwoodMetricsLogger() { From a8f97ac7280e9e73718c7e4c7f725e3d952a9f0f Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 27 Jul 2021 12:35:39 -0700 Subject: [PATCH 09/27] remove the .begin() to .end() fix --- fdbserver/VersionedBTree.actor.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 0ffca14029..1f02e8c9cd 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1954,7 +1954,7 @@ public: evictionOrder.swap(self->evictionOrder); state typename EvictionOrderT::iterator i = evictionOrder.begin(); - state typename EvictionOrderT::iterator iEnd = evictionOrder.end(); + state typename EvictionOrderT::iterator iEnd = evictionOrder.begin(); while (i != iEnd) { if (!i->item.evictable()) { @@ -5274,7 +5274,8 @@ private: .detail("BytesWritten", written); ASSERT(false); } - + // should be btree level event + ASSERT(height!=0); auto& metrics = g_redwoodMetrics.level(height); metrics.metrics.pageBuild += 1; metrics.metrics.pageBuildExt += p.blockCount - 1; @@ -5607,6 +5608,8 @@ private: // Page was updated in-place through edits and written to maybeNewID void updatedInPlace(BTreePageIDRef maybeNewID, BTreePage* btPage, int capacity) { inPlaceUpdate = true; + // should be btree level event + ASSERT(btPage->height!=0); auto& metrics = g_redwoodMetrics.level(btPage->height); metrics.metrics.pageModify += 1; metrics.metrics.pageModifyExt += (maybeNewID.size() - 1); From 1a609abc688d42aaa119b85c46b65a023ecf1fc8 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 27 Jul 2021 16:11:00 -0700 Subject: [PATCH 10/27] remove registry in redwood --- fdbserver/VersionedBTree.actor.cpp | 75 ++++++++++++++++-------------- flow/Histogram.h | 23 +++++---- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 1f02e8c9cd..1b7e3b8da6 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1537,32 +1537,32 @@ struct RedwoodMetrics { clear(); } - void clear(int level = 0, Reference registry = Reference()) { + void clear(int level = 0) { metrics = {}; // These histograms are used for Btree events, hence level > 0 if (level > 0) { - if (!buildFillPctSketch.isValid() && registry.isValid()) { - std::string levelString = format("L%d", level); - buildFillPctSketch = Histogram::getHistogram( - LiteralStringRef("buildFillPct"), levelString, Histogram::Unit::percentage, registry); - modifyFillPctSketch = Histogram::getHistogram( - LiteralStringRef("modifyFillPct"), levelString, Histogram::Unit::percentage, registry); - buildStoredPctSketch = Histogram::getHistogram( - LiteralStringRef("buildStoredPct"), levelString, Histogram::Unit::percentage, registry); - modifyStoredPctSketch = Histogram::getHistogram( - LiteralStringRef("modifyStoredPct"), levelString, Histogram::Unit::percentage, registry); - buildItemCountSketch = Histogram::getHistogram(LiteralStringRef("buildItemCount"), + if (!buildFillPctSketch.isValid()) { + std::string levelString = "L"+std::to_string(level); + buildFillPctSketch = Reference( + new Histogram( "buildFillPct", levelString, Histogram::Unit::percentage) ); + modifyFillPctSketch = Reference( + new Histogram( "modifyFillPct", levelString, Histogram::Unit::percentage) ); + buildStoredPctSketch = Reference( + new Histogram( "buildStoredPct", levelString, Histogram::Unit::percentage) ); + modifyStoredPctSketch = Reference( + new Histogram( "modifyStoredPct", levelString, Histogram::Unit::percentage) ); + buildItemCountSketch = Reference(new Histogram( + "buildItemCount", levelString, Histogram::Unit::count, - registry, 0, - maxRecordCount); - modifyItemCountSketch = Histogram::getHistogram(LiteralStringRef("modifyItemCount"), + maxRecordCount) ); + modifyItemCountSketch = Reference(new Histogram( + "modifyItemCount", levelString, Histogram::Unit::count, - registry, 0, - maxRecordCount); + maxRecordCount) ); } buildFillPctSketch->clear(); @@ -1602,24 +1602,23 @@ struct RedwoodMetrics { RedwoodMetrics() { metric = {}; startTime = g_network ? now() : 0; - redwoodHistogramRegistry = Reference(new HistogramRegistry()); - kvSizeWritten = Histogram::getHistogram( - LiteralStringRef("kvSize"), LiteralStringRef("Written"), Histogram::Unit::bytes, redwoodHistogramRegistry); - kvSizeReadByGet = Histogram::getHistogram(LiteralStringRef("kvSize"), - LiteralStringRef("ReadByGet"), - Histogram::Unit::bytes, - redwoodHistogramRegistry); - kvSizeReadByGetRange = Histogram::getHistogram(LiteralStringRef("kvSize"), - LiteralStringRef("ReadByGetRange"), - Histogram::Unit::bytes, - redwoodHistogramRegistry); - clear(redwoodHistogramRegistry); + kvSizeWritten = Reference( + new Histogram("kvSize", "Written", Histogram::Unit::bytes) ); + kvSizeReadByGet = Reference(new Histogram( + "kvSize", + "ReadByGet", + Histogram::Unit::bytes) ); + kvSizeReadByGetRange = Reference(new Histogram( + "kvSize", + "ReadByGetRange", + Histogram::Unit::bytes) ); + clear(); } - void clear(Reference registry = Reference()) { + void clear() { unsigned int levelCounter = 0; for (RedwoodMetrics::Level& level : levels) { - level.clear(levelCounter, registry); + level.clear(levelCounter); ++levelCounter; } metric = {}; @@ -1642,9 +1641,7 @@ struct RedwoodMetrics { level.buildItemCountSketch.clear(); level.modifyItemCountSketch.clear(); } - redwoodHistogramRegistry.clear(); } - Reference redwoodHistogramRegistry; // btree levels and one extra level for non btree level. Level levels[btreeLevels + 1]; metrics metric; @@ -1710,7 +1707,9 @@ struct RedwoodMetrics { { "", 0 } }; double elapsed = now() - startTime; - redwoodHistogramRegistry->logReport(); + kvSizeWritten->writeToLog(); + kvSizeReadByGet->writeToLog(); + kvSizeReadByGetRange->writeToLog(); if (e != nullptr) { for (auto& m : metrics) { char c = m.first[0]; @@ -1733,8 +1732,16 @@ struct RedwoodMetrics { } for (int i = 1; i < btreeLevels + 1; ++i) { + auto& level = levels[i]; auto& metric = levels[i].metrics; + level.buildFillPctSketch->writeToLog(); + level.modifyFillPctSketch->writeToLog(); + level.buildStoredPctSketch->writeToLog(); + level.modifyStoredPctSketch->writeToLog(); + level.buildItemCountSketch->writeToLog(); + level.modifyItemCountSketch->writeToLog(); + std::pair metrics[] = { { "PageBuild", metric.pageBuild }, { "PageBuildExt", metric.pageBuildExt }, diff --git a/flow/Histogram.h b/flow/Histogram.h index 8ce2a1385b..ca01ae225f 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -62,13 +62,12 @@ public: enum class Unit { microseconds = 0, bytes, bytes_per_second, percentage, count, MAXHISTOGRAMUNIT }; static const char* const UnitToStringMapper[]; -private: Histogram(std::string const& group, std::string const& op, Unit unit, - HistogramRegistry& registry, - uint32_t lower, - uint32_t upper) + uint32_t lower = 0, + uint32_t upper = UINT32_MAX, + Reference registry = Reference()) : group(group), op(op), unit(unit), registry(registry), lowerBound(lower), upperBound(upper), ReferenceCounted() { @@ -77,26 +76,26 @@ private: clear(); } - +private: static std::string generateName(std::string const& group, std::string const& op) { return group + ":" + op; } public: - ~Histogram() { registry.unregisterHistogram(this); } + ~Histogram() { registry->unregisterHistogram(this); } static Reference getHistogram(StringRef group, StringRef op, Unit unit, - Reference regis = Reference(), + Reference regis = Reference(), uint32_t lower = 0, uint32_t upper = UINT32_MAX) { std::string group_str = group.toString(); std::string op_str = op.toString(); std::string name = generateName(group_str, op_str); - HistogramRegistry& registry = (regis.isValid()) ? *regis : GetHistogramRegistry(); - Histogram* h = registry.lookupHistogram(name); + Reference registry = (regis.isValid()) ? regis : Reference(&GetHistogramRegistry()); + Histogram* h = registry->lookupHistogram(name); if (!h) { - h = new Histogram(group_str, op_str, unit, registry, lower, upper); - registry.registerHistogram(h); + h = new Histogram(group_str, op_str, unit, lower, upper, registry); + registry->registerHistogram(h); return Reference(h); } else { return Reference::addRef(h); @@ -170,7 +169,7 @@ public: std::string const group; std::string const op; Unit const unit; - HistogramRegistry& registry; + Reference registry; uint32_t buckets[32]; uint32_t lowerBound; uint32_t upperBound; From ee2be2f95f1d9e5c708ba332d5dc970c47ba06eb Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 27 Jul 2021 16:27:32 -0700 Subject: [PATCH 11/27] modify histogram destructor --- flow/Histogram.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/flow/Histogram.h b/flow/Histogram.h index ca01ae225f..c73165150f 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -80,7 +80,10 @@ private: static std::string generateName(std::string const& group, std::string const& op) { return group + ":" + op; } public: - ~Histogram() { registry->unregisterHistogram(this); } + ~Histogram() { + if (registry.isValid()) + registry->unregisterHistogram(this); + } static Reference getHistogram(StringRef group, StringRef op, From edea7f4fe5cfc83f5cb1def32cb4bfca31e8585b Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 27 Jul 2021 19:23:47 -0700 Subject: [PATCH 12/27] addRef --- fdbserver/VersionedBTree.actor.cpp | 25 ++++++------------------- flow/Histogram.cpp | 3 ++- flow/Histogram.h | 25 +++++++++++++------------ 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 1b7e3b8da6..1aa18758e0 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1528,12 +1528,12 @@ struct RedwoodMetrics { Level() { metrics = {}; - buildFillPctSketch = Reference(); - modifyFillPctSketch = Reference(); - buildStoredPctSketch = Reference(); - modifyStoredPctSketch = Reference(); - buildItemCountSketch = Reference(); - modifyItemCountSketch = Reference(); + buildFillPctSketch = Reference(new Histogram()); + modifyFillPctSketch = Reference(new Histogram()); + buildStoredPctSketch = Reference(new Histogram()); + modifyStoredPctSketch = Reference(new Histogram()); + buildItemCountSketch = Reference(new Histogram()); + modifyItemCountSketch = Reference(new Histogram()); clear(); } @@ -1629,19 +1629,6 @@ struct RedwoodMetrics { kvSizeReadByGetRange->clear(); } - ~RedwoodMetrics() { - kvSizeWritten.clear(); - kvSizeReadByGet.clear(); - kvSizeReadByGetRange.clear(); - for (RedwoodMetrics::Level& level : levels) { - level.buildFillPctSketch.clear(); - level.modifyFillPctSketch.clear(); - level.buildStoredPctSketch.clear(); - level.modifyStoredPctSketch.clear(); - level.buildItemCountSketch.clear(); - level.modifyItemCountSketch.clear(); - } - } // btree levels and one extra level for non btree level. Level levels[btreeLevels + 1]; metrics metric; diff --git a/flow/Histogram.cpp b/flow/Histogram.cpp index 74dc252212..259f4f0bd3 100644 --- a/flow/Histogram.cpp +++ b/flow/Histogram.cpp @@ -100,7 +100,8 @@ const char* const Histogram::UnitToStringMapper[] = { "microseconds", "bytes", "bytes_per_second", "percentage", - "count" }; + "count", + "none"}; void Histogram::writeToLog() { bool active = false; diff --git a/flow/Histogram.h b/flow/Histogram.h index c73165150f..405a76d82f 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -62,16 +62,16 @@ public: enum class Unit { microseconds = 0, bytes, bytes_per_second, percentage, count, MAXHISTOGRAMUNIT }; static const char* const UnitToStringMapper[]; - Histogram(std::string const& group, - std::string const& op, - Unit unit, + Histogram(std::string const& group = "", + std::string const& op = "", + Unit unit = Unit::MAXHISTOGRAMUNIT, uint32_t lower = 0, uint32_t upper = UINT32_MAX, - Reference registry = Reference()) - : group(group), op(op), unit(unit), registry(registry), lowerBound(lower), + Reference regis= Reference(new HistogramRegistry() )) + : group(group), op(op), unit(unit), registry(regis), lowerBound(lower), upperBound(upper), ReferenceCounted() { - ASSERT(unit < Unit::MAXHISTOGRAMUNIT); + ASSERT(unit <= Unit::MAXHISTOGRAMUNIT); ASSERT(upperBound >= lowerBound); clear(); @@ -81,24 +81,25 @@ private: public: ~Histogram() { - if (registry.isValid()) + if (registry.isValid() && unit != Unit::MAXHISTOGRAMUNIT) { registry->unregisterHistogram(this); + } + registry.clear(); } static Reference getHistogram(StringRef group, StringRef op, Unit unit, - Reference regis = Reference(), uint32_t lower = 0, uint32_t upper = UINT32_MAX) { std::string group_str = group.toString(); std::string op_str = op.toString(); std::string name = generateName(group_str, op_str); - Reference registry = (regis.isValid()) ? regis : Reference(&GetHistogramRegistry()); - Histogram* h = registry->lookupHistogram(name); + HistogramRegistry& registry = GetHistogramRegistry(); + Histogram* h = registry.lookupHistogram(name); if (!h) { - h = new Histogram(group_str, op_str, unit, lower, upper, registry); - registry->registerHistogram(h); + h = new Histogram(group_str, op_str, unit, lower, upper, Reference::addRef(®istry)); + registry.registerHistogram(h); return Reference(h); } else { return Reference::addRef(h); From 1804c6e417b2ae93f56e63c52b2c3909f32cd5ec Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 27 Jul 2021 20:05:17 -0700 Subject: [PATCH 13/27] add a default output for histogram --- flow/Histogram.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flow/Histogram.cpp b/flow/Histogram.cpp index 259f4f0bd3..bfc6e29ddc 100644 --- a/flow/Histogram.cpp +++ b/flow/Histogram.cpp @@ -136,6 +136,9 @@ void Histogram::writeToLog() { case Unit::count: e.detail(format("LessThan%f", (i + 1) * ((upperBound - lowerBound) / 31.0)), buckets[i]); break; + case Unit::MAXHISTOGRAMUNIT: + e.detail(format("Default%u", i), buckets[i]); + break; default: ASSERT(false); } From e12d2fd38c612af5894e364c9a3681277e686c77 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Wed, 28 Jul 2021 16:05:27 -0700 Subject: [PATCH 14/27] remove two assertions --- fdbserver/VersionedBTree.actor.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 00f0b56e12..62495af872 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -5268,8 +5268,6 @@ private: .detail("BytesWritten", written); ASSERT(false); } - // should be btree level event - ASSERT(height!=0); auto& metrics = g_redwoodMetrics.level(height); metrics.metrics.pageBuild += 1; metrics.metrics.pageBuildExt += p.blockCount - 1; @@ -5602,8 +5600,7 @@ private: // Page was updated in-place through edits and written to maybeNewID void updatedInPlace(BTreePageIDRef maybeNewID, BTreePage* btPage, int capacity) { inPlaceUpdate = true; - // should be btree level event - ASSERT(btPage->height!=0); + auto& metrics = g_redwoodMetrics.level(btPage->height); metrics.metrics.pageModify += 1; metrics.metrics.pageModifyExt += (maybeNewID.size() - 1); From 18eadfae3301573ef5494f17b9167e18f6732f78 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 3 Aug 2021 13:58:45 -0700 Subject: [PATCH 15/27] format --- flow/Histogram.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/flow/Histogram.h b/flow/Histogram.h index 405a76d82f..4b54047251 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -67,7 +67,7 @@ public: Unit unit = Unit::MAXHISTOGRAMUNIT, uint32_t lower = 0, uint32_t upper = UINT32_MAX, - Reference regis= Reference(new HistogramRegistry() )) + Reference regis = Reference(new HistogramRegistry())) : group(group), op(op), unit(unit), registry(regis), lowerBound(lower), upperBound(upper), ReferenceCounted() { @@ -76,13 +76,14 @@ public: clear(); } + private: static std::string generateName(std::string const& group, std::string const& op) { return group + ":" + op; } public: - ~Histogram() { + ~Histogram() { if (registry.isValid() && unit != Unit::MAXHISTOGRAMUNIT) { - registry->unregisterHistogram(this); + registry->unregisterHistogram(this); } registry.clear(); } @@ -98,7 +99,7 @@ public: HistogramRegistry& registry = GetHistogramRegistry(); Histogram* h = registry.lookupHistogram(name); if (!h) { - h = new Histogram(group_str, op_str, unit, lower, upper, Reference::addRef(®istry)); + h = new Histogram(group_str, op_str, unit, lower, upper, Reference::addRef(®istry)); registry.registerHistogram(h); return Reference(h); } else { From 7170c99220bfb6dc6fbfdbd042f40ce6b7549598 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 3 Aug 2021 14:36:50 -0700 Subject: [PATCH 16/27] fix a bug after merge --- flow/Histogram.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/Histogram.h b/flow/Histogram.h index 184712861c..65553176ea 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -68,7 +68,7 @@ public: uint32_t lower = 0, uint32_t upper = UINT32_MAX, Reference regis = Reference(new HistogramRegistry())) - : group(group), op(op), unit(unit), registry(registry), lowerBound(lower), upperBound(upper) { + : group(group), op(op), unit(unit), registry(regis), lowerBound(lower), upperBound(upper) { ASSERT(unit <= Unit::MAXHISTOGRAMUNIT); ASSERT(upperBound >= lowerBound); From 5e76650d9b9b47ce8a3f9cd138b087205e0e209d Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Mon, 9 Aug 2021 15:26:58 -0700 Subject: [PATCH 17/27] update constructor --- fdbserver/VersionedBTree.actor.cpp | 64 +++++++++++++----------------- flow/Histogram.h | 8 ++-- 2 files changed, 31 insertions(+), 41 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 62fbad100d..6129222afa 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1528,12 +1528,6 @@ struct RedwoodMetrics { Level() { metrics = {}; - buildFillPctSketch = Reference(new Histogram()); - modifyFillPctSketch = Reference(new Histogram()); - buildStoredPctSketch = Reference(new Histogram()); - modifyStoredPctSketch = Reference(new Histogram()); - buildItemCountSketch = Reference(new Histogram()); - modifyItemCountSketch = Reference(new Histogram()); clear(); } @@ -1542,27 +1536,27 @@ struct RedwoodMetrics { // These histograms are used for Btree events, hence level > 0 if (level > 0) { if (!buildFillPctSketch.isValid()) { - std::string levelString = "L"+std::to_string(level); - buildFillPctSketch = Reference( - new Histogram( "buildFillPct", levelString, Histogram::Unit::percentage) ); - modifyFillPctSketch = Reference( - new Histogram( "modifyFillPct", levelString, Histogram::Unit::percentage) ); - buildStoredPctSketch = Reference( - new Histogram( "buildStoredPct", levelString, Histogram::Unit::percentage) ); - modifyStoredPctSketch = Reference( - new Histogram( "modifyStoredPct", levelString, Histogram::Unit::percentage) ); - buildItemCountSketch = Reference(new Histogram( - "buildItemCount", - levelString, - Histogram::Unit::count, - 0, - maxRecordCount) ); - modifyItemCountSketch = Reference(new Histogram( - "modifyItemCount", - levelString, - Histogram::Unit::count, - 0, - maxRecordCount) ); + std::string levelString = "L" + std::to_string(level); + buildFillPctSketch = Reference(new Histogram( + Reference(), "buildFillPct", levelString, Histogram::Unit::percentage)); + modifyFillPctSketch = Reference(new Histogram( + Reference(), "modifyFillPct", levelString, Histogram::Unit::percentage)); + buildStoredPctSketch = Reference(new Histogram( + Reference(), "buildStoredPct", levelString, Histogram::Unit::percentage)); + modifyStoredPctSketch = Reference(new Histogram( + Reference(), "modifyStoredPct", levelString, Histogram::Unit::percentage)); + buildItemCountSketch = Reference(new Histogram(Reference(), + "buildItemCount", + levelString, + Histogram::Unit::count, + 0, + maxRecordCount)); + modifyItemCountSketch = Reference(new Histogram(Reference(), + "modifyItemCount", + levelString, + Histogram::Unit::count, + 0, + maxRecordCount)); } buildFillPctSketch->clear(); @@ -1603,15 +1597,11 @@ struct RedwoodMetrics { metric = {}; startTime = g_network ? now() : 0; kvSizeWritten = Reference( - new Histogram("kvSize", "Written", Histogram::Unit::bytes) ); - kvSizeReadByGet = Reference(new Histogram( - "kvSize", - "ReadByGet", - Histogram::Unit::bytes) ); - kvSizeReadByGetRange = Reference(new Histogram( - "kvSize", - "ReadByGetRange", - Histogram::Unit::bytes) ); + new Histogram(Reference(), "kvSize", "Written", Histogram::Unit::bytes)); + kvSizeReadByGet = Reference( + new Histogram(Reference(), "kvSize", "ReadByGet", Histogram::Unit::bytes)); + kvSizeReadByGetRange = Reference( + new Histogram(Reference(), "kvSize", "ReadByGetRange", Histogram::Unit::bytes)); clear(); } @@ -5600,7 +5590,7 @@ private: // Page was updated in-place through edits and written to maybeNewID void updatedInPlace(BTreePageIDRef maybeNewID, BTreePage* btPage, int capacity) { inPlaceUpdate = true; - + auto& metrics = g_redwoodMetrics.level(btPage->height); metrics.metrics.pageModify += 1; metrics.metrics.pageModifyExt += (maybeNewID.size() - 1); diff --git a/flow/Histogram.h b/flow/Histogram.h index 65553176ea..962c29041e 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -62,12 +62,12 @@ public: enum class Unit { microseconds = 0, bytes, bytes_per_second, percentage, count, MAXHISTOGRAMUNIT }; static const char* const UnitToStringMapper[]; - Histogram(std::string const& group = "", + Histogram(Reference regis, + std::string const& group = "", std::string const& op = "", Unit unit = Unit::MAXHISTOGRAMUNIT, uint32_t lower = 0, - uint32_t upper = UINT32_MAX, - Reference regis = Reference(new HistogramRegistry())) + uint32_t upper = UINT32_MAX) : group(group), op(op), unit(unit), registry(regis), lowerBound(lower), upperBound(upper) { ASSERT(unit <= Unit::MAXHISTOGRAMUNIT); @@ -98,7 +98,7 @@ public: HistogramRegistry& registry = GetHistogramRegistry(); Histogram* h = registry.lookupHistogram(name); if (!h) { - h = new Histogram(group_str, op_str, unit, lower, upper, Reference::addRef(®istry)); + h = new Histogram(Reference::addRef(®istry), group_str, op_str, unit, lower, upper); registry.registerHistogram(h); return Reference(h); } else { From 6dbde9f12603ac500f529d8d05f45b39a5b5b289 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 10 Aug 2021 14:22:29 -0700 Subject: [PATCH 18/27] clean the constructor --- fdbserver/VersionedBTree.actor.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 6129222afa..da73b19456 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1594,8 +1594,6 @@ struct RedwoodMetrics { }; RedwoodMetrics() { - metric = {}; - startTime = g_network ? now() : 0; kvSizeWritten = Reference( new Histogram(Reference(), "kvSize", "Written", Histogram::Unit::bytes)); kvSizeReadByGet = Reference( @@ -1612,11 +1610,11 @@ struct RedwoodMetrics { ++levelCounter; } metric = {}; - startTime = g_network ? now() : 0; - kvSizeWritten->clear(); kvSizeReadByGet->clear(); kvSizeReadByGetRange->clear(); + + startTime = g_network ? now() : 0; } // btree levels and one extra level for non btree level. From b65a66fab7f9afad1cf2c4d5b96f1e71b05bee64 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 24 Aug 2021 09:57:39 -0700 Subject: [PATCH 19/27] log redwood histogram seperatly --- fdbclient/ServerKnobs.cpp | 3 +- fdbclient/ServerKnobs.h | 3 +- fdbserver/VersionedBTree.actor.cpp | 112 ++++++++++++++--------------- flow/Histogram.cpp | 14 ++-- flow/Histogram.h | 7 +- 5 files changed, 71 insertions(+), 68 deletions(-) diff --git a/fdbclient/ServerKnobs.cpp b/fdbclient/ServerKnobs.cpp index 3437186209..846251a856 100644 --- a/fdbclient/ServerKnobs.cpp +++ b/fdbclient/ServerKnobs.cpp @@ -743,7 +743,8 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi init( REDWOOD_LAZY_CLEAR_MAX_PAGES, 1e6 ); init( REDWOOD_REMAP_CLEANUP_WINDOW, 50 ); init( REDWOOD_REMAP_CLEANUP_LAG, 0.1 ); - init( REDWOOD_LOGGING_INTERVAL, 5.0 ); + init( REDWOOD_METRICS_INTERVAL, 5.0 ); + init( REDWOOD_HISTOGRAM_INTERVAL, 30.0 ); // Server request latency measurement init( LATENCY_SAMPLE_SIZE, 100000 ); diff --git a/fdbclient/ServerKnobs.h b/fdbclient/ServerKnobs.h index 82dbd227b0..146b3c4fdd 100644 --- a/fdbclient/ServerKnobs.h +++ b/fdbclient/ServerKnobs.h @@ -690,7 +690,8 @@ public: int64_t REDWOOD_REMAP_CLEANUP_WINDOW; // Remap remover lag interval in which to coalesce page writes double REDWOOD_REMAP_CLEANUP_LAG; // Maximum allowed remap remover lag behind the cleanup window as a multiple of // the window size - double REDWOOD_LOGGING_INTERVAL; + double REDWOOD_METRICS_INTERVAL; + double REDWOOD_HISTOGRAM_INTERVAL; // Server request latency measurement int LATENCY_SAMPLE_SIZE; diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index da73b19456..bcbd8ab7b2 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1528,44 +1528,10 @@ struct RedwoodMetrics { Level() { metrics = {}; - clear(); } - void clear(int level = 0) { + void clear() { metrics = {}; - // These histograms are used for Btree events, hence level > 0 - if (level > 0) { - if (!buildFillPctSketch.isValid()) { - std::string levelString = "L" + std::to_string(level); - buildFillPctSketch = Reference(new Histogram( - Reference(), "buildFillPct", levelString, Histogram::Unit::percentage)); - modifyFillPctSketch = Reference(new Histogram( - Reference(), "modifyFillPct", levelString, Histogram::Unit::percentage)); - buildStoredPctSketch = Reference(new Histogram( - Reference(), "buildStoredPct", levelString, Histogram::Unit::percentage)); - modifyStoredPctSketch = Reference(new Histogram( - Reference(), "modifyStoredPct", levelString, Histogram::Unit::percentage)); - buildItemCountSketch = Reference(new Histogram(Reference(), - "buildItemCount", - levelString, - Histogram::Unit::count, - 0, - maxRecordCount)); - modifyItemCountSketch = Reference(new Histogram(Reference(), - "modifyItemCount", - levelString, - Histogram::Unit::count, - 0, - maxRecordCount)); - } - - buildFillPctSketch->clear(); - modifyFillPctSketch->clear(); - buildStoredPctSketch->clear(); - modifyStoredPctSketch->clear(); - buildItemCountSketch->clear(); - modifyItemCountSketch->clear(); - } } }; @@ -1594,32 +1560,59 @@ struct RedwoodMetrics { }; RedwoodMetrics() { + RedwoodRegistry = Reference( new HistogramRegistry() ); kvSizeWritten = Reference( - new Histogram(Reference(), "kvSize", "Written", Histogram::Unit::bytes)); + new Histogram(RedwoodRegistry, "kvSize", "Written", Histogram::Unit::bytes)); kvSizeReadByGet = Reference( - new Histogram(Reference(), "kvSize", "ReadByGet", Histogram::Unit::bytes)); + new Histogram(RedwoodRegistry, "kvSize", "ReadByGet", Histogram::Unit::bytes)); kvSizeReadByGetRange = Reference( - new Histogram(Reference(), "kvSize", "ReadByGetRange", Histogram::Unit::bytes)); + new Histogram(RedwoodRegistry, "kvSize", "ReadByGetRange", Histogram::Unit::bytes)); + + // These histograms are used for Btree events, hence level > 0 + unsigned int levelCounter = 0; + for (RedwoodMetrics::Level& level : levels) { + if (levelCounter>0){ + std::string levelString = "L" + std::to_string(levelCounter); + level.buildFillPctSketch = Reference(new Histogram( + RedwoodRegistry, "buildFillPct", levelString, Histogram::Unit::percentage)); + level.modifyFillPctSketch = Reference(new Histogram( + RedwoodRegistry, "modifyFillPct", levelString, Histogram::Unit::percentage)); + level.buildStoredPctSketch = Reference(new Histogram( + RedwoodRegistry, "buildStoredPct", levelString, Histogram::Unit::percentage)); + level.modifyStoredPctSketch = Reference(new Histogram( + RedwoodRegistry, "modifyStoredPct", levelString, Histogram::Unit::percentage)); + level.buildItemCountSketch = Reference(new Histogram(RedwoodRegistry, + "buildItemCount", + levelString, + Histogram::Unit::count, + 0, + maxRecordCount)); + level.modifyItemCountSketch = Reference(new Histogram(RedwoodRegistry, + "modifyItemCount", + levelString, + Histogram::Unit::count, + 0, + maxRecordCount)); + } + ++levelCounter; + } clear(); + RedwoodRegistry->clear(); } void clear() { - unsigned int levelCounter = 0; for (RedwoodMetrics::Level& level : levels) { - level.clear(levelCounter); - ++levelCounter; + level.clear(); } metric = {}; - kvSizeWritten->clear(); - kvSizeReadByGet->clear(); - kvSizeReadByGetRange->clear(); - startTime = g_network ? now() : 0; } // btree levels and one extra level for non btree level. Level levels[btreeLevels + 1]; metrics metric; + + Reference RedwoodRegistry; Reference kvSizeWritten; Reference kvSizeReadByGet; Reference kvSizeReadByGetRange; @@ -1682,9 +1675,7 @@ struct RedwoodMetrics { { "", 0 } }; double elapsed = now() - startTime; - kvSizeWritten->writeToLog(); - kvSizeReadByGet->writeToLog(); - kvSizeReadByGetRange->writeToLog(); + if (e != nullptr) { for (auto& m : metrics) { char c = m.first[0]; @@ -1707,16 +1698,8 @@ struct RedwoodMetrics { } for (int i = 1; i < btreeLevels + 1; ++i) { - auto& level = levels[i]; auto& metric = levels[i].metrics; - level.buildFillPctSketch->writeToLog(); - level.modifyFillPctSketch->writeToLog(); - level.buildStoredPctSketch->writeToLog(); - level.modifyStoredPctSketch->writeToLog(); - level.buildItemCountSketch->writeToLog(); - level.modifyItemCountSketch->writeToLog(); - std::pair metrics[] = { { "PageBuild", metric.pageBuild }, { "PageBuildExt", metric.pageBuildExt }, @@ -1786,11 +1769,24 @@ int RedwoodMetrics::maxRecordCount = 315; RedwoodMetrics g_redwoodMetrics = {}; Future g_redwoodMetricsActor; +ACTOR Future redwoodHistogramsLogger(Reference registry, double interval) { + ASSERT(registry.isValid()); + registry->clear(); + state double currTime; + loop { + currTime = now(); + wait(delay(interval)); + double elapsed = now() - currTime; + registry->logReport(elapsed); + } +} + ACTOR Future redwoodMetricsLogger() { g_redwoodMetrics.clear(); - + state FutureloggingFuture = + redwoodHistogramsLogger(g_redwoodMetrics.RedwoodRegistry, SERVER_KNOBS->REDWOOD_HISTOGRAM_INTERVAL); loop { - wait(delay(SERVER_KNOBS->REDWOOD_LOGGING_INTERVAL)); + wait(delay(SERVER_KNOBS->REDWOOD_METRICS_INTERVAL)); TraceEvent e("RedwoodMetrics"); double elapsed = now() - g_redwoodMetrics.startTime; diff --git a/flow/Histogram.cpp b/flow/Histogram.cpp index 653b6d0f8b..744f977cc3 100644 --- a/flow/Histogram.cpp +++ b/flow/Histogram.cpp @@ -85,9 +85,15 @@ Histogram* HistogramRegistry::lookupHistogram(std::string const& name) { return h->second; } -void HistogramRegistry::logReport() { +void HistogramRegistry::logReport(double elapsed) { + for (auto& i : histograms) { + i.second->writeToLog(elapsed); + i.second->clear(); + } +} + +void HistogramRegistry::clear() { for (auto& i : histograms) { - i.second->writeToLog(); i.second->clear(); } } @@ -103,7 +109,7 @@ const char* const Histogram::UnitToStringMapper[] = { "microseconds", "count", "none"}; -void Histogram::writeToLog() { +void Histogram::writeToLog(double elapsed) { bool active = false; for (uint32_t i = 0; i < 32; i++) { if (buckets[i]) { @@ -117,7 +123,7 @@ void Histogram::writeToLog() { TraceEvent e(SevInfo, "Histogram"); e.detail("Group", group).detail("Op", op).detail("Unit", UnitToStringMapper[(size_t)unit]); - + e.detail("Elapsed", elapsed); int totalCount = 0; for (uint32_t i = 0; i < 32; i++) { uint64_t value = uint64_t(1) << (i + 1); diff --git a/flow/Histogram.h b/flow/Histogram.h index 962c29041e..cb4a8fba2b 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -23,12 +23,10 @@ #pragma once #include - #include #include #include #include - #ifdef _WIN32 #include #pragma intrinsic(_BitScanReverse) @@ -41,7 +39,8 @@ public: void registerHistogram(Histogram* h); void unregisterHistogram(Histogram* h); Histogram* lookupHistogram(std::string const& name); - void logReport(); + void logReport(double elapsed = -1.0); + void clear(); private: // This map is ordered by key so that ops within the same group end up @@ -164,7 +163,7 @@ public: i = 0; } } - void writeToLog(); + void writeToLog(double elapsed = -1.0); std::string name() const { return generateName(this->group, this->op); } From 57652a0cae1754009d1f9528c3137e9c77b238d3 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 24 Aug 2021 10:00:24 -0700 Subject: [PATCH 20/27] Format --- fdbclient/ServerKnobs.cpp | 2 +- fdbserver/VersionedBTree.actor.cpp | 62 ++++++++++++------------------ flow/Histogram.cpp | 8 +--- 3 files changed, 28 insertions(+), 44 deletions(-) diff --git a/fdbclient/ServerKnobs.cpp b/fdbclient/ServerKnobs.cpp index 846251a856..ab80f7aec7 100644 --- a/fdbclient/ServerKnobs.cpp +++ b/fdbclient/ServerKnobs.cpp @@ -748,7 +748,7 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi // Server request latency measurement init( LATENCY_SAMPLE_SIZE, 100000 ); - init( LATENCY_METRICS_LOGGING_INTERVAL, 60.0 ); + init( LATENCY_METRICS_LOGGING_INTERVAL, 60.0 ); // clang-format on diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index bcbd8ab7b2..44c1401e13 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1526,13 +1526,9 @@ struct RedwoodMetrics { Reference buildItemCountSketch; Reference modifyItemCountSketch; - Level() { - metrics = {}; - } + Level() { metrics = {}; } - void clear() { - metrics = {}; - } + void clear() { metrics = {}; } }; struct metrics { @@ -1560,39 +1556,31 @@ struct RedwoodMetrics { }; RedwoodMetrics() { - RedwoodRegistry = Reference( new HistogramRegistry() ); - kvSizeWritten = Reference( - new Histogram(RedwoodRegistry, "kvSize", "Written", Histogram::Unit::bytes)); - kvSizeReadByGet = Reference( - new Histogram(RedwoodRegistry, "kvSize", "ReadByGet", Histogram::Unit::bytes)); - kvSizeReadByGetRange = Reference( - new Histogram(RedwoodRegistry, "kvSize", "ReadByGetRange", Histogram::Unit::bytes)); - + RedwoodRegistry = Reference(new HistogramRegistry()); + kvSizeWritten = + Reference(new Histogram(RedwoodRegistry, "kvSize", "Written", Histogram::Unit::bytes)); + kvSizeReadByGet = + Reference(new Histogram(RedwoodRegistry, "kvSize", "ReadByGet", Histogram::Unit::bytes)); + kvSizeReadByGetRange = + Reference(new Histogram(RedwoodRegistry, "kvSize", "ReadByGetRange", Histogram::Unit::bytes)); + // These histograms are used for Btree events, hence level > 0 unsigned int levelCounter = 0; for (RedwoodMetrics::Level& level : levels) { - if (levelCounter>0){ + if (levelCounter > 0) { std::string levelString = "L" + std::to_string(levelCounter); - level.buildFillPctSketch = Reference(new Histogram( - RedwoodRegistry, "buildFillPct", levelString, Histogram::Unit::percentage)); - level.modifyFillPctSketch = Reference(new Histogram( - RedwoodRegistry, "modifyFillPct", levelString, Histogram::Unit::percentage)); - level.buildStoredPctSketch = Reference(new Histogram( - RedwoodRegistry, "buildStoredPct", levelString, Histogram::Unit::percentage)); - level.modifyStoredPctSketch = Reference(new Histogram( - RedwoodRegistry, "modifyStoredPct", levelString, Histogram::Unit::percentage)); - level.buildItemCountSketch = Reference(new Histogram(RedwoodRegistry, - "buildItemCount", - levelString, - Histogram::Unit::count, - 0, - maxRecordCount)); - level.modifyItemCountSketch = Reference(new Histogram(RedwoodRegistry, - "modifyItemCount", - levelString, - Histogram::Unit::count, - 0, - maxRecordCount)); + level.buildFillPctSketch = Reference( + new Histogram(RedwoodRegistry, "buildFillPct", levelString, Histogram::Unit::percentage)); + level.modifyFillPctSketch = Reference( + new Histogram(RedwoodRegistry, "modifyFillPct", levelString, Histogram::Unit::percentage)); + level.buildStoredPctSketch = Reference( + new Histogram(RedwoodRegistry, "buildStoredPct", levelString, Histogram::Unit::percentage)); + level.modifyStoredPctSketch = Reference( + new Histogram(RedwoodRegistry, "modifyStoredPct", levelString, Histogram::Unit::percentage)); + level.buildItemCountSketch = Reference(new Histogram( + RedwoodRegistry, "buildItemCount", levelString, Histogram::Unit::count, 0, maxRecordCount)); + level.modifyItemCountSketch = Reference(new Histogram( + RedwoodRegistry, "modifyItemCount", levelString, Histogram::Unit::count, 0, maxRecordCount)); } ++levelCounter; } @@ -1783,8 +1771,8 @@ ACTOR Future redwoodHistogramsLogger(Reference registry ACTOR Future redwoodMetricsLogger() { g_redwoodMetrics.clear(); - state FutureloggingFuture = - redwoodHistogramsLogger(g_redwoodMetrics.RedwoodRegistry, SERVER_KNOBS->REDWOOD_HISTOGRAM_INTERVAL); + state Future loggingFuture = + redwoodHistogramsLogger(g_redwoodMetrics.RedwoodRegistry, SERVER_KNOBS->REDWOOD_HISTOGRAM_INTERVAL); loop { wait(delay(SERVER_KNOBS->REDWOOD_METRICS_INTERVAL)); diff --git a/flow/Histogram.cpp b/flow/Histogram.cpp index 744f977cc3..68f3d78c4f 100644 --- a/flow/Histogram.cpp +++ b/flow/Histogram.cpp @@ -102,12 +102,8 @@ void HistogramRegistry::clear() { #pragma region Histogram -const char* const Histogram::UnitToStringMapper[] = { "microseconds", - "bytes", - "bytes_per_second", - "percentage", - "count", - "none"}; +const char* const Histogram::UnitToStringMapper[] = { "microseconds", "bytes", "bytes_per_second", + "percentage", "count", "none" }; void Histogram::writeToLog(double elapsed) { bool active = false; From 5eb92ae65cc069bd6b6560416aeecfd07357a374 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 24 Aug 2021 15:47:04 -0700 Subject: [PATCH 21/27] reomve registry --- fdbclient/ServerKnobs.cpp | 2 +- fdbserver/VersionedBTree.actor.cpp | 75 +++++++++++++++++++----------- flow/Histogram.cpp | 3 +- flow/Histogram.h | 1 - 4 files changed, 52 insertions(+), 29 deletions(-) diff --git a/fdbclient/ServerKnobs.cpp b/fdbclient/ServerKnobs.cpp index ab80f7aec7..c2e3f7586c 100644 --- a/fdbclient/ServerKnobs.cpp +++ b/fdbclient/ServerKnobs.cpp @@ -744,7 +744,7 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi init( REDWOOD_REMAP_CLEANUP_WINDOW, 50 ); init( REDWOOD_REMAP_CLEANUP_LAG, 0.1 ); init( REDWOOD_METRICS_INTERVAL, 5.0 ); - init( REDWOOD_HISTOGRAM_INTERVAL, 30.0 ); + init( REDWOOD_HISTOGRAM_INTERVAL, 30.0 ); // Server request latency measurement init( LATENCY_SAMPLE_SIZE, 100000 ); diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 44c1401e13..4a87e23474 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1556,36 +1556,43 @@ struct RedwoodMetrics { }; RedwoodMetrics() { - RedwoodRegistry = Reference(new HistogramRegistry()); - kvSizeWritten = - Reference(new Histogram(RedwoodRegistry, "kvSize", "Written", Histogram::Unit::bytes)); - kvSizeReadByGet = - Reference(new Histogram(RedwoodRegistry, "kvSize", "ReadByGet", Histogram::Unit::bytes)); - kvSizeReadByGetRange = - Reference(new Histogram(RedwoodRegistry, "kvSize", "ReadByGetRange", Histogram::Unit::bytes)); + // All histograms have reset their buckets to 0 in the contructor. + kvSizeWritten = Reference( + new Histogram(Reference(), "kvSize", "Written", Histogram::Unit::bytes)); + kvSizeReadByGet = Reference( + new Histogram(Reference(), "kvSize", "ReadByGet", Histogram::Unit::bytes)); + kvSizeReadByGetRange = Reference( + new Histogram(Reference(), "kvSize", "ReadByGetRange", Histogram::Unit::bytes)); // These histograms are used for Btree events, hence level > 0 unsigned int levelCounter = 0; for (RedwoodMetrics::Level& level : levels) { if (levelCounter > 0) { std::string levelString = "L" + std::to_string(levelCounter); - level.buildFillPctSketch = Reference( - new Histogram(RedwoodRegistry, "buildFillPct", levelString, Histogram::Unit::percentage)); - level.modifyFillPctSketch = Reference( - new Histogram(RedwoodRegistry, "modifyFillPct", levelString, Histogram::Unit::percentage)); - level.buildStoredPctSketch = Reference( - new Histogram(RedwoodRegistry, "buildStoredPct", levelString, Histogram::Unit::percentage)); - level.modifyStoredPctSketch = Reference( - new Histogram(RedwoodRegistry, "modifyStoredPct", levelString, Histogram::Unit::percentage)); - level.buildItemCountSketch = Reference(new Histogram( - RedwoodRegistry, "buildItemCount", levelString, Histogram::Unit::count, 0, maxRecordCount)); - level.modifyItemCountSketch = Reference(new Histogram( - RedwoodRegistry, "modifyItemCount", levelString, Histogram::Unit::count, 0, maxRecordCount)); + level.buildFillPctSketch = Reference(new Histogram( + Reference(), "buildFillPct", levelString, Histogram::Unit::percentage)); + level.modifyFillPctSketch = Reference(new Histogram( + Reference(), "modifyFillPct", levelString, Histogram::Unit::percentage)); + level.buildStoredPctSketch = Reference(new Histogram( + Reference(), "buildStoredPct", levelString, Histogram::Unit::percentage)); + level.modifyStoredPctSketch = Reference(new Histogram( + Reference(), "modifyStoredPct", levelString, Histogram::Unit::percentage)); + level.buildItemCountSketch = Reference(new Histogram(Reference(), + "buildItemCount", + levelString, + Histogram::Unit::count, + 0, + maxRecordCount)); + level.modifyItemCountSketch = Reference(new Histogram(Reference(), + "modifyItemCount", + levelString, + Histogram::Unit::count, + 0, + maxRecordCount)); } ++levelCounter; } clear(); - RedwoodRegistry->clear(); } void clear() { @@ -1631,6 +1638,25 @@ struct RedwoodMetrics { } } + void logHistograms(double elapsed) { + // All histograms have reset their buckets to 0 after writeToLog. + kvSizeWritten->writeToLog(elapsed); + kvSizeReadByGet->writeToLog(elapsed); + kvSizeReadByGetRange->writeToLog(elapsed); + unsigned int levelCounter = 0; + for (RedwoodMetrics::Level& level : levels) { + if (levelCounter > 0) { + level.buildFillPctSketch->writeToLog(elapsed); + level.modifyFillPctSketch->writeToLog(elapsed); + level.buildStoredPctSketch->writeToLog(elapsed); + level.modifyStoredPctSketch->writeToLog(elapsed); + level.buildItemCountSketch->writeToLog(elapsed); + level.modifyItemCountSketch->writeToLog(elapsed); + } + ++levelCounter; + } + } + // This will populate a trace event and/or a string with Redwood metrics. // The string is a reasonably well formatted page of information void getFields(TraceEvent* e, std::string* s = nullptr, bool skipZeroes = false) { @@ -1757,22 +1783,19 @@ int RedwoodMetrics::maxRecordCount = 315; RedwoodMetrics g_redwoodMetrics = {}; Future g_redwoodMetricsActor; -ACTOR Future redwoodHistogramsLogger(Reference registry, double interval) { - ASSERT(registry.isValid()); - registry->clear(); +ACTOR Future redwoodHistogramsLogger(double interval) { state double currTime; loop { currTime = now(); wait(delay(interval)); double elapsed = now() - currTime; - registry->logReport(elapsed); + g_redwoodMetrics.logHistograms(elapsed); } } ACTOR Future redwoodMetricsLogger() { g_redwoodMetrics.clear(); - state Future loggingFuture = - redwoodHistogramsLogger(g_redwoodMetrics.RedwoodRegistry, SERVER_KNOBS->REDWOOD_HISTOGRAM_INTERVAL); + state Future loggingFuture = redwoodHistogramsLogger(SERVER_KNOBS->REDWOOD_HISTOGRAM_INTERVAL); loop { wait(delay(SERVER_KNOBS->REDWOOD_METRICS_INTERVAL)); diff --git a/flow/Histogram.cpp b/flow/Histogram.cpp index 68f3d78c4f..fa49b9a1e3 100644 --- a/flow/Histogram.cpp +++ b/flow/Histogram.cpp @@ -119,7 +119,8 @@ void Histogram::writeToLog(double elapsed) { TraceEvent e(SevInfo, "Histogram"); e.detail("Group", group).detail("Op", op).detail("Unit", UnitToStringMapper[(size_t)unit]); - e.detail("Elapsed", elapsed); + if (elapsed > 0) + e.detail("Elapsed", elapsed); int totalCount = 0; for (uint32_t i = 0; i < 32; i++) { uint64_t value = uint64_t(1) << (i + 1); diff --git a/flow/Histogram.h b/flow/Histogram.h index cb4a8fba2b..5135dccc18 100644 --- a/flow/Histogram.h +++ b/flow/Histogram.h @@ -71,7 +71,6 @@ public: ASSERT(unit <= Unit::MAXHISTOGRAMUNIT); ASSERT(upperBound >= lowerBound); - clear(); } From e328e2b5dfe72ec2d0c6a034657689c3e666b004 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Tue, 24 Aug 2021 18:34:44 -0700 Subject: [PATCH 22/27] format fix --- fdbclient/ServerKnobs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdbclient/ServerKnobs.cpp b/fdbclient/ServerKnobs.cpp index c2e3f7586c..3ba3f5a6e4 100644 --- a/fdbclient/ServerKnobs.cpp +++ b/fdbclient/ServerKnobs.cpp @@ -748,7 +748,7 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi // Server request latency measurement init( LATENCY_SAMPLE_SIZE, 100000 ); - init( LATENCY_METRICS_LOGGING_INTERVAL, 60.0 ); + init( LATENCY_METRICS_LOGGING_INTERVAL, 60.0 ); // clang-format on From 3b26cb5f991db647687f61088fd71487ab3bec01 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Wed, 25 Aug 2021 11:40:24 -0700 Subject: [PATCH 23/27] add yield --- fdbserver/VersionedBTree.actor.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 4a87e23474..8c6fa03bd7 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1640,6 +1640,7 @@ struct RedwoodMetrics { void logHistograms(double elapsed) { // All histograms have reset their buckets to 0 after writeToLog. + wait(yield()); kvSizeWritten->writeToLog(elapsed); kvSizeReadByGet->writeToLog(elapsed); kvSizeReadByGetRange->writeToLog(elapsed); @@ -1654,6 +1655,7 @@ struct RedwoodMetrics { level.modifyItemCountSketch->writeToLog(elapsed); } ++levelCounter; + wait(yield()); } } From ba63d3b7d7764d45d0f7015d1993382a81848dad Mon Sep 17 00:00:00 2001 From: Steve Atherton Date: Wed, 25 Aug 2021 15:59:56 -0700 Subject: [PATCH 24/27] Fix typo --- fdbserver/VersionedBTree.actor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 8c6fa03bd7..d3a6c4aac8 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1556,7 +1556,7 @@ struct RedwoodMetrics { }; RedwoodMetrics() { - // All histograms have reset their buckets to 0 in the contructor. + // All histograms have reset their buckets to 0 in the constructor. kvSizeWritten = Reference( new Histogram(Reference(), "kvSize", "Written", Histogram::Unit::bytes)); kvSizeReadByGet = Reference( From 02c729d16b5cdcb6a7397f5767e533f97edbe3eb Mon Sep 17 00:00:00 2001 From: Steve Atherton Date: Wed, 25 Aug 2021 16:03:00 -0700 Subject: [PATCH 25/27] Remove unused variable. --- fdbserver/VersionedBTree.actor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index d3a6c4aac8..af3a13166b 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1607,7 +1607,6 @@ struct RedwoodMetrics { Level levels[btreeLevels + 1]; metrics metric; - Reference RedwoodRegistry; Reference kvSizeWritten; Reference kvSizeReadByGet; Reference kvSizeReadByGetRange; From 7a043e72fb304af51b087bb9a2345a4ed73ff0f0 Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Thu, 26 Aug 2021 09:27:00 -0700 Subject: [PATCH 26/27] timing the log time for 33 histograms and change a void function to ACTOR --- fdbserver/VersionedBTree.actor.cpp | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 8c6fa03bd7..f240a01870 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1638,7 +1638,7 @@ struct RedwoodMetrics { } } - void logHistograms(double elapsed) { + ACTOR Future logHistograms(double elapsed) { // All histograms have reset their buckets to 0 after writeToLog. wait(yield()); kvSizeWritten->writeToLog(elapsed); @@ -1791,7 +1791,7 @@ ACTOR Future redwoodHistogramsLogger(double interval) { currTime = now(); wait(delay(interval)); double elapsed = now() - currTime; - g_redwoodMetrics.logHistograms(elapsed); + wait(g_redwoodMetrics.logHistograms(elapsed)); } } @@ -10114,6 +10114,30 @@ TEST_CASE(":/redwood/performance/histogramThroughput") { uniform.push_back(distribution(generator)); } std::cout << "size of input: " << uniform.size() << std::endl; + { + // Time needed to log 33 histograms. + std::vector> histograms; + for(int i = 0; i<33; i++){ + std::string levelString = "L" + std::to_string(i); + histograms.push_back( + Histogram::getHistogram( + LiteralStringRef("histogramTest"), LiteralStringRef("levelString"), Histogram::Unit::bytes) + ); + } + for(int i = 0; i<33; i++){ + for(int j = 0; j<32; j++){ + histograms[i]->sample(std::pow(2, j)); + } + } + auto t_start = std::chrono::high_resolution_clock::now(); + for(int i = 0; i<33; i++){ + histograms[i]->writeToLog(30.0); + } + auto t_end = std::chrono::high_resolution_clock::now(); + double elapsed_time_ms = std::chrono::duration(t_end - t_start).count(); + std::cout << "Time needed to log 33 histograms (millisecond): " << elapsed_time_ms << std::endl; + + } { std::cout << "Histogram Unit bytes" << std::endl; auto t_start = std::chrono::high_resolution_clock::now(); From 67600d436e1529b0703a5b6e92b8400415cd1e3d Mon Sep 17 00:00:00 2001 From: Fuheng Zhao Date: Thu, 26 Aug 2021 09:51:07 -0700 Subject: [PATCH 27/27] avoid yield --- fdbserver/VersionedBTree.actor.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index 7624b11f87..176dc737f6 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -1637,9 +1637,8 @@ struct RedwoodMetrics { } } - ACTOR Future logHistograms(double elapsed) { + void logHistograms(double elapsed) { // All histograms have reset their buckets to 0 after writeToLog. - wait(yield()); kvSizeWritten->writeToLog(elapsed); kvSizeReadByGet->writeToLog(elapsed); kvSizeReadByGetRange->writeToLog(elapsed); @@ -1654,7 +1653,6 @@ struct RedwoodMetrics { level.modifyItemCountSketch->writeToLog(elapsed); } ++levelCounter; - wait(yield()); } } @@ -1790,7 +1788,7 @@ ACTOR Future redwoodHistogramsLogger(double interval) { currTime = now(); wait(delay(interval)); double elapsed = now() - currTime; - wait(g_redwoodMetrics.logHistograms(elapsed)); + g_redwoodMetrics.logHistograms(elapsed); } }