From d43b4cd570dccf234d2a43f6acec2d5160971cc3 Mon Sep 17 00:00:00 2001 From: haoyuhuang Date: Mon, 17 Jun 2019 11:03:47 -0700 Subject: [PATCH] Integrate block cache tracing into db_bench (#5459) Summary: This PR integrates the block cache tracing into db_bench. It adds three command line arguments. -block_cache_trace_file (Block cache trace file path.) type: string default: "" -block_cache_trace_max_trace_file_size_in_bytes (The maximum block cache trace file size in bytes. Block cache accesses will not be logged if the trace file size exceeds this threshold. Default is 64 GB.) type: int64 default: 68719476736 -block_cache_trace_sampling_frequency (Block cache trace sampling frequency, termed s. It uses spatial downsampling and samples accesses to one out of s blocks.) type: int32 default: 1 Pull Request resolved: https://github.com/facebook/rocksdb/pull/5459 Differential Revision: D15832031 Pulled By: HaoyuHuang fbshipit-source-id: 0ecf2f2686557251fe741a2769b21170777efa3d --- tools/db_bench_tool.cc | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/tools/db_bench_tool.cc b/tools/db_bench_tool.cc index b254978c5..a14758418 100644 --- a/tools/db_bench_tool.cc +++ b/tools/db_bench_tool.cc @@ -774,6 +774,17 @@ DEFINE_string(trace_file, "", "Trace workload to a file. "); DEFINE_int32(trace_replay_fast_forward, 1, "Fast forward trace replay, must >= 1. "); +DEFINE_int32(block_cache_trace_sampling_frequency, 1, + "Block cache trace sampling frequency, termed s. It uses spatial " + "downsampling and samples accesses to one out of s blocks."); +DEFINE_int64( + block_cache_trace_max_trace_file_size_in_bytes, + uint64_t{64} * 1024 * 1024 * 1024, + "The maximum block cache trace file size in bytes. Block cache accesses " + "will not be logged if the trace file size exceeds this threshold. Default " + "is 64 GB."); +DEFINE_string(block_cache_trace_file, "", "Block cache trace file path."); + static enum rocksdb::CompressionType StringToCompressionType(const char* ctype) { assert(ctype); @@ -2081,6 +2092,7 @@ class Benchmark { Options open_options_; // keep options around to properly destroy db later #ifndef ROCKSDB_LITE TraceOptions trace_options_; + TraceOptions block_cache_trace_options_; #endif int64_t reads_; int64_t deletes_; @@ -2917,6 +2929,47 @@ class Benchmark { fprintf(stdout, "Tracing the workload to: [%s]\n", FLAGS_trace_file.c_str()); } + // Start block cache tracing. + if (!FLAGS_block_cache_trace_file.empty()) { + // Sanity checks. + if (FLAGS_block_cache_trace_sampling_frequency <= 0) { + fprintf(stderr, + "Block cache trace sampling frequency must be higher than " + "0.\n"); + exit(1); + } + if (FLAGS_block_cache_trace_max_trace_file_size_in_bytes <= 0) { + fprintf(stderr, + "The maximum file size for block cache tracing must be " + "higher than 0.\n"); + exit(1); + } + block_cache_trace_options_.max_trace_file_size = + FLAGS_block_cache_trace_max_trace_file_size_in_bytes; + block_cache_trace_options_.sampling_frequency = + FLAGS_block_cache_trace_sampling_frequency; + std::unique_ptr block_cache_trace_writer; + Status s = NewFileTraceWriter(FLAGS_env, EnvOptions(), + FLAGS_block_cache_trace_file, + &block_cache_trace_writer); + if (!s.ok()) { + fprintf(stderr, + "Encountered an error when creating trace writer, %s\n", + s.ToString().c_str()); + exit(1); + } + s = db_.db->StartBlockCacheTrace(block_cache_trace_options_, + std::move(block_cache_trace_writer)); + if (!s.ok()) { + fprintf( + stderr, + "Encountered an error when starting block cache tracing, %s\n", + s.ToString().c_str()); + exit(1); + } + fprintf(stdout, "Tracing block cache accesses to: [%s]\n", + FLAGS_block_cache_trace_file.c_str()); + } #endif // ROCKSDB_LITE if (num_warmup > 0) { @@ -2959,6 +3012,14 @@ class Benchmark { s.ToString().c_str()); } } + if (!FLAGS_block_cache_trace_file.empty()) { + Status s = db_.db->EndBlockCacheTrace(); + if (!s.ok()) { + fprintf(stderr, + "Encountered an error ending the block cache tracing, %s\n", + s.ToString().c_str()); + } + } #endif // ROCKSDB_LITE if (FLAGS_statistics) {