From f35042ca40f84b9e33cc6876738392c6eff12898 Mon Sep 17 00:00:00 2001 From: anand76 Date: Fri, 20 Aug 2021 15:16:33 -0700 Subject: [PATCH] Add a PerfContext counter for secondary cache hits (#8685) Summary: Add a PerfContext counter. Pull Request resolved: https://github.com/facebook/rocksdb/pull/8685 Reviewed By: zhichao-cao Differential Revision: D30453957 Pulled By: anand1976 fbshipit-source-id: 42888a3ced240e1c44446d52d3b04adfb01f5665 --- HISTORY.md | 2 ++ cache/lru_cache.cc | 3 +++ cache/lru_cache_test.cc | 3 +++ include/rocksdb/perf_context.h | 3 +++ monitoring/perf_context.cc | 5 +++++ 5 files changed, 16 insertions(+) diff --git a/HISTORY.md b/HISTORY.md index a424099e3..b1c9ffb7d 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -9,6 +9,7 @@ * Fixed a bug affecting the batched `MultiGet` API when used with keys spanning multiple column families and `sorted_input == false`. * Fixed a potential incorrect result in opt mode and assertion failures caused by releasing snapshot(s) during compaction. * Fixed passing of BlobFileCompletionCallback to Compaction job and Atomic flush job which was default paramter (nullptr). BlobFileCompletitionCallback is internal callback that manages addition of blob files to SSTFileManager. +* Fixed MultiGet not updating the block_read_count and block_read_byte PerfContext counters ### New Features * Made the EventListener extend the Customizable class. @@ -20,6 +21,7 @@ * Fast forward option in Trace replay changed to double type to allow replaying at a lower speed, by settings the value between 0 and 1. This option can be set via `ReplayOptions` in `Replayer::Replay()`, or via `--trace_replay_fast_forward` in db_bench. * Add property `LiveSstFilesSizeAtTemperature` to retrieve sst file size at different temperature. * Added a stat rocksdb.secondary.cache.hits +* Added a PerfContext counter secondary_cache_hit_count * The integrated BlobDB implementation now supports the tickers `BLOB_DB_BLOB_FILE_BYTES_READ`, `BLOB_DB_GC_NUM_KEYS_RELOCATED`, and `BLOB_DB_GC_BYTES_RELOCATED`, as well as the histograms `BLOB_DB_COMPRESSION_MICROS` and `BLOB_DB_DECOMPRESSION_MICROS`. ## Public API change diff --git a/cache/lru_cache.cc b/cache/lru_cache.cc index 710a155c4..689242ca9 100644 --- a/cache/lru_cache.cc +++ b/cache/lru_cache.cc @@ -13,6 +13,7 @@ #include #include +#include "monitoring/perf_context_imp.h" #include "monitoring/statistics.h" #include "util/mutexlock.h" @@ -473,6 +474,7 @@ Cache::Handle* LRUCacheShard::Lookup( e->Free(); e = nullptr; } else { + PERF_COUNTER_ADD(secondary_cache_hit_count, 1); RecordTick(stats, SECONDARY_CACHE_HITS); } } else { @@ -481,6 +483,7 @@ Cache::Handle* LRUCacheShard::Lookup( e->SetIncomplete(true); // This may be slightly inaccurate, if the lookup eventually fails. // But the probability is very low. + PERF_COUNTER_ADD(secondary_cache_hit_count, 1); RecordTick(stats, SECONDARY_CACHE_HITS); } } diff --git a/cache/lru_cache_test.cc b/cache/lru_cache_test.cc index 74409421c..e840273bd 100644 --- a/cache/lru_cache_test.cc +++ b/cache/lru_cache_test.cc @@ -481,6 +481,7 @@ TEST_F(LRUSecondaryCacheTest, BasicTest) { ASSERT_OK(cache->Insert("k2", item2, &LRUSecondaryCacheTest::helper_, str2.length())); + get_perf_context()->Reset(); Cache::Handle* handle; handle = cache->Lookup("k2", &LRUSecondaryCacheTest::helper_, test_item_creator, @@ -497,6 +498,8 @@ TEST_F(LRUSecondaryCacheTest, BasicTest) { ASSERT_EQ(secondary_cache->num_lookups(), 1u); ASSERT_EQ(stats->getTickerCount(SECONDARY_CACHE_HITS), secondary_cache->num_lookups()); + PerfContext perf_ctx = *get_perf_context(); + ASSERT_EQ(perf_ctx.secondary_cache_hit_count, secondary_cache->num_lookups()); cache.reset(); secondary_cache.reset(); diff --git a/include/rocksdb/perf_context.h b/include/rocksdb/perf_context.h index 699f57344..f3058416e 100644 --- a/include/rocksdb/perf_context.h +++ b/include/rocksdb/perf_context.h @@ -74,6 +74,9 @@ struct PerfContext { uint64_t filter_block_read_count; // total number of filter block reads uint64_t compression_dict_block_read_count; // total number of compression // dictionary block reads + + uint64_t secondary_cache_hit_count; // total number of secondary cache hits + uint64_t block_checksum_time; // total nanos spent on block checksum uint64_t block_decompress_time; // total nanos spent on block decompression diff --git a/monitoring/perf_context.cc b/monitoring/perf_context.cc index d45d84fb6..9e56f1018 100644 --- a/monitoring/perf_context.cc +++ b/monitoring/perf_context.cc @@ -47,6 +47,7 @@ PerfContext::PerfContext(const PerfContext& other) { block_cache_filter_hit_count = other.block_cache_filter_hit_count; filter_block_read_count = other.filter_block_read_count; compression_dict_block_read_count = other.compression_dict_block_read_count; + secondary_cache_hit_count = other.secondary_cache_hit_count; block_checksum_time = other.block_checksum_time; block_decompress_time = other.block_decompress_time; get_read_bytes = other.get_read_bytes; @@ -144,6 +145,7 @@ PerfContext::PerfContext(PerfContext&& other) noexcept { block_cache_filter_hit_count = other.block_cache_filter_hit_count; filter_block_read_count = other.filter_block_read_count; compression_dict_block_read_count = other.compression_dict_block_read_count; + secondary_cache_hit_count = other.secondary_cache_hit_count; block_checksum_time = other.block_checksum_time; block_decompress_time = other.block_decompress_time; get_read_bytes = other.get_read_bytes; @@ -243,6 +245,7 @@ PerfContext& PerfContext::operator=(const PerfContext& other) { block_cache_filter_hit_count = other.block_cache_filter_hit_count; filter_block_read_count = other.filter_block_read_count; compression_dict_block_read_count = other.compression_dict_block_read_count; + secondary_cache_hit_count = other.secondary_cache_hit_count; block_checksum_time = other.block_checksum_time; block_decompress_time = other.block_decompress_time; get_read_bytes = other.get_read_bytes; @@ -339,6 +342,7 @@ void PerfContext::Reset() { block_cache_filter_hit_count = 0; filter_block_read_count = 0; compression_dict_block_read_count = 0; + secondary_cache_hit_count = 0; block_checksum_time = 0; block_decompress_time = 0; get_read_bytes = 0; @@ -459,6 +463,7 @@ std::string PerfContext::ToString(bool exclude_zero_counters) const { PERF_CONTEXT_OUTPUT(block_cache_filter_hit_count); PERF_CONTEXT_OUTPUT(filter_block_read_count); PERF_CONTEXT_OUTPUT(compression_dict_block_read_count); + PERF_CONTEXT_OUTPUT(secondary_cache_hit_count); PERF_CONTEXT_OUTPUT(block_checksum_time); PERF_CONTEXT_OUTPUT(block_decompress_time); PERF_CONTEXT_OUTPUT(get_read_bytes);