From ecae078d5e66ce91546ce6ef35a23120534e717f Mon Sep 17 00:00:00 2001 From: Garand Tyson Date: Tue, 29 Nov 2022 14:03:03 -0800 Subject: [PATCH] Better bloom filter metrics --- docs/metrics.md | 1 + src/bucket/BucketIndex.cpp | 34 ++++++++++++++++++++++++++++---- src/bucket/BucketIndex.h | 1 + src/bucket/BucketManager.h | 1 + src/bucket/BucketManagerImpl.cpp | 8 ++++++++ src/bucket/BucketManagerImpl.h | 2 ++ 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/docs/metrics.md b/docs/metrics.md index a1f1cc26c1..ba91ab5c38 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -31,6 +31,7 @@ bucket.batch.objectsadded | meter | number of objects added p bucket.memory.shared | counter | number of buckets referenced (excluding publish queue) bucket.merge-time.level- | timer | time to merge two buckets on level bucket.snap.merge | timer | time to merge two buckets +bucketlistDB.bloom.lookups | meter | number of bloom filter lookups bucketlistDB.bloom.misses | meter | number of bloom filter false positives bucketlistDB.query.loads | meter | number of BucketListDB load queries bucketlistDB.bulk.inflationWinners | timer | time to load inflation winners diff --git a/src/bucket/BucketIndex.cpp b/src/bucket/BucketIndex.cpp index 658e7ec901..78053a84c7 100644 --- a/src/bucket/BucketIndex.cpp +++ b/src/bucket/BucketIndex.cpp @@ -45,7 +45,8 @@ template class BucketIndexImpl : public BucketIndex IndexT mKeysToOffset{}; std::streamoff const mPageSize{}; std::unique_ptr mFilter{}; - medida::Meter& mBloomMisses; + medida::Meter& mBloomMissMeter; + medida::Meter& mBloomLookupMeter; BucketIndexImpl(BucketManager const& bm, std::filesystem::path const& filename, @@ -84,13 +85,16 @@ template class BucketIndexImpl : public BucketIndex } virtual void markBloomMiss() const override; + virtual void markBloomLookup() const override; }; template BucketIndexImpl::BucketIndexImpl(BucketManager const& bm, std::filesystem::path const& filename, std::streamoff pageSize) - : mPageSize(pageSize), mBloomMisses(bm.getBloomMissMeter()) + : mPageSize(pageSize) + , mBloomMissMeter(bm.getBloomMissMeter()) + , mBloomLookupMeter(bm.getBloomLookupMeter()) { ZoneScoped; releaseAssert(!filename.empty()); @@ -114,6 +118,14 @@ BucketIndexImpl::BucketIndexImpl(BucketManager const& bm, params.compute_optimal_parameters(); mFilter = std::make_unique(params); estimatedIndexEntries = fileSize / mPageSize; + CLOG_DEBUG( + Bucket, + "Bloom filter initialized with params: projected element count " + "{} false positive probability: {}, number of hashes: {}, " + "table size: {}", + params.projected_element_count, params.false_positive_probability, + params.optimal_parameters.number_of_hashes, + params.optimal_parameters.table_size); } else { @@ -174,7 +186,7 @@ BucketIndexImpl::BucketIndexImpl(BucketManager const& bm, CLOG_DEBUG(Bucket, "Indexed {} positions in {}", mKeysToOffset.size(), filename.filename()); - if (estimatedNumElems < count) + if (std::is_same::value && estimatedNumElems < count) { CLOG_WARNING(Bucket, "Underestimated bloom filter size. Estimated entry " @@ -313,6 +325,7 @@ BucketIndexImpl::scan(Iterator start, LedgerKey const& k) const // If the key is not in the bloom filter or in the lower bounded index // entry, return nullopt + markBloomLookup(); if ((mFilter && !mFilter->contains(std::hash()(k))) || keyIter == mKeysToOffset.end() || keyNotInIndexEntry(k, keyIter->first)) { @@ -372,6 +385,19 @@ template <> void BucketIndexImpl::markBloomMiss() const { - mBloomMisses.Mark(); + mBloomMissMeter.Mark(); +} + +template +void +BucketIndexImpl::markBloomLookup() const +{ +} + +template <> +void +BucketIndexImpl::markBloomLookup() const +{ + mBloomLookupMeter.Mark(); } } \ No newline at end of file diff --git a/src/bucket/BucketIndex.h b/src/bucket/BucketIndex.h index 84d52df06d..72690d19fc 100644 --- a/src/bucket/BucketIndex.h +++ b/src/bucket/BucketIndex.h @@ -94,5 +94,6 @@ class BucketIndex : public NonMovableOrCopyable virtual Iterator end() const = 0; virtual void markBloomMiss() const = 0; + virtual void markBloomLookup() const = 0; }; } \ No newline at end of file diff --git a/src/bucket/BucketManager.h b/src/bucket/BucketManager.h index fb48682aa4..131cb1ce85 100644 --- a/src/bucket/BucketManager.h +++ b/src/bucket/BucketManager.h @@ -219,6 +219,7 @@ class BucketManager : NonMovableOrCopyable loadInflationWinners(size_t maxWinners, int64_t minBalance) const = 0; virtual medida::Meter& getBloomMissMeter() const = 0; + virtual medida::Meter& getBloomLookupMeter() const = 0; #ifdef BUILD_TESTS // Install a fake/assumed ledger version and bucket list hash to use in next diff --git a/src/bucket/BucketManagerImpl.cpp b/src/bucket/BucketManagerImpl.cpp index 01265fcaed..7bb0e55fc5 100644 --- a/src/bucket/BucketManagerImpl.cpp +++ b/src/bucket/BucketManagerImpl.cpp @@ -120,6 +120,8 @@ BucketManagerImpl::BucketManagerImpl(Application& app) {"bucketlistDB", "query", "loads"}, "query")) , mBucketListDBBloomMisses(app.getMetrics().NewMeter( {"bucketlistDB", "bloom", "misses"}, "bloom")) + , mBucketListDBBloomLookups(app.getMetrics().NewMeter( + {"bucketlistDB", "bloom", "lookups"}, "bloom")) // Minimal DB is stored in the buckets dir, so delete it only when // mode does not use minimal DB , mDeleteEntireBucketDirInDtor( @@ -941,6 +943,12 @@ BucketManagerImpl::getBloomMissMeter() const return mBucketListDBBloomMisses; } +medida::Meter& +BucketManagerImpl::getBloomLookupMeter() const +{ + return mBucketListDBBloomLookups; +} + void BucketManagerImpl::calculateSkipValues(LedgerHeader& currentHeader) { diff --git a/src/bucket/BucketManagerImpl.h b/src/bucket/BucketManagerImpl.h index 3d033add89..5ba971eb2e 100644 --- a/src/bucket/BucketManagerImpl.h +++ b/src/bucket/BucketManagerImpl.h @@ -48,6 +48,7 @@ class BucketManagerImpl : public BucketManager medida::Counter& mSharedBucketsSize; medida::Meter& mBucketListDBQueryMeter; medida::Meter& mBucketListDBBloomMisses; + medida::Meter& mBucketListDBBloomLookups; mutable UnorderedMap mBucketListDBPointTimers{}; mutable UnorderedMap mBucketListDBBulkTimers{}; @@ -139,6 +140,7 @@ class BucketManagerImpl : public BucketManager std::vector loadInflationWinners(size_t maxWinners, int64_t minBalance) const override; medida::Meter& getBloomMissMeter() const override; + medida::Meter& getBloomLookupMeter() const override; #ifdef BUILD_TESTS // Install a fake/assumed ledger version and bucket list hash to use in next