From 9216d1cf7344d5b84a105bca31eb3d58985f5b7f Mon Sep 17 00:00:00 2001 From: lemonhx Date: Mon, 15 Mar 2021 15:30:27 +0800 Subject: [PATCH 1/9] implement perf level by bit field and redirect perf_level and its methods to perf_bit_field, also adding three default value for compatibility. --- CMakeLists.txt | 1 + include/rocksdb/perf_level_by_bitfield.h | 104 ++++++++ monitoring/perf_context_imp.h | 82 +++--- monitoring/perf_level.cc | 35 ++- monitoring/perf_level_by_bitfield.cc | 305 +++++++++++++++++++++++ monitoring/perf_level_by_bitfield_imp.h | 18 ++ monitoring/perf_step_timer.h | 11 +- 7 files changed, 504 insertions(+), 52 deletions(-) create mode 100644 include/rocksdb/perf_level_by_bitfield.h create mode 100644 monitoring/perf_level_by_bitfield.cc create mode 100644 monitoring/perf_level_by_bitfield_imp.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 441173a29a1..c38b26c1328 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -584,6 +584,7 @@ set(SOURCES monitoring/instrumented_mutex.cc monitoring/iostats_context.cc monitoring/perf_context.cc + monitoring/perf_level_by_bitfield.cc monitoring/perf_level.cc monitoring/persistent_stats_history.cc monitoring/statistics.cc diff --git a/include/rocksdb/perf_level_by_bitfield.h b/include/rocksdb/perf_level_by_bitfield.h new file mode 100644 index 00000000000..fdc0e0450bb --- /dev/null +++ b/include/rocksdb/perf_level_by_bitfield.h @@ -0,0 +1,104 @@ +#pragma once +#include + +namespace rocksdb { + +struct PerfLevelByBitField { + uint8_t perf_level; + + uint8_t enable_user_key_comparison_count_bit : 1; // 2 + uint8_t enable_block_cache_hit_count_bit : 1; // 2 + uint8_t enable_block_read_count_bit : 1; // 2 + uint8_t enable_block_read_byte_bit : 1; // 2 + uint8_t enable_block_cache_index_hit_count_bit : 1; // 2 + uint8_t enable_index_block_read_count_bit : 1; // 2 + uint8_t enable_block_cache_filter_hit_count_bit : 1; // 2 + uint8_t enable_filter_block_read_count_bit : 1; // 2 + uint8_t enable_compression_dict_block_read_count_bit : 1; // 2 + uint8_t enable_get_read_bytes_bit : 1; // 2 + uint8_t enable_multiget_read_bytes_bit : 1; // 2 + uint8_t enable_iter_read_bytes_bit : 1; // 2 + uint8_t enable_internal_key_skipped_count_bit : 1; // 2 + uint8_t enable_internal_delete_skipped_count_bit : 1; // 2 + uint8_t enable_internal_recent_skipped_count_bit : 1; // 2 + uint8_t enable_internal_merge_count_bit : 1; // 2 + uint8_t enable_get_from_memtable_count_bit : 1; // 2 + uint8_t enable_seek_on_memtable_count_bit : 1; // 2 + uint8_t enable_next_on_memtable_count_bit : 1; // 2 + uint8_t enable_prev_on_memtable_count_bit : 1; // 2 + uint8_t enable_seek_child_seek_count_bit : 1; // 2 + uint8_t enable_bloom_memtable_hit_count_bit : 1; // 2 + uint8_t enable_bloom_memtable_miss_count_bit : 1; // 2 + uint8_t enable_bloom_sst_hit_count_bit : 1; // 2 + uint8_t enable_bloom_sst_miss_count_bit : 1; // 2 + uint8_t enable_key_lock_wait_count_bit : 1; // 2 + + // 这个仅仅是一个简单的flag + uint8_t enable_measure_cpu_time_bit : 1; // 3 -> with CPU time flag + + uint8_t enable_block_read_time_bit : 1; // 3 + uint8_t enable_block_checksum_time_bit : 1; // 3 + uint8_t enable_block_decompress_time_bit : 1; // 3 + uint8_t enable_get_snapshot_time_bit : 1; // 3 + uint8_t enable_get_from_memtable_time_bit : 1; // 3 + uint8_t enable_get_post_process_time_bit : 1; // 3 + uint8_t enable_get_from_output_files_time_bit : 1; // 3 + uint8_t enable_seek_on_memtable_time_bit : 1; // 3 + uint8_t enable_seek_child_seek_time_bit : 1; // 3 + uint8_t enable_seek_min_heap_time_bit : 1; // 3 + uint8_t enable_seek_max_heap_time_bit : 1; // 3 + uint8_t enable_seek_internal_seek_time_bit : 1; // 3 + uint8_t enable_find_next_user_entry_time_bit : 1; // 3 + uint8_t enable_write_wal_time_bit : 1; // 3 + uint8_t enable_write_memtable_time_bit : 1; // 3 + uint8_t enable_write_delay_time_bit : 1; // 3 + uint8_t enable_write_scheduling_flushes_compactions_time_bit : 1; // 3 + uint8_t enable_write_pre_and_post_process_time_bit : 1; // 3 + uint8_t enable_write_thread_wait_nanos_bit : 1; // 3 + uint8_t enable_merge_operator_time_nanos_bit : 1; // 3 + uint8_t enable_read_index_block_nanos_bit : 1; // 3 + uint8_t enable_read_filter_block_nanos_bit : 1; // 3 + uint8_t enable_new_table_block_iter_nanos_bit : 1; // 3 + uint8_t enable_new_table_iterator_nanos_bit : 1; // 3 + uint8_t enable_block_seek_nanos_bit : 1; // 3 + uint8_t enable_find_table_nanos_bit : 1; // 3 + uint8_t enable_key_lock_wait_time_bit : 1; // 3 + uint8_t enable_env_new_sequential_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_random_access_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_writable_file_nanos_bit : 1; // 3 + uint8_t enable_env_reuse_writable_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_random_rw_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_directory_nanos_bit : 1; // 3 + uint8_t enable_env_file_exists_nanos_bit : 1; // 3 + uint8_t enable_env_get_children_nanos_bit : 1; // 3 + uint8_t enable_env_get_children_file_attributes_nanos_bit : 1; // 3 + uint8_t enable_env_delete_file_nanos_bit : 1; // 3 + uint8_t enable_env_create_dir_nanos_bit : 1; // 3 + uint8_t enable_env_create_dir_if_missing_nanos_bit : 1; // 3 + uint8_t enable_env_delete_dir_nanos_bit : 1; // 3 + uint8_t enable_env_get_file_size_nanos_bit : 1; // 3 + uint8_t enable_env_get_file_modification_time_nanos_bit : 1; // 3 + uint8_t enable_env_rename_file_nanos_bit : 1; // 3 + uint8_t enable_env_link_file_nanos_bit : 1; // 3 + uint8_t enable_env_lock_file_nanos_bit : 1; // 3 + uint8_t enable_env_unlock_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_logger_nanos_bit : 1; // 3 + uint8_t enable_encrypt_data_nanos_bit : 1; // 3 + uint8_t enable_decrypt_data_nanos_bit : 1; // 3 + + // TODO: 只有开了 4 才能用 + uint8_t enable_get_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_next_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_prev_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_seek_cpu_nanos_bit : 1; // 4 + + uint8_t enable_db_mutex_lock_nanos_bit : 1; // 5 + uint8_t enable_db_condition_wait_nanos_bit : 1; // 5 +}; + +// set the perf stats bitfield for current thread +void SetPerfBitField(PerfLevelByBitField pbf); + +// get current perf stats bitfield for current thread +PerfLevelByBitField* GetPerfBitField(); +} // namespace rocksdb \ No newline at end of file diff --git a/monitoring/perf_context_imp.h b/monitoring/perf_context_imp.h index e0ff8afc58e..0c253157f3e 100644 --- a/monitoring/perf_context_imp.h +++ b/monitoring/perf_context_imp.h @@ -4,6 +4,7 @@ // (found in the LICENSE.Apache file in the root directory). // #pragma once +#include "monitoring/perf_level_by_bitfield_imp.h" #include "monitoring/perf_step_timer.h" #include "rocksdb/perf_context.h" #include "util/stop_watch.h" @@ -22,12 +23,16 @@ extern thread_local PerfContext perf_context; #if defined(NPERF_CONTEXT) -#define PERF_TIMER_GUARD(metric) -#define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition) -#define PERF_TIMER_MEASURE(metric) #define PERF_TIMER_STOP(metric) #define PERF_TIMER_START(metric) +#define PERF_TIMER_GUARD(metric) +#define PERF_TIMER_GUARD_WITH_ENV(metric, env) +#define PERF_CPU_TIMER_GUARD(metric, env) +#define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition, stats, \ + ticker_type) +#define PERF_TIMER_MEASURE(metric) #define PERF_COUNTER_ADD(metric, value) +#define PERF_COUNTER_BY_LEVEL_ADD(metric, value, level) #else @@ -37,29 +42,35 @@ extern thread_local PerfContext perf_context; #define PERF_TIMER_START(metric) perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_TIMER_GUARD(metric) \ - PerfStepTimer perf_step_timer_##metric(&(perf_context.metric)); \ +#define PERF_TIMER_GUARD(metric) \ + PerfStepTimer perf_step_timer_##metric( \ + &(perf_context.metric), nullptr, \ + (bool)perf_bit_field.enable_measure_cpu_time_bit, \ + (bool)perf_bit_field.enable_##metric##_bit); \ perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_TIMER_GUARD_WITH_ENV(metric, env) \ - PerfStepTimer perf_step_timer_##metric(&(perf_context.metric), env); \ +#define PERF_TIMER_GUARD_WITH_ENV(metric, env) \ + PerfStepTimer perf_step_timer_##metric( \ + &(perf_context.metric), env, \ + (bool)perf_bit_field.enable_measure_cpu_time_bit, \ + (bool)perf_bit_field.enable_##metric##_bit); \ perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_CPU_TIMER_GUARD(metric, env) \ - PerfStepTimer perf_step_timer_##metric( \ - &(perf_context.metric), env, true, \ - PerfLevel::kEnableTimeAndCPUTimeExceptForMutex); \ +#define PERF_CPU_TIMER_GUARD(metric, env) \ + PerfStepTimer perf_step_timer_##metric( \ + &(perf_context.metric), env, true, \ + (bool)perf_bit_field.enable_##metric##_bit); \ perf_step_timer_##metric.Start(); -#define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition, stats, \ - ticker_type) \ - PerfStepTimer perf_step_timer_##metric(&(perf_context.metric), nullptr, \ - false, PerfLevel::kEnableTime, stats, \ - ticker_type); \ - if (condition) { \ - perf_step_timer_##metric.Start(); \ +#define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition, stats, \ + ticker_type) \ + PerfStepTimer perf_step_timer_##metric( \ + &(perf_context.metric), nullptr, false, \ + (bool)perf_bit_field.enable_##metric##_bit, stats, ticker_type); \ + if (condition) { \ + perf_step_timer_##metric.Start(); \ } // Update metric with time elapsed since last START. start time is reset @@ -67,27 +78,26 @@ extern thread_local PerfContext perf_context; #define PERF_TIMER_MEASURE(metric) perf_step_timer_##metric.Measure(); // Increase metric value -#define PERF_COUNTER_ADD(metric, value) \ - if (perf_level >= PerfLevel::kEnableCount) { \ - perf_context.metric += value; \ +#define PERF_COUNTER_ADD(metric, value) \ + if (perf_bit_field.enable_##metric##_bit) { \ + perf_context.metric += value; \ } // Increase metric value -#define PERF_COUNTER_BY_LEVEL_ADD(metric, value, level) \ - if (perf_level >= PerfLevel::kEnableCount && \ - perf_context.per_level_perf_context_enabled && \ - perf_context.level_to_perf_context) { \ - if ((*(perf_context.level_to_perf_context)).find(level) != \ - (*(perf_context.level_to_perf_context)).end()) { \ - (*(perf_context.level_to_perf_context))[level].metric += value; \ - } \ - else { \ - PerfContextByLevel empty_context; \ - (*(perf_context.level_to_perf_context))[level] = empty_context; \ - (*(perf_context.level_to_perf_context))[level].metric += value; \ - } \ - } \ +// TODO: 添加一个flag count +#define PERF_COUNTER_BY_LEVEL_ADD(metric, value, level) \ + if (perf_context.per_level_perf_context_enabled && \ + perf_context.level_to_perf_context) { \ + if ((*(perf_context.level_to_perf_context)).find(level) != \ + (*(perf_context.level_to_perf_context)).end()) { \ + (*(perf_context.level_to_perf_context))[level].metric += value; \ + } else { \ + PerfContextByLevel empty_context; \ + (*(perf_context.level_to_perf_context))[level] = empty_context; \ + (*(perf_context.level_to_perf_context))[level].metric += value; \ + } \ + } #endif -} +} // namespace rocksdb diff --git a/monitoring/perf_level.cc b/monitoring/perf_level.cc index 79c718cce76..9fa9ed50577 100644 --- a/monitoring/perf_level.cc +++ b/monitoring/perf_level.cc @@ -4,25 +4,38 @@ // (found in the LICENSE.Apache file in the root directory). // +#include "rocksdb/perf_level.h" + #include -#include "monitoring/perf_level_imp.h" -namespace rocksdb { +#include "monitoring/perf_level_by_bitfield_imp.h" -#ifdef ROCKSDB_SUPPORT_THREAD_LOCAL -__thread PerfLevel perf_level = kEnableCount; -#else -PerfLevel perf_level = kEnableCount; -#endif +namespace rocksdb { void SetPerfLevel(PerfLevel level) { + // TODO: discuss keep assertions or not assert(level > kUninitialized); assert(level < kOutOfBounds); - perf_level = level; + switch (level) { + case kEnableCount: + perf_bit_field = BitFieldEnableCount; + break; + case kEnableTimeExceptForMutex: + perf_bit_field = BitFieldEnableTimeExceptForMutex; + break; + case kEnableTimeAndCPUTimeExceptForMutex: + perf_bit_field = BitFieldEnableTimeAndCPUTimeExceptForMutex; + break; + case kEnableTime: + perf_bit_field = BitFieldEnableTime; + break; + default: + perf_bit_field = {}; + break; + } + perf_bit_field.perf_level = level; } -PerfLevel GetPerfLevel() { - return perf_level; -} +PerfLevel GetPerfLevel() { return (PerfLevel)perf_bit_field.perf_level; } } // namespace rocksdb diff --git a/monitoring/perf_level_by_bitfield.cc b/monitoring/perf_level_by_bitfield.cc new file mode 100644 index 00000000000..45bce92bad1 --- /dev/null +++ b/monitoring/perf_level_by_bitfield.cc @@ -0,0 +1,305 @@ +#include "monitoring/perf_level_by_bitfield_imp.h" +namespace rocksdb { +const PerfLevelByBitField BitFieldEnableCount = { + .perf_level = 2, + .enable_user_key_comparison_count_bit = 1, + .enable_block_cache_hit_count_bit = 1, + .enable_block_read_count_bit = 1, + .enable_block_read_byte_bit = 1, + .enable_block_cache_index_hit_count_bit = 1, + .enable_index_block_read_count_bit = 1, + .enable_block_cache_filter_hit_count_bit = 1, + .enable_filter_block_read_count_bit = 1, + .enable_compression_dict_block_read_count_bit = 1, + .enable_get_read_bytes_bit = 1, + .enable_multiget_read_bytes_bit = 1, + .enable_iter_read_bytes_bit = 1, + .enable_internal_key_skipped_count_bit = 1, + .enable_internal_delete_skipped_count_bit = 1, + .enable_internal_recent_skipped_count_bit = 1, + .enable_internal_merge_count_bit = 1, + .enable_get_from_memtable_count_bit = 1, + .enable_seek_on_memtable_count_bit = 1, + .enable_next_on_memtable_count_bit = 1, + .enable_prev_on_memtable_count_bit = 1, + .enable_seek_child_seek_count_bit = 1, + .enable_bloom_memtable_hit_count_bit = 1, + .enable_bloom_memtable_miss_count_bit = 1, + .enable_bloom_sst_hit_count_bit = 1, + .enable_bloom_sst_miss_count_bit = 1, + .enable_key_lock_wait_count_bit = 1, +}; + +const PerfLevelByBitField BitFieldEnableTimeExceptForMutex = { + .perf_level = 3, + .enable_user_key_comparison_count_bit = 1, + .enable_block_cache_hit_count_bit = 1, + .enable_block_read_count_bit = 1, + .enable_block_read_byte_bit = 1, + .enable_block_cache_index_hit_count_bit = 1, + .enable_index_block_read_count_bit = 1, + .enable_block_cache_filter_hit_count_bit = 1, + .enable_filter_block_read_count_bit = 1, + .enable_compression_dict_block_read_count_bit = 1, + .enable_get_read_bytes_bit = 1, + .enable_multiget_read_bytes_bit = 1, + .enable_iter_read_bytes_bit = 1, + .enable_internal_key_skipped_count_bit = 1, + .enable_internal_delete_skipped_count_bit = 1, + .enable_internal_recent_skipped_count_bit = 1, + .enable_internal_merge_count_bit = 1, + .enable_get_from_memtable_count_bit = 1, + .enable_seek_on_memtable_count_bit = 1, + .enable_next_on_memtable_count_bit = 1, + .enable_prev_on_memtable_count_bit = 1, + .enable_seek_child_seek_count_bit = 1, + .enable_bloom_memtable_hit_count_bit = 1, + .enable_bloom_memtable_miss_count_bit = 1, + .enable_bloom_sst_hit_count_bit = 1, + .enable_bloom_sst_miss_count_bit = 1, + .enable_key_lock_wait_count_bit = 1, + + .enable_block_read_time_bit = 1, + .enable_block_checksum_time_bit = 1, + .enable_block_decompress_time_bit = 1, + .enable_get_snapshot_time_bit = 1, + .enable_get_from_memtable_time_bit = 1, + .enable_get_post_process_time_bit = 1, + .enable_get_from_output_files_time_bit = 1, + .enable_seek_on_memtable_time_bit = 1, + .enable_seek_child_seek_time_bit = 1, + .enable_seek_min_heap_time_bit = 1, + .enable_seek_max_heap_time_bit = 1, + .enable_seek_internal_seek_time_bit = 1, + .enable_find_next_user_entry_time_bit = 1, + .enable_write_wal_time_bit = 1, + .enable_write_memtable_time_bit = 1, + .enable_write_delay_time_bit = 1, + .enable_write_scheduling_flushes_compactions_time_bit = 1, + .enable_write_pre_and_post_process_time_bit = 1, + .enable_write_thread_wait_nanos_bit = 1, + .enable_merge_operator_time_nanos_bit = 1, + .enable_read_index_block_nanos_bit = 1, + .enable_read_filter_block_nanos_bit = 1, + .enable_new_table_block_iter_nanos_bit = 1, + .enable_new_table_iterator_nanos_bit = 1, + .enable_block_seek_nanos_bit = 1, + .enable_find_table_nanos_bit = 1, + .enable_key_lock_wait_time_bit = 1, + .enable_env_new_sequential_file_nanos_bit = 1, + .enable_env_new_random_access_file_nanos_bit = 1, + .enable_env_new_writable_file_nanos_bit = 1, + .enable_env_reuse_writable_file_nanos_bit = 1, + .enable_env_new_random_rw_file_nanos_bit = 1, + .enable_env_new_directory_nanos_bit = 1, + .enable_env_file_exists_nanos_bit = 1, + .enable_env_get_children_nanos_bit = 1, + .enable_env_get_children_file_attributes_nanos_bit = 1, + .enable_env_delete_file_nanos_bit = 1, + .enable_env_create_dir_nanos_bit = 1, + .enable_env_create_dir_if_missing_nanos_bit = 1, + .enable_env_delete_dir_nanos_bit = 1, + .enable_env_get_file_size_nanos_bit = 1, + .enable_env_get_file_modification_time_nanos_bit = 1, + .enable_env_rename_file_nanos_bit = 1, + .enable_env_link_file_nanos_bit = 1, + .enable_env_lock_file_nanos_bit = 1, + .enable_env_unlock_file_nanos_bit = 1, + .enable_env_new_logger_nanos_bit = 1, + .enable_encrypt_data_nanos_bit = 1, + .enable_decrypt_data_nanos_bit = 1, +}; +const PerfLevelByBitField BitFieldEnableTimeAndCPUTimeExceptForMutex = { + .perf_level = 4, + .enable_user_key_comparison_count_bit = 1, + .enable_block_cache_hit_count_bit = 1, + .enable_block_read_count_bit = 1, + .enable_block_read_byte_bit = 1, + .enable_block_cache_index_hit_count_bit = 1, + .enable_index_block_read_count_bit = 1, + .enable_block_cache_filter_hit_count_bit = 1, + .enable_filter_block_read_count_bit = 1, + .enable_compression_dict_block_read_count_bit = 1, + .enable_get_read_bytes_bit = 1, + .enable_multiget_read_bytes_bit = 1, + .enable_iter_read_bytes_bit = 1, + .enable_internal_key_skipped_count_bit = 1, + .enable_internal_delete_skipped_count_bit = 1, + .enable_internal_recent_skipped_count_bit = 1, + .enable_internal_merge_count_bit = 1, + .enable_get_from_memtable_count_bit = 1, + .enable_seek_on_memtable_count_bit = 1, + .enable_next_on_memtable_count_bit = 1, + .enable_prev_on_memtable_count_bit = 1, + .enable_seek_child_seek_count_bit = 1, + .enable_bloom_memtable_hit_count_bit = 1, + .enable_bloom_memtable_miss_count_bit = 1, + .enable_bloom_sst_hit_count_bit = 1, + .enable_bloom_sst_miss_count_bit = 1, + .enable_key_lock_wait_count_bit = 1, + + // 4 + .enable_measure_cpu_time_bit = 1, + + .enable_block_read_time_bit = 1, + .enable_block_checksum_time_bit = 1, + .enable_block_decompress_time_bit = 1, + .enable_get_snapshot_time_bit = 1, + .enable_get_from_memtable_time_bit = 1, + .enable_get_post_process_time_bit = 1, + .enable_get_from_output_files_time_bit = 1, + .enable_seek_on_memtable_time_bit = 1, + .enable_seek_child_seek_time_bit = 1, + .enable_seek_min_heap_time_bit = 1, + .enable_seek_max_heap_time_bit = 1, + .enable_seek_internal_seek_time_bit = 1, + .enable_find_next_user_entry_time_bit = 1, + .enable_write_wal_time_bit = 1, + .enable_write_memtable_time_bit = 1, + .enable_write_delay_time_bit = 1, + .enable_write_scheduling_flushes_compactions_time_bit = 1, + .enable_write_pre_and_post_process_time_bit = 1, + .enable_write_thread_wait_nanos_bit = 1, + .enable_merge_operator_time_nanos_bit = 1, + .enable_read_index_block_nanos_bit = 1, + .enable_read_filter_block_nanos_bit = 1, + .enable_new_table_block_iter_nanos_bit = 1, + .enable_new_table_iterator_nanos_bit = 1, + .enable_block_seek_nanos_bit = 1, + .enable_find_table_nanos_bit = 1, + .enable_key_lock_wait_time_bit = 1, + .enable_env_new_sequential_file_nanos_bit = 1, + .enable_env_new_random_access_file_nanos_bit = 1, + .enable_env_new_writable_file_nanos_bit = 1, + .enable_env_reuse_writable_file_nanos_bit = 1, + .enable_env_new_random_rw_file_nanos_bit = 1, + .enable_env_new_directory_nanos_bit = 1, + .enable_env_file_exists_nanos_bit = 1, + .enable_env_get_children_nanos_bit = 1, + .enable_env_get_children_file_attributes_nanos_bit = 1, + .enable_env_delete_file_nanos_bit = 1, + .enable_env_create_dir_nanos_bit = 1, + .enable_env_create_dir_if_missing_nanos_bit = 1, + .enable_env_delete_dir_nanos_bit = 1, + .enable_env_get_file_size_nanos_bit = 1, + .enable_env_get_file_modification_time_nanos_bit = 1, + .enable_env_rename_file_nanos_bit = 1, + .enable_env_link_file_nanos_bit = 1, + .enable_env_lock_file_nanos_bit = 1, + .enable_env_unlock_file_nanos_bit = 1, + .enable_env_new_logger_nanos_bit = 1, + .enable_encrypt_data_nanos_bit = 1, + .enable_decrypt_data_nanos_bit = 1, + + .enable_get_cpu_nanos_bit = 1, + .enable_iter_next_cpu_nanos_bit = 1, + .enable_iter_prev_cpu_nanos_bit = 1, + .enable_iter_seek_cpu_nanos_bit = 1, +}; + +const PerfLevelByBitField BitFieldEnableTime = { + .perf_level = 5, + .enable_user_key_comparison_count_bit = 1, + .enable_block_cache_hit_count_bit = 1, + .enable_block_read_count_bit = 1, + .enable_block_read_byte_bit = 1, + .enable_block_cache_index_hit_count_bit = 1, + .enable_index_block_read_count_bit = 1, + .enable_block_cache_filter_hit_count_bit = 1, + .enable_filter_block_read_count_bit = 1, + .enable_compression_dict_block_read_count_bit = 1, + .enable_get_read_bytes_bit = 1, + .enable_multiget_read_bytes_bit = 1, + .enable_iter_read_bytes_bit = 1, + .enable_internal_key_skipped_count_bit = 1, + .enable_internal_delete_skipped_count_bit = 1, + .enable_internal_recent_skipped_count_bit = 1, + .enable_internal_merge_count_bit = 1, + .enable_get_from_memtable_count_bit = 1, + .enable_seek_on_memtable_count_bit = 1, + .enable_next_on_memtable_count_bit = 1, + .enable_prev_on_memtable_count_bit = 1, + .enable_seek_child_seek_count_bit = 1, + .enable_bloom_memtable_hit_count_bit = 1, + .enable_bloom_memtable_miss_count_bit = 1, + .enable_bloom_sst_hit_count_bit = 1, + .enable_bloom_sst_miss_count_bit = 1, + .enable_key_lock_wait_count_bit = 1, + + // 4 + .enable_measure_cpu_time_bit = 1, + + .enable_block_read_time_bit = 1, + .enable_block_checksum_time_bit = 1, + .enable_block_decompress_time_bit = 1, + .enable_get_snapshot_time_bit = 1, + .enable_get_from_memtable_time_bit = 1, + .enable_get_post_process_time_bit = 1, + .enable_get_from_output_files_time_bit = 1, + .enable_seek_on_memtable_time_bit = 1, + .enable_seek_child_seek_time_bit = 1, + .enable_seek_min_heap_time_bit = 1, + .enable_seek_max_heap_time_bit = 1, + .enable_seek_internal_seek_time_bit = 1, + .enable_find_next_user_entry_time_bit = 1, + .enable_write_wal_time_bit = 1, + .enable_write_memtable_time_bit = 1, + .enable_write_delay_time_bit = 1, + .enable_write_scheduling_flushes_compactions_time_bit = 1, + .enable_write_pre_and_post_process_time_bit = 1, + .enable_write_thread_wait_nanos_bit = 1, + .enable_merge_operator_time_nanos_bit = 1, + .enable_read_index_block_nanos_bit = 1, + .enable_read_filter_block_nanos_bit = 1, + .enable_new_table_block_iter_nanos_bit = 1, + .enable_new_table_iterator_nanos_bit = 1, + .enable_block_seek_nanos_bit = 1, + .enable_find_table_nanos_bit = 1, + .enable_key_lock_wait_time_bit = 1, + .enable_env_new_sequential_file_nanos_bit = 1, + .enable_env_new_random_access_file_nanos_bit = 1, + .enable_env_new_writable_file_nanos_bit = 1, + .enable_env_reuse_writable_file_nanos_bit = 1, + .enable_env_new_random_rw_file_nanos_bit = 1, + .enable_env_new_directory_nanos_bit = 1, + .enable_env_file_exists_nanos_bit = 1, + .enable_env_get_children_nanos_bit = 1, + .enable_env_get_children_file_attributes_nanos_bit = 1, + .enable_env_delete_file_nanos_bit = 1, + .enable_env_create_dir_nanos_bit = 1, + .enable_env_create_dir_if_missing_nanos_bit = 1, + .enable_env_delete_dir_nanos_bit = 1, + .enable_env_get_file_size_nanos_bit = 1, + .enable_env_get_file_modification_time_nanos_bit = 1, + .enable_env_rename_file_nanos_bit = 1, + .enable_env_link_file_nanos_bit = 1, + .enable_env_lock_file_nanos_bit = 1, + .enable_env_unlock_file_nanos_bit = 1, + .enable_env_new_logger_nanos_bit = 1, + .enable_encrypt_data_nanos_bit = 1, + .enable_decrypt_data_nanos_bit = 1, + + .enable_get_cpu_nanos_bit = 1, + .enable_iter_next_cpu_nanos_bit = 1, + .enable_iter_prev_cpu_nanos_bit = 1, + .enable_iter_seek_cpu_nanos_bit = 1, + + .enable_db_mutex_lock_nanos_bit = 1, + .enable_db_condition_wait_nanos_bit = 1, +}; + +// set default value of perf_bit_field + +#ifdef ROCKSDB_SUPPORT_THREAD_LOCAL +// TODO: support original Perf Level +__thread PerfLevelByBitField perf_bit_field = BitFieldEnableCount; +#else +PerfLevelByBitField perf_bit_field = BitFieldEnableCount; +#endif + +// set the perf stats bitfield for current thread +void SetPerfBitField(PerfLevelByBitField pbf) { perf_bit_field = pbf; } + +// get current perf stats bitfield for current thread +PerfLevelByBitField* GetPerfBitField() { return &perf_bit_field; } +} // namespace rocksdb diff --git a/monitoring/perf_level_by_bitfield_imp.h b/monitoring/perf_level_by_bitfield_imp.h new file mode 100644 index 00000000000..7fdb8a61be5 --- /dev/null +++ b/monitoring/perf_level_by_bitfield_imp.h @@ -0,0 +1,18 @@ +#pragma once +#include "rocksdb/perf_level_by_bitfield.h" + +namespace rocksdb { + +#ifdef ROCKSDB_SUPPORT_THREAD_LOCAL +extern __thread PerfLevelByBitField perf_bit_field; +#else +extern PerfLevelByBitField perf_bit_field; +#endif +extern const PerfLevelByBitField BitFieldEnableCount; +extern const PerfLevelByBitField BitFieldEnableTimeExceptForMutex; +extern const PerfLevelByBitField BitFieldEnableTimeAndCPUTimeExceptForMutex; +extern const PerfLevelByBitField BitFieldEnableTime; + +} // namespace rocksdb + +#define BITFIELD_METRIC(metric) enable_##metric##_bit diff --git a/monitoring/perf_step_timer.h b/monitoring/perf_step_timer.h index 6501bd54aba..d2c5ee86db3 100644 --- a/monitoring/perf_step_timer.h +++ b/monitoring/perf_step_timer.h @@ -12,11 +12,12 @@ namespace rocksdb { class PerfStepTimer { public: - explicit PerfStepTimer( - uint64_t* metric, Env* env = nullptr, bool use_cpu_time = false, - PerfLevel enable_level = PerfLevel::kEnableTimeExceptForMutex, - Statistics* statistics = nullptr, uint32_t ticker_type = 0) - : perf_counter_enabled_(perf_level >= enable_level), + explicit PerfStepTimer(uint64_t* metric, Env* env = nullptr, + bool use_cpu_time = false, + bool perf_counter_enabled_ = false, + Statistics* statistics = nullptr, + uint32_t ticker_type = 0) + : perf_counter_enabled_(perf_counter_enabled_), use_cpu_time_(use_cpu_time), env_((perf_counter_enabled_ || statistics != nullptr) ? ((env != nullptr) ? env : Env::Default()) From 5e888e74588afcf343ce30fd90cf2685a0d2c27f Mon Sep 17 00:00:00 2001 From: lemonhx Date: Mon, 15 Mar 2021 16:22:18 +0800 Subject: [PATCH 2/9] removing chinese comment --- include/rocksdb/perf_level_by_bitfield.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/rocksdb/perf_level_by_bitfield.h b/include/rocksdb/perf_level_by_bitfield.h index fdc0e0450bb..8ae3639411a 100644 --- a/include/rocksdb/perf_level_by_bitfield.h +++ b/include/rocksdb/perf_level_by_bitfield.h @@ -33,7 +33,7 @@ struct PerfLevelByBitField { uint8_t enable_bloom_sst_miss_count_bit : 1; // 2 uint8_t enable_key_lock_wait_count_bit : 1; // 2 - // 这个仅仅是一个简单的flag + // flag enable for using cpu time uint8_t enable_measure_cpu_time_bit : 1; // 3 -> with CPU time flag uint8_t enable_block_read_time_bit : 1; // 3 @@ -86,7 +86,6 @@ struct PerfLevelByBitField { uint8_t enable_encrypt_data_nanos_bit : 1; // 3 uint8_t enable_decrypt_data_nanos_bit : 1; // 3 - // TODO: 只有开了 4 才能用 uint8_t enable_get_cpu_nanos_bit : 1; // 4 uint8_t enable_iter_next_cpu_nanos_bit : 1; // 4 uint8_t enable_iter_prev_cpu_nanos_bit : 1; // 4 From 02880fcea73220786ef196f4ab5f6185b10dd740 Mon Sep 17 00:00:00 2001 From: lemonhx Date: Thu, 18 Mar 2021 17:08:37 +0800 Subject: [PATCH 3/9] reformat code and rename the PerfLevelByBitField structure to PerfFlags. --- CMakeLists.txt | 2 +- ...{perf_level_by_bitfield.h => perf_flags.h} | 9 +++-- monitoring/perf_context_imp.h | 40 +++++++++---------- ...erf_level_by_bitfield.cc => perf_flags.cc} | 25 +++++------- monitoring/perf_flags_imp.h | 18 +++++++++ monitoring/perf_level.cc | 16 ++++---- monitoring/perf_level_by_bitfield_imp.h | 18 --------- 7 files changed, 62 insertions(+), 66 deletions(-) rename include/rocksdb/{perf_level_by_bitfield.h => perf_flags.h} (97%) rename monitoring/{perf_level_by_bitfield.cc => perf_flags.cc} (94%) create mode 100644 monitoring/perf_flags_imp.h delete mode 100644 monitoring/perf_level_by_bitfield_imp.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c38b26c1328..0f40d510a9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -584,7 +584,7 @@ set(SOURCES monitoring/instrumented_mutex.cc monitoring/iostats_context.cc monitoring/perf_context.cc - monitoring/perf_level_by_bitfield.cc + monitoring/perf_flags.cc monitoring/perf_level.cc monitoring/persistent_stats_history.cc monitoring/statistics.cc diff --git a/include/rocksdb/perf_level_by_bitfield.h b/include/rocksdb/perf_flags.h similarity index 97% rename from include/rocksdb/perf_level_by_bitfield.h rename to include/rocksdb/perf_flags.h index 8ae3639411a..ecf23808873 100644 --- a/include/rocksdb/perf_level_by_bitfield.h +++ b/include/rocksdb/perf_flags.h @@ -3,7 +3,7 @@ namespace rocksdb { -struct PerfLevelByBitField { +struct PerfFlags { uint8_t perf_level; uint8_t enable_user_key_comparison_count_bit : 1; // 2 @@ -33,7 +33,7 @@ struct PerfLevelByBitField { uint8_t enable_bloom_sst_miss_count_bit : 1; // 2 uint8_t enable_key_lock_wait_count_bit : 1; // 2 - // flag enable for using cpu time + // flag enable for using cpu time prob useless in TiKV port uint8_t enable_measure_cpu_time_bit : 1; // 3 -> with CPU time flag uint8_t enable_block_read_time_bit : 1; // 3 @@ -96,8 +96,9 @@ struct PerfLevelByBitField { }; // set the perf stats bitfield for current thread -void SetPerfBitField(PerfLevelByBitField pbf); +void SetPerfPerfFlags(PerfFlags pbf); // get current perf stats bitfield for current thread -PerfLevelByBitField* GetPerfBitField(); +PerfFlags* GetPerfPerfFlags(); + } // namespace rocksdb \ No newline at end of file diff --git a/monitoring/perf_context_imp.h b/monitoring/perf_context_imp.h index 0c253157f3e..350186cb7a8 100644 --- a/monitoring/perf_context_imp.h +++ b/monitoring/perf_context_imp.h @@ -4,7 +4,7 @@ // (found in the LICENSE.Apache file in the root directory). // #pragma once -#include "monitoring/perf_level_by_bitfield_imp.h" +#include "monitoring/perf_flags_imp.h" #include "monitoring/perf_step_timer.h" #include "rocksdb/perf_context.h" #include "util/stop_watch.h" @@ -42,33 +42,33 @@ extern thread_local PerfContext perf_context; #define PERF_TIMER_START(metric) perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_TIMER_GUARD(metric) \ - PerfStepTimer perf_step_timer_##metric( \ - &(perf_context.metric), nullptr, \ - (bool)perf_bit_field.enable_measure_cpu_time_bit, \ - (bool)perf_bit_field.enable_##metric##_bit); \ +#define PERF_TIMER_GUARD(metric) \ + PerfStepTimer perf_step_timer_##metric( \ + &(perf_context.metric), nullptr, \ + (bool)perf_flags.enable_measure_cpu_time_bit, \ + (bool)perf_flags.enable_##metric##_bit); \ perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_TIMER_GUARD_WITH_ENV(metric, env) \ - PerfStepTimer perf_step_timer_##metric( \ - &(perf_context.metric), env, \ - (bool)perf_bit_field.enable_measure_cpu_time_bit, \ - (bool)perf_bit_field.enable_##metric##_bit); \ +#define PERF_TIMER_GUARD_WITH_ENV(metric, env) \ + PerfStepTimer perf_step_timer_##metric( \ + &(perf_context.metric), env, \ + (bool)perf_flags.enable_measure_cpu_time_bit, \ + (bool)perf_flags.enable_##metric##_bit); \ perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_CPU_TIMER_GUARD(metric, env) \ - PerfStepTimer perf_step_timer_##metric( \ - &(perf_context.metric), env, true, \ - (bool)perf_bit_field.enable_##metric##_bit); \ +#define PERF_CPU_TIMER_GUARD(metric, env) \ + PerfStepTimer perf_step_timer_##metric( \ + &(perf_context.metric), env, true, \ + (bool)perf_flags.enable_##metric##_bit); \ perf_step_timer_##metric.Start(); #define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition, stats, \ ticker_type) \ PerfStepTimer perf_step_timer_##metric( \ &(perf_context.metric), nullptr, false, \ - (bool)perf_bit_field.enable_##metric##_bit, stats, ticker_type); \ + (bool)perf_flags.enable_##metric##_bit, stats, ticker_type); \ if (condition) { \ perf_step_timer_##metric.Start(); \ } @@ -78,13 +78,13 @@ extern thread_local PerfContext perf_context; #define PERF_TIMER_MEASURE(metric) perf_step_timer_##metric.Measure(); // Increase metric value -#define PERF_COUNTER_ADD(metric, value) \ - if (perf_bit_field.enable_##metric##_bit) { \ - perf_context.metric += value; \ +#define PERF_COUNTER_ADD(metric, value) \ + if (perf_flags.enable_##metric##_bit) { \ + perf_context.metric += value; \ } // Increase metric value -// TODO: 添加一个flag count +// TODO: add a flag count #define PERF_COUNTER_BY_LEVEL_ADD(metric, value, level) \ if (perf_context.per_level_perf_context_enabled && \ perf_context.level_to_perf_context) { \ diff --git a/monitoring/perf_level_by_bitfield.cc b/monitoring/perf_flags.cc similarity index 94% rename from monitoring/perf_level_by_bitfield.cc rename to monitoring/perf_flags.cc index 45bce92bad1..d5e9186d720 100644 --- a/monitoring/perf_level_by_bitfield.cc +++ b/monitoring/perf_flags.cc @@ -1,6 +1,6 @@ -#include "monitoring/perf_level_by_bitfield_imp.h" +#include "monitoring/perf_flags_imp.h" namespace rocksdb { -const PerfLevelByBitField BitFieldEnableCount = { +const PerfFlags PerfFlagsEnableCount = { .perf_level = 2, .enable_user_key_comparison_count_bit = 1, .enable_block_cache_hit_count_bit = 1, @@ -30,7 +30,7 @@ const PerfLevelByBitField BitFieldEnableCount = { .enable_key_lock_wait_count_bit = 1, }; -const PerfLevelByBitField BitFieldEnableTimeExceptForMutex = { +const PerfFlags PerfFlagsEnableTimeExceptForMutex = { .perf_level = 3, .enable_user_key_comparison_count_bit = 1, .enable_block_cache_hit_count_bit = 1, @@ -109,7 +109,7 @@ const PerfLevelByBitField BitFieldEnableTimeExceptForMutex = { .enable_encrypt_data_nanos_bit = 1, .enable_decrypt_data_nanos_bit = 1, }; -const PerfLevelByBitField BitFieldEnableTimeAndCPUTimeExceptForMutex = { +const PerfFlags PerfFlagsEnableTimeAndCPUTimeExceptForMutex = { .perf_level = 4, .enable_user_key_comparison_count_bit = 1, .enable_block_cache_hit_count_bit = 1, @@ -138,8 +138,6 @@ const PerfLevelByBitField BitFieldEnableTimeAndCPUTimeExceptForMutex = { .enable_bloom_sst_miss_count_bit = 1, .enable_key_lock_wait_count_bit = 1, - // 4 - .enable_measure_cpu_time_bit = 1, .enable_block_read_time_bit = 1, .enable_block_checksum_time_bit = 1, @@ -197,7 +195,7 @@ const PerfLevelByBitField BitFieldEnableTimeAndCPUTimeExceptForMutex = { .enable_iter_seek_cpu_nanos_bit = 1, }; -const PerfLevelByBitField BitFieldEnableTime = { +const PerfFlags PerfFlagsEnableTime = { .perf_level = 5, .enable_user_key_comparison_count_bit = 1, .enable_block_cache_hit_count_bit = 1, @@ -226,9 +224,6 @@ const PerfLevelByBitField BitFieldEnableTime = { .enable_bloom_sst_miss_count_bit = 1, .enable_key_lock_wait_count_bit = 1, - // 4 - .enable_measure_cpu_time_bit = 1, - .enable_block_read_time_bit = 1, .enable_block_checksum_time_bit = 1, .enable_block_decompress_time_bit = 1, @@ -288,18 +283,18 @@ const PerfLevelByBitField BitFieldEnableTime = { .enable_db_condition_wait_nanos_bit = 1, }; -// set default value of perf_bit_field +// set default value of perf_flags #ifdef ROCKSDB_SUPPORT_THREAD_LOCAL // TODO: support original Perf Level -__thread PerfLevelByBitField perf_bit_field = BitFieldEnableCount; +__thread PerfFlags perf_flags = PerfFlagsEnableCount; #else -PerfLevelByBitField perf_bit_field = BitFieldEnableCount; +PerfFlags perf_flags = PerfFlagsEnableCount; #endif // set the perf stats bitfield for current thread -void SetPerfBitField(PerfLevelByBitField pbf) { perf_bit_field = pbf; } +void SetPerfPerfFlags(PerfFlags pbf) { perf_flags = pbf; } // get current perf stats bitfield for current thread -PerfLevelByBitField* GetPerfBitField() { return &perf_bit_field; } +PerfFlags* GetPerfPerfFlags() { return &perf_flags; } } // namespace rocksdb diff --git a/monitoring/perf_flags_imp.h b/monitoring/perf_flags_imp.h new file mode 100644 index 00000000000..16c6421bcb3 --- /dev/null +++ b/monitoring/perf_flags_imp.h @@ -0,0 +1,18 @@ +#pragma once +#include "rocksdb/perf_flags.h" + +namespace rocksdb { + +#ifdef ROCKSDB_SUPPORT_THREAD_LOCAL +extern __thread PerfFlags perf_flags; +#else +extern PerfLevelByPerfFlags perf_flags; +#endif +extern const PerfFlags PerfFlagsEnableCount; +extern const PerfFlags PerfFlagsEnableTimeExceptForMutex; +extern const PerfFlags PerfFlagsEnableTimeAndCPUTimeExceptForMutex; +extern const PerfFlags PerfFlagsEnableTime; + +} // namespace rocksdb + +#define BITFIELD_METRIC(metric) enable_##metric##_bit diff --git a/monitoring/perf_level.cc b/monitoring/perf_level.cc index 9fa9ed50577..d9a6b9716f1 100644 --- a/monitoring/perf_level.cc +++ b/monitoring/perf_level.cc @@ -8,7 +8,7 @@ #include -#include "monitoring/perf_level_by_bitfield_imp.h" +#include "monitoring/perf_flags_imp.h" namespace rocksdb { @@ -18,24 +18,24 @@ void SetPerfLevel(PerfLevel level) { assert(level < kOutOfBounds); switch (level) { case kEnableCount: - perf_bit_field = BitFieldEnableCount; + perf_flags = PerfFlagsEnableCount; break; case kEnableTimeExceptForMutex: - perf_bit_field = BitFieldEnableTimeExceptForMutex; + perf_flags = PerfFlagsEnableTimeExceptForMutex; break; case kEnableTimeAndCPUTimeExceptForMutex: - perf_bit_field = BitFieldEnableTimeAndCPUTimeExceptForMutex; + perf_flags = PerfFlagsEnableTimeAndCPUTimeExceptForMutex; break; case kEnableTime: - perf_bit_field = BitFieldEnableTime; + perf_flags = PerfFlagsEnableTime; break; default: - perf_bit_field = {}; + perf_flags = {}; break; } - perf_bit_field.perf_level = level; + perf_flags.perf_level = level; } -PerfLevel GetPerfLevel() { return (PerfLevel)perf_bit_field.perf_level; } +PerfLevel GetPerfLevel() { return (PerfLevel)perf_flags.perf_level; } } // namespace rocksdb diff --git a/monitoring/perf_level_by_bitfield_imp.h b/monitoring/perf_level_by_bitfield_imp.h deleted file mode 100644 index 7fdb8a61be5..00000000000 --- a/monitoring/perf_level_by_bitfield_imp.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include "rocksdb/perf_level_by_bitfield.h" - -namespace rocksdb { - -#ifdef ROCKSDB_SUPPORT_THREAD_LOCAL -extern __thread PerfLevelByBitField perf_bit_field; -#else -extern PerfLevelByBitField perf_bit_field; -#endif -extern const PerfLevelByBitField BitFieldEnableCount; -extern const PerfLevelByBitField BitFieldEnableTimeExceptForMutex; -extern const PerfLevelByBitField BitFieldEnableTimeAndCPUTimeExceptForMutex; -extern const PerfLevelByBitField BitFieldEnableTime; - -} // namespace rocksdb - -#define BITFIELD_METRIC(metric) enable_##metric##_bit From f1dae117167bdcae63b6fb20c5b091a3c7307a51 Mon Sep 17 00:00:00 2001 From: lemonhx Date: Wed, 24 Mar 2021 19:02:45 +0800 Subject: [PATCH 4/9] Reformat code and remove the usage of GetPerfLevel also removed field .perf_level in PerfFlags --- db/compaction/compaction_job.cc | 4 +- db/db_iter_test.cc | 4 +- db/db_properties_test.cc | 4 +- db/flush_job.cc | 4 +- db/version_set.cc | 4 +- include/rocksdb/perf_flags.h | 8 +- include/rocksdb/perf_level.h | 3 +- monitoring/perf_context_imp.h | 1 - monitoring/perf_flags.cc | 363 ++++++++------------------------ monitoring/perf_level.cc | 4 +- util/file_reader_writer.cc | 41 ++-- 11 files changed, 127 insertions(+), 313 deletions(-) diff --git a/db/compaction/compaction_job.cc b/db/compaction/compaction_job.cc index 452621cf7f9..69e1e528f09 100644 --- a/db/compaction/compaction_job.cc +++ b/db/compaction/compaction_job.cc @@ -867,8 +867,8 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) { uint64_t prev_cpu_write_nanos = 0; uint64_t prev_cpu_read_nanos = 0; if (measure_io_stats_) { - prev_perf_level = GetPerfLevel(); - SetPerfLevel(PerfLevel::kEnableTimeAndCPUTimeExceptForMutex); + // prev_perf_level = GetPerfLevel(); + // SetPerfLevel(PerfLevel::kEnableTimeAndCPUTimeExceptForMutex); prev_write_nanos = IOSTATS(write_nanos); prev_fsync_nanos = IOSTATS(fsync_nanos); prev_range_sync_nanos = IOSTATS(range_sync_nanos); diff --git a/db/db_iter_test.cc b/db/db_iter_test.cc index 1503886443b..9d87211d4fd 100644 --- a/db/db_iter_test.cc +++ b/db/db_iter_test.cc @@ -414,7 +414,7 @@ TEST_F(DBIteratorTest, DBIteratorPrevNext) { nullptr /*read_callback*/)); SetPerfLevel(kEnableCount); - ASSERT_TRUE(GetPerfLevel() == kEnableCount); + // ASSERT_TRUE(GetPerfLevel() == kEnableCount); get_perf_context()->Reset(); db_iter->SeekToLast(); @@ -537,7 +537,7 @@ TEST_F(DBIteratorTest, DBIteratorPrevNext) { nullptr /*read_callback*/)); SetPerfLevel(kEnableCount); - ASSERT_TRUE(GetPerfLevel() == kEnableCount); + // ASSERT_TRUE(GetPerfLevel() == kEnableCount); get_perf_context()->Reset(); db_iter->SeekToLast(); diff --git a/db/db_properties_test.cc b/db/db_properties_test.cc index f271f5a8d68..6deaaf187c8 100644 --- a/db/db_properties_test.cc +++ b/db/db_properties_test.cc @@ -626,7 +626,7 @@ TEST_F(DBPropertiesTest, NumImmutableMemTable) { std::string num; uint64_t value; SetPerfLevel(kEnableTime); - ASSERT_TRUE(GetPerfLevel() == kEnableTime); + // ASSERT_TRUE(GetPerfLevel() == kEnableTime); ASSERT_OK(dbfull()->Put(writeOpt, handles_[1], "k1", big_value)); ASSERT_TRUE(dbfull()->GetProperty(handles_[1], @@ -724,7 +724,7 @@ TEST_F(DBPropertiesTest, NumImmutableMemTable) { ASSERT_EQ(int_num, base_total_size + 1); SetPerfLevel(kDisable); - ASSERT_TRUE(GetPerfLevel() == kDisable); + // ASSERT_TRUE(GetPerfLevel() == kDisable); } while (ChangeCompactOptions()); } diff --git a/db/flush_job.cc b/db/flush_job.cc index 716e21e9749..804f6a4fc18 100644 --- a/db/flush_job.cc +++ b/db/flush_job.cc @@ -212,8 +212,8 @@ Status FlushJob::Run(LogsWithPrepTracker* prep_tracker, uint64_t prev_cpu_write_nanos = 0; uint64_t prev_cpu_read_nanos = 0; if (measure_io_stats_) { - prev_perf_level = GetPerfLevel(); - SetPerfLevel(PerfLevel::kEnableTime); + // prev_perf_level = GetPerfLevel(); + // SetPerfLevel(PerfLevel::kEnableTime); prev_write_nanos = IOSTATS(write_nanos); prev_fsync_nanos = IOSTATS(fsync_nanos); prev_range_sync_nanos = IOSTATS(range_sync_nanos); diff --git a/db/version_set.cc b/db/version_set.cc index 736240278d7..80dacef1725 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -1697,7 +1697,7 @@ void Version::Get(const ReadOptions& read_options, const LookupKey& k, } bool timer_enabled = - GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex && + // GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex && get_perf_context()->per_level_perf_context_enabled; StopWatchNano timer(env_, timer_enabled /* auto_start */); *status = table_cache_->Get( @@ -1843,7 +1843,7 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range, while (f != nullptr) { MultiGetRange file_range = fp.CurrentFileRange(); bool timer_enabled = - GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex && + // GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex && get_perf_context()->per_level_perf_context_enabled; StopWatchNano timer(env_, timer_enabled /* auto_start */); Status s = table_cache_->MultiGet( diff --git a/include/rocksdb/perf_flags.h b/include/rocksdb/perf_flags.h index ecf23808873..5e11e3da6f2 100644 --- a/include/rocksdb/perf_flags.h +++ b/include/rocksdb/perf_flags.h @@ -4,8 +4,6 @@ namespace rocksdb { struct PerfFlags { - uint8_t perf_level; - uint8_t enable_user_key_comparison_count_bit : 1; // 2 uint8_t enable_block_cache_hit_count_bit : 1; // 2 uint8_t enable_block_read_count_bit : 1; // 2 @@ -96,9 +94,9 @@ struct PerfFlags { }; // set the perf stats bitfield for current thread -void SetPerfPerfFlags(PerfFlags pbf); +void SetPerfFlags(PerfFlags pbf); // get current perf stats bitfield for current thread -PerfFlags* GetPerfPerfFlags(); +PerfFlags GetPerfFlags(); -} // namespace rocksdb \ No newline at end of file +} // namespace rocksdb diff --git a/include/rocksdb/perf_level.h b/include/rocksdb/perf_level.h index de0a214d6ae..d6d4065af3c 100644 --- a/include/rocksdb/perf_level.h +++ b/include/rocksdb/perf_level.h @@ -25,9 +25,10 @@ enum PerfLevel : unsigned char { }; // set the perf stats level for current thread +//[[deprecated("Please use SetPerfFlags")]] void SetPerfLevel(PerfLevel level); // get current perf stats level for current thread -PerfLevel GetPerfLevel(); +[[deprecated("Please use GetPerfFlags")]] PerfLevel GetPerfLevel(); } // namespace rocksdb diff --git a/monitoring/perf_context_imp.h b/monitoring/perf_context_imp.h index 350186cb7a8..f42bf901c6f 100644 --- a/monitoring/perf_context_imp.h +++ b/monitoring/perf_context_imp.h @@ -97,7 +97,6 @@ extern thread_local PerfContext perf_context; (*(perf_context.level_to_perf_context))[level].metric += value; \ } \ } - #endif } // namespace rocksdb diff --git a/monitoring/perf_flags.cc b/monitoring/perf_flags.cc index d5e9186d720..42a8a02a3e6 100644 --- a/monitoring/perf_flags.cc +++ b/monitoring/perf_flags.cc @@ -1,284 +1,96 @@ #include "monitoring/perf_flags_imp.h" -namespace rocksdb { -const PerfFlags PerfFlagsEnableCount = { - .perf_level = 2, - .enable_user_key_comparison_count_bit = 1, - .enable_block_cache_hit_count_bit = 1, - .enable_block_read_count_bit = 1, - .enable_block_read_byte_bit = 1, - .enable_block_cache_index_hit_count_bit = 1, - .enable_index_block_read_count_bit = 1, - .enable_block_cache_filter_hit_count_bit = 1, - .enable_filter_block_read_count_bit = 1, - .enable_compression_dict_block_read_count_bit = 1, - .enable_get_read_bytes_bit = 1, - .enable_multiget_read_bytes_bit = 1, - .enable_iter_read_bytes_bit = 1, - .enable_internal_key_skipped_count_bit = 1, - .enable_internal_delete_skipped_count_bit = 1, - .enable_internal_recent_skipped_count_bit = 1, - .enable_internal_merge_count_bit = 1, - .enable_get_from_memtable_count_bit = 1, - .enable_seek_on_memtable_count_bit = 1, - .enable_next_on_memtable_count_bit = 1, - .enable_prev_on_memtable_count_bit = 1, - .enable_seek_child_seek_count_bit = 1, - .enable_bloom_memtable_hit_count_bit = 1, - .enable_bloom_memtable_miss_count_bit = 1, - .enable_bloom_sst_hit_count_bit = 1, - .enable_bloom_sst_miss_count_bit = 1, - .enable_key_lock_wait_count_bit = 1, -}; -const PerfFlags PerfFlagsEnableTimeExceptForMutex = { - .perf_level = 3, - .enable_user_key_comparison_count_bit = 1, - .enable_block_cache_hit_count_bit = 1, - .enable_block_read_count_bit = 1, - .enable_block_read_byte_bit = 1, - .enable_block_cache_index_hit_count_bit = 1, - .enable_index_block_read_count_bit = 1, - .enable_block_cache_filter_hit_count_bit = 1, - .enable_filter_block_read_count_bit = 1, - .enable_compression_dict_block_read_count_bit = 1, - .enable_get_read_bytes_bit = 1, - .enable_multiget_read_bytes_bit = 1, - .enable_iter_read_bytes_bit = 1, - .enable_internal_key_skipped_count_bit = 1, - .enable_internal_delete_skipped_count_bit = 1, - .enable_internal_recent_skipped_count_bit = 1, - .enable_internal_merge_count_bit = 1, - .enable_get_from_memtable_count_bit = 1, - .enable_seek_on_memtable_count_bit = 1, - .enable_next_on_memtable_count_bit = 1, - .enable_prev_on_memtable_count_bit = 1, - .enable_seek_child_seek_count_bit = 1, - .enable_bloom_memtable_hit_count_bit = 1, - .enable_bloom_memtable_miss_count_bit = 1, - .enable_bloom_sst_hit_count_bit = 1, - .enable_bloom_sst_miss_count_bit = 1, - .enable_key_lock_wait_count_bit = 1, +#ifndef PERF_FLAGS_ENABLE_COUNT +#define PERF_FLAGS_ENABLE_COUNT \ + .enable_user_key_comparison_count_bit = 1, \ + .enable_block_cache_hit_count_bit = 1, .enable_block_read_count_bit = 1, \ + .enable_block_read_byte_bit = 1, \ + .enable_block_cache_index_hit_count_bit = 1, \ + .enable_index_block_read_count_bit = 1, \ + .enable_block_cache_filter_hit_count_bit = 1, \ + .enable_filter_block_read_count_bit = 1, \ + .enable_compression_dict_block_read_count_bit = 1, \ + .enable_get_read_bytes_bit = 1, .enable_multiget_read_bytes_bit = 1, \ + .enable_iter_read_bytes_bit = 1, .enable_internal_key_skipped_count_bit = 1, \ + .enable_internal_delete_skipped_count_bit = 1, \ + .enable_internal_recent_skipped_count_bit = 1, \ + .enable_internal_merge_count_bit = 1, \ + .enable_get_from_memtable_count_bit = 1, \ + .enable_seek_on_memtable_count_bit = 1, \ + .enable_next_on_memtable_count_bit = 1, \ + .enable_prev_on_memtable_count_bit = 1, \ + .enable_seek_child_seek_count_bit = 1, \ + .enable_bloom_memtable_hit_count_bit = 1, \ + .enable_bloom_memtable_miss_count_bit = 1, \ + .enable_bloom_sst_hit_count_bit = 1, .enable_bloom_sst_miss_count_bit = 1, \ + .enable_key_lock_wait_count_bit = 1 +#endif - .enable_block_read_time_bit = 1, - .enable_block_checksum_time_bit = 1, - .enable_block_decompress_time_bit = 1, - .enable_get_snapshot_time_bit = 1, - .enable_get_from_memtable_time_bit = 1, - .enable_get_post_process_time_bit = 1, - .enable_get_from_output_files_time_bit = 1, - .enable_seek_on_memtable_time_bit = 1, - .enable_seek_child_seek_time_bit = 1, - .enable_seek_min_heap_time_bit = 1, - .enable_seek_max_heap_time_bit = 1, - .enable_seek_internal_seek_time_bit = 1, - .enable_find_next_user_entry_time_bit = 1, - .enable_write_wal_time_bit = 1, - .enable_write_memtable_time_bit = 1, - .enable_write_delay_time_bit = 1, - .enable_write_scheduling_flushes_compactions_time_bit = 1, - .enable_write_pre_and_post_process_time_bit = 1, - .enable_write_thread_wait_nanos_bit = 1, - .enable_merge_operator_time_nanos_bit = 1, - .enable_read_index_block_nanos_bit = 1, - .enable_read_filter_block_nanos_bit = 1, - .enable_new_table_block_iter_nanos_bit = 1, - .enable_new_table_iterator_nanos_bit = 1, - .enable_block_seek_nanos_bit = 1, - .enable_find_table_nanos_bit = 1, - .enable_key_lock_wait_time_bit = 1, - .enable_env_new_sequential_file_nanos_bit = 1, - .enable_env_new_random_access_file_nanos_bit = 1, - .enable_env_new_writable_file_nanos_bit = 1, - .enable_env_reuse_writable_file_nanos_bit = 1, - .enable_env_new_random_rw_file_nanos_bit = 1, - .enable_env_new_directory_nanos_bit = 1, - .enable_env_file_exists_nanos_bit = 1, - .enable_env_get_children_nanos_bit = 1, - .enable_env_get_children_file_attributes_nanos_bit = 1, - .enable_env_delete_file_nanos_bit = 1, - .enable_env_create_dir_nanos_bit = 1, - .enable_env_create_dir_if_missing_nanos_bit = 1, - .enable_env_delete_dir_nanos_bit = 1, - .enable_env_get_file_size_nanos_bit = 1, - .enable_env_get_file_modification_time_nanos_bit = 1, - .enable_env_rename_file_nanos_bit = 1, - .enable_env_link_file_nanos_bit = 1, - .enable_env_lock_file_nanos_bit = 1, - .enable_env_unlock_file_nanos_bit = 1, - .enable_env_new_logger_nanos_bit = 1, - .enable_encrypt_data_nanos_bit = 1, - .enable_decrypt_data_nanos_bit = 1, -}; -const PerfFlags PerfFlagsEnableTimeAndCPUTimeExceptForMutex = { - .perf_level = 4, - .enable_user_key_comparison_count_bit = 1, - .enable_block_cache_hit_count_bit = 1, - .enable_block_read_count_bit = 1, - .enable_block_read_byte_bit = 1, - .enable_block_cache_index_hit_count_bit = 1, - .enable_index_block_read_count_bit = 1, - .enable_block_cache_filter_hit_count_bit = 1, - .enable_filter_block_read_count_bit = 1, - .enable_compression_dict_block_read_count_bit = 1, - .enable_get_read_bytes_bit = 1, - .enable_multiget_read_bytes_bit = 1, - .enable_iter_read_bytes_bit = 1, - .enable_internal_key_skipped_count_bit = 1, - .enable_internal_delete_skipped_count_bit = 1, - .enable_internal_recent_skipped_count_bit = 1, - .enable_internal_merge_count_bit = 1, - .enable_get_from_memtable_count_bit = 1, - .enable_seek_on_memtable_count_bit = 1, - .enable_next_on_memtable_count_bit = 1, - .enable_prev_on_memtable_count_bit = 1, - .enable_seek_child_seek_count_bit = 1, - .enable_bloom_memtable_hit_count_bit = 1, - .enable_bloom_memtable_miss_count_bit = 1, - .enable_bloom_sst_hit_count_bit = 1, - .enable_bloom_sst_miss_count_bit = 1, - .enable_key_lock_wait_count_bit = 1, +#ifndef PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX +#define PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX \ + .enable_block_read_time_bit = 1, .enable_block_checksum_time_bit = 1, \ + .enable_block_decompress_time_bit = 1, .enable_get_snapshot_time_bit = 1, \ + .enable_get_from_memtable_time_bit = 1, \ + .enable_get_post_process_time_bit = 1, \ + .enable_get_from_output_files_time_bit = 1, \ + .enable_seek_on_memtable_time_bit = 1, .enable_seek_child_seek_time_bit = 1, \ + .enable_seek_min_heap_time_bit = 1, .enable_seek_max_heap_time_bit = 1, \ + .enable_seek_internal_seek_time_bit = 1, \ + .enable_find_next_user_entry_time_bit = 1, .enable_write_wal_time_bit = 1, \ + .enable_write_memtable_time_bit = 1, .enable_write_delay_time_bit = 1, \ + .enable_write_scheduling_flushes_compactions_time_bit = 1, \ + .enable_write_pre_and_post_process_time_bit = 1, \ + .enable_write_thread_wait_nanos_bit = 1, \ + .enable_merge_operator_time_nanos_bit = 1, \ + .enable_read_index_block_nanos_bit = 1, \ + .enable_read_filter_block_nanos_bit = 1, \ + .enable_new_table_block_iter_nanos_bit = 1, \ + .enable_new_table_iterator_nanos_bit = 1, .enable_block_seek_nanos_bit = 1, \ + .enable_find_table_nanos_bit = 1, .enable_key_lock_wait_time_bit = 1, \ + .enable_env_new_sequential_file_nanos_bit = 1, \ + .enable_env_new_random_access_file_nanos_bit = 1, \ + .enable_env_new_writable_file_nanos_bit = 1, \ + .enable_env_reuse_writable_file_nanos_bit = 1, \ + .enable_env_new_random_rw_file_nanos_bit = 1, \ + .enable_env_new_directory_nanos_bit = 1, \ + .enable_env_file_exists_nanos_bit = 1, \ + .enable_env_get_children_nanos_bit = 1, \ + .enable_env_get_children_file_attributes_nanos_bit = 1, \ + .enable_env_delete_file_nanos_bit = 1, .enable_env_create_dir_nanos_bit = 1, \ + .enable_env_create_dir_if_missing_nanos_bit = 1, \ + .enable_env_delete_dir_nanos_bit = 1, \ + .enable_env_get_file_size_nanos_bit = 1, \ + .enable_env_get_file_modification_time_nanos_bit = 1, \ + .enable_env_rename_file_nanos_bit = 1, .enable_env_link_file_nanos_bit = 1, \ + .enable_env_lock_file_nanos_bit = 1, .enable_env_unlock_file_nanos_bit = 1, \ + .enable_env_new_logger_nanos_bit = 1, .enable_encrypt_data_nanos_bit = 1, \ + .enable_decrypt_data_nanos_bit = 1 +#endif +#ifndef PERF_FLAGS_ENABLE_TIME_AND_CPU_TIME_EXCEPT_FOR_MUTEX +#define PERF_FLAGS_ENABLE_TIME_AND_CPU_TIME_EXCEPT_FOR_MUTEX \ + .enable_get_cpu_nanos_bit = 1, .enable_iter_next_cpu_nanos_bit = 1, \ + .enable_iter_prev_cpu_nanos_bit = 1, .enable_iter_seek_cpu_nanos_bit = 1 +#endif - .enable_block_read_time_bit = 1, - .enable_block_checksum_time_bit = 1, - .enable_block_decompress_time_bit = 1, - .enable_get_snapshot_time_bit = 1, - .enable_get_from_memtable_time_bit = 1, - .enable_get_post_process_time_bit = 1, - .enable_get_from_output_files_time_bit = 1, - .enable_seek_on_memtable_time_bit = 1, - .enable_seek_child_seek_time_bit = 1, - .enable_seek_min_heap_time_bit = 1, - .enable_seek_max_heap_time_bit = 1, - .enable_seek_internal_seek_time_bit = 1, - .enable_find_next_user_entry_time_bit = 1, - .enable_write_wal_time_bit = 1, - .enable_write_memtable_time_bit = 1, - .enable_write_delay_time_bit = 1, - .enable_write_scheduling_flushes_compactions_time_bit = 1, - .enable_write_pre_and_post_process_time_bit = 1, - .enable_write_thread_wait_nanos_bit = 1, - .enable_merge_operator_time_nanos_bit = 1, - .enable_read_index_block_nanos_bit = 1, - .enable_read_filter_block_nanos_bit = 1, - .enable_new_table_block_iter_nanos_bit = 1, - .enable_new_table_iterator_nanos_bit = 1, - .enable_block_seek_nanos_bit = 1, - .enable_find_table_nanos_bit = 1, - .enable_key_lock_wait_time_bit = 1, - .enable_env_new_sequential_file_nanos_bit = 1, - .enable_env_new_random_access_file_nanos_bit = 1, - .enable_env_new_writable_file_nanos_bit = 1, - .enable_env_reuse_writable_file_nanos_bit = 1, - .enable_env_new_random_rw_file_nanos_bit = 1, - .enable_env_new_directory_nanos_bit = 1, - .enable_env_file_exists_nanos_bit = 1, - .enable_env_get_children_nanos_bit = 1, - .enable_env_get_children_file_attributes_nanos_bit = 1, - .enable_env_delete_file_nanos_bit = 1, - .enable_env_create_dir_nanos_bit = 1, - .enable_env_create_dir_if_missing_nanos_bit = 1, - .enable_env_delete_dir_nanos_bit = 1, - .enable_env_get_file_size_nanos_bit = 1, - .enable_env_get_file_modification_time_nanos_bit = 1, - .enable_env_rename_file_nanos_bit = 1, - .enable_env_link_file_nanos_bit = 1, - .enable_env_lock_file_nanos_bit = 1, - .enable_env_unlock_file_nanos_bit = 1, - .enable_env_new_logger_nanos_bit = 1, - .enable_encrypt_data_nanos_bit = 1, - .enable_decrypt_data_nanos_bit = 1, +namespace rocksdb { +const PerfFlags PerfFlagsEnableCount = { + // .perf_level = 2, + PERF_FLAGS_ENABLE_COUNT}; - .enable_get_cpu_nanos_bit = 1, - .enable_iter_next_cpu_nanos_bit = 1, - .enable_iter_prev_cpu_nanos_bit = 1, - .enable_iter_seek_cpu_nanos_bit = 1, -}; +const PerfFlags PerfFlagsEnableTimeExceptForMutex = { + // .perf_level = 3, + PERF_FLAGS_ENABLE_COUNT, PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX}; +const PerfFlags PerfFlagsEnableTimeAndCPUTimeExceptForMutex = { + // .perf_level = 4, + PERF_FLAGS_ENABLE_COUNT, PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX, + PERF_FLAGS_ENABLE_TIME_AND_CPU_TIME_EXCEPT_FOR_MUTEX}; const PerfFlags PerfFlagsEnableTime = { - .perf_level = 5, - .enable_user_key_comparison_count_bit = 1, - .enable_block_cache_hit_count_bit = 1, - .enable_block_read_count_bit = 1, - .enable_block_read_byte_bit = 1, - .enable_block_cache_index_hit_count_bit = 1, - .enable_index_block_read_count_bit = 1, - .enable_block_cache_filter_hit_count_bit = 1, - .enable_filter_block_read_count_bit = 1, - .enable_compression_dict_block_read_count_bit = 1, - .enable_get_read_bytes_bit = 1, - .enable_multiget_read_bytes_bit = 1, - .enable_iter_read_bytes_bit = 1, - .enable_internal_key_skipped_count_bit = 1, - .enable_internal_delete_skipped_count_bit = 1, - .enable_internal_recent_skipped_count_bit = 1, - .enable_internal_merge_count_bit = 1, - .enable_get_from_memtable_count_bit = 1, - .enable_seek_on_memtable_count_bit = 1, - .enable_next_on_memtable_count_bit = 1, - .enable_prev_on_memtable_count_bit = 1, - .enable_seek_child_seek_count_bit = 1, - .enable_bloom_memtable_hit_count_bit = 1, - .enable_bloom_memtable_miss_count_bit = 1, - .enable_bloom_sst_hit_count_bit = 1, - .enable_bloom_sst_miss_count_bit = 1, - .enable_key_lock_wait_count_bit = 1, - - .enable_block_read_time_bit = 1, - .enable_block_checksum_time_bit = 1, - .enable_block_decompress_time_bit = 1, - .enable_get_snapshot_time_bit = 1, - .enable_get_from_memtable_time_bit = 1, - .enable_get_post_process_time_bit = 1, - .enable_get_from_output_files_time_bit = 1, - .enable_seek_on_memtable_time_bit = 1, - .enable_seek_child_seek_time_bit = 1, - .enable_seek_min_heap_time_bit = 1, - .enable_seek_max_heap_time_bit = 1, - .enable_seek_internal_seek_time_bit = 1, - .enable_find_next_user_entry_time_bit = 1, - .enable_write_wal_time_bit = 1, - .enable_write_memtable_time_bit = 1, - .enable_write_delay_time_bit = 1, - .enable_write_scheduling_flushes_compactions_time_bit = 1, - .enable_write_pre_and_post_process_time_bit = 1, - .enable_write_thread_wait_nanos_bit = 1, - .enable_merge_operator_time_nanos_bit = 1, - .enable_read_index_block_nanos_bit = 1, - .enable_read_filter_block_nanos_bit = 1, - .enable_new_table_block_iter_nanos_bit = 1, - .enable_new_table_iterator_nanos_bit = 1, - .enable_block_seek_nanos_bit = 1, - .enable_find_table_nanos_bit = 1, - .enable_key_lock_wait_time_bit = 1, - .enable_env_new_sequential_file_nanos_bit = 1, - .enable_env_new_random_access_file_nanos_bit = 1, - .enable_env_new_writable_file_nanos_bit = 1, - .enable_env_reuse_writable_file_nanos_bit = 1, - .enable_env_new_random_rw_file_nanos_bit = 1, - .enable_env_new_directory_nanos_bit = 1, - .enable_env_file_exists_nanos_bit = 1, - .enable_env_get_children_nanos_bit = 1, - .enable_env_get_children_file_attributes_nanos_bit = 1, - .enable_env_delete_file_nanos_bit = 1, - .enable_env_create_dir_nanos_bit = 1, - .enable_env_create_dir_if_missing_nanos_bit = 1, - .enable_env_delete_dir_nanos_bit = 1, - .enable_env_get_file_size_nanos_bit = 1, - .enable_env_get_file_modification_time_nanos_bit = 1, - .enable_env_rename_file_nanos_bit = 1, - .enable_env_link_file_nanos_bit = 1, - .enable_env_lock_file_nanos_bit = 1, - .enable_env_unlock_file_nanos_bit = 1, - .enable_env_new_logger_nanos_bit = 1, - .enable_encrypt_data_nanos_bit = 1, - .enable_decrypt_data_nanos_bit = 1, - - .enable_get_cpu_nanos_bit = 1, - .enable_iter_next_cpu_nanos_bit = 1, - .enable_iter_prev_cpu_nanos_bit = 1, - .enable_iter_seek_cpu_nanos_bit = 1, - + // .perf_level = 5, + PERF_FLAGS_ENABLE_COUNT, + PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX, + PERF_FLAGS_ENABLE_TIME_AND_CPU_TIME_EXCEPT_FOR_MUTEX, .enable_db_mutex_lock_nanos_bit = 1, .enable_db_condition_wait_nanos_bit = 1, }; @@ -293,8 +105,7 @@ PerfFlags perf_flags = PerfFlagsEnableCount; #endif // set the perf stats bitfield for current thread -void SetPerfPerfFlags(PerfFlags pbf) { perf_flags = pbf; } - +void SetPerfFlags(PerfFlags pbf) { perf_flags = pbf; } // get current perf stats bitfield for current thread -PerfFlags* GetPerfPerfFlags() { return &perf_flags; } +PerfFlags GetPerfFlags() { return perf_flags; } } // namespace rocksdb diff --git a/monitoring/perf_level.cc b/monitoring/perf_level.cc index d9a6b9716f1..b93766db6f6 100644 --- a/monitoring/perf_level.cc +++ b/monitoring/perf_level.cc @@ -33,9 +33,9 @@ void SetPerfLevel(PerfLevel level) { perf_flags = {}; break; } - perf_flags.perf_level = level; + // perf_flags.perf_level = level; } -PerfLevel GetPerfLevel() { return (PerfLevel)perf_flags.perf_level; } +// PerfLevel GetPerfLevel() { return (PerfLevel)perf_flags.perf_level; } } // namespace rocksdb diff --git a/util/file_reader_writer.cc b/util/file_reader_writer.cc index adbe111e875..e74369e3f1d 100644 --- a/util/file_reader_writer.cc +++ b/util/file_reader_writer.cc @@ -14,6 +14,7 @@ #include "monitoring/histogram.h" #include "monitoring/iostats_context_imp.h" +#include "monitoring/perf_flags_imp.h" #include "port/port.h" #include "test_util/sync_point.h" #include "util/random.h" @@ -76,8 +77,8 @@ Status RandomAccessFileReader::Read(uint64_t offset, size_t n, Slice* result, { StopWatch sw(env_, stats_, hist_type_, (stats_ != nullptr) ? &elapsed : nullptr, true /*overwrite*/, - true /*delay_enabled*/); - auto prev_perf_level = GetPerfLevel(); + true /*delay_enabled*/); + auto prev_perf_flags = GetPerfFlags(); IOSTATS_TIMER_GUARD(read_nanos); if (use_direct_io()) { #ifndef ROCKSDB_LITE @@ -183,7 +184,7 @@ Status RandomAccessFileReader::Read(uint64_t offset, size_t n, Slice* result, *result = Slice(res_scratch, s.ok() ? pos : 0); } IOSTATS_ADD_IF_POSITIVE(bytes_read, result->size()); - SetPerfLevel(prev_perf_level); + SetPerfFlags(prev_perf_flags); } if (stats_ != nullptr && file_read_hist_ != nullptr) { file_read_hist_->Add(elapsed); @@ -200,19 +201,20 @@ Status RandomAccessFileReader::MultiRead(ReadRequest* read_reqs, { StopWatch sw(env_, stats_, hist_type_, (stats_ != nullptr) ? &elapsed : nullptr, true /*overwrite*/, - true /*delay_enabled*/); - auto prev_perf_level = GetPerfLevel(); + true /*delay_enabled*/); + // auto prev_perf_level = GetPerfLevel(); + auto prev_perf_flags = GetPerfFlags(); IOSTATS_TIMER_GUARD(read_nanos); #ifndef ROCKSDB_LITE - FileOperationInfo::TimePoint start_ts; - if (ShouldNotifyListeners()) { - start_ts = std::chrono::system_clock::now(); - } -#endif // ROCKSDB_LITE - { - IOSTATS_CPU_TIMER_GUARD(cpu_read_nanos, env_); - s = file_->MultiRead(read_reqs, num_reqs); + FileOperationInfo::TimePoint start_ts; + if (ShouldNotifyListeners()) { + start_ts = std::chrono::system_clock::now(); + } +#endif // ROCKSDB_LITE + { + IOSTATS_CPU_TIMER_GUARD(cpu_read_nanos, env_); + s = file_->MultiRead(read_reqs, num_reqs); } for (size_t i = 0; i < num_reqs; ++i) { #ifndef ROCKSDB_LITE @@ -225,7 +227,7 @@ Status RandomAccessFileReader::MultiRead(ReadRequest* read_reqs, #endif // ROCKSDB_LITE IOSTATS_ADD_IF_POSITIVE(bytes_read, read_reqs[i].result.size()); } - SetPerfLevel(prev_perf_level); + SetPerfFlags(prev_perf_flags); } if (stats_ != nullptr && file_read_hist_ != nullptr) { file_read_hist_->Add(elapsed); @@ -460,14 +462,16 @@ Status WritableFileWriter::SyncInternal(bool use_fsync) { Status s; IOSTATS_TIMER_GUARD(fsync_nanos); TEST_SYNC_POINT("WritableFileWriter::SyncInternal:0"); - auto prev_perf_level = GetPerfLevel(); + // auto prev_perf_level = GetPerfLevel(); + auto prev_perf_flags = GetPerfFlags(); IOSTATS_CPU_TIMER_GUARD(cpu_write_nanos, env_); if (use_fsync) { s = writable_file_->Fsync(); } else { s = writable_file_->Sync(); } - SetPerfLevel(prev_perf_level); + // SetPerfLevel(prev_perf_level); + SetPerfFlags(prev_perf_flags); return s; } @@ -508,10 +512,11 @@ Status WritableFileWriter::WriteBuffered(const char* data, size_t size) { } #endif { - auto prev_perf_level = GetPerfLevel(); + // auto prev_perf_level = GetPerfLevel(); + auto prev_perf_flags = GetPerfFlags(); IOSTATS_CPU_TIMER_GUARD(cpu_write_nanos, env_); s = writable_file_->Append(Slice(src, allowed)); - SetPerfLevel(prev_perf_level); + SetPerfFlags(prev_perf_flags); } #ifndef ROCKSDB_LITE if (ShouldNotifyListeners()) { From b5485ab5c3a6a4e027c8f1c5d732711d83d12880 Mon Sep 17 00:00:00 2001 From: lemonhx Date: Fri, 26 Mar 2021 18:02:46 +0800 Subject: [PATCH 5/9] The data structure has been adjusted to make FFI more friendly. At the same time, it has the ability to adjust using BitMask, speeds up initialization, reduces unnecessary macros, and is compatible with PerfLevel's Get and Set. PerfLevel Get will now return an estimated PerfLevel instead of an accurate one. --- include/rocksdb/perf_flags.h | 129 +++++++++++++++++++---------------- include/rocksdb/perf_level.h | 5 +- monitoring/perf_flags.cc | 2 +- monitoring/perf_flags_imp.h | 4 -- monitoring/perf_level.cc | 29 ++++---- 5 files changed, 90 insertions(+), 79 deletions(-) diff --git a/include/rocksdb/perf_flags.h b/include/rocksdb/perf_flags.h index 5e11e3da6f2..78645e99d27 100644 --- a/include/rocksdb/perf_flags.h +++ b/include/rocksdb/perf_flags.h @@ -31,66 +31,79 @@ struct PerfFlags { uint8_t enable_bloom_sst_miss_count_bit : 1; // 2 uint8_t enable_key_lock_wait_count_bit : 1; // 2 - // flag enable for using cpu time prob useless in TiKV port - uint8_t enable_measure_cpu_time_bit : 1; // 3 -> with CPU time flag + union { + struct { + uint8_t enable_measure_cpu_time_bit : 1; // 3 + uint8_t enable_block_read_time_bit : 1; // 3 + uint8_t enable_block_checksum_time_bit : 1; // 3 + uint8_t enable_block_decompress_time_bit : 1; // 3 + uint8_t enable_get_snapshot_time_bit : 1; // 3 + uint8_t enable_get_from_memtable_time_bit : 1; // 3 + uint8_t enable_get_post_process_time_bit : 1; // 3 + uint8_t enable_get_from_output_files_time_bit : 1; // 3 + uint8_t enable_seek_on_memtable_time_bit : 1; // 3 + uint8_t enable_seek_child_seek_time_bit : 1; // 3 + uint8_t enable_seek_min_heap_time_bit : 1; // 3 + uint8_t enable_seek_max_heap_time_bit : 1; // 3 + uint8_t enable_seek_internal_seek_time_bit : 1; // 3 + uint8_t enable_find_next_user_entry_time_bit : 1; // 3 + uint8_t enable_write_wal_time_bit : 1; // 3 + uint8_t enable_write_memtable_time_bit : 1; // 3 + uint8_t enable_write_delay_time_bit : 1; // 3 + uint8_t enable_write_scheduling_flushes_compactions_time_bit : 1; // 3 + uint8_t enable_write_pre_and_post_process_time_bit : 1; // 3 + uint8_t enable_write_thread_wait_nanos_bit : 1; // 3 + uint8_t enable_merge_operator_time_nanos_bit : 1; // 3 + uint8_t enable_read_index_block_nanos_bit : 1; // 3 + uint8_t enable_read_filter_block_nanos_bit : 1; // 3 + uint8_t enable_new_table_block_iter_nanos_bit : 1; // 3 + uint8_t enable_new_table_iterator_nanos_bit : 1; // 3 + uint8_t enable_block_seek_nanos_bit : 1; // 3 + uint8_t enable_find_table_nanos_bit : 1; // 3 + uint8_t enable_key_lock_wait_time_bit : 1; // 3 + uint8_t enable_env_new_sequential_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_random_access_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_writable_file_nanos_bit : 1; // 3 + uint8_t enable_env_reuse_writable_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_random_rw_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_directory_nanos_bit : 1; // 3 + uint8_t enable_env_file_exists_nanos_bit : 1; // 3 + uint8_t enable_env_get_children_nanos_bit : 1; // 3 + uint8_t enable_env_get_children_file_attributes_nanos_bit : 1; // 3 + uint8_t enable_env_delete_file_nanos_bit : 1; // 3 + uint8_t enable_env_create_dir_nanos_bit : 1; // 3 + uint8_t enable_env_create_dir_if_missing_nanos_bit : 1; // 3 + uint8_t enable_env_delete_dir_nanos_bit : 1; // 3 + uint8_t enable_env_get_file_size_nanos_bit : 1; // 3 + uint8_t enable_env_get_file_modification_time_nanos_bit : 1; // 3 + uint8_t enable_env_rename_file_nanos_bit : 1; // 3 + uint8_t enable_env_link_file_nanos_bit : 1; // 3 + uint8_t enable_env_lock_file_nanos_bit : 1; // 3 + uint8_t enable_env_unlock_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_logger_nanos_bit : 1; // 3 + uint8_t enable_encrypt_data_nanos_bit : 1; // 3 + uint8_t enable_decrypt_data_nanos_bit : 1; // 3 + }; + uint64_t level3_by_mask; + }; - uint8_t enable_block_read_time_bit : 1; // 3 - uint8_t enable_block_checksum_time_bit : 1; // 3 - uint8_t enable_block_decompress_time_bit : 1; // 3 - uint8_t enable_get_snapshot_time_bit : 1; // 3 - uint8_t enable_get_from_memtable_time_bit : 1; // 3 - uint8_t enable_get_post_process_time_bit : 1; // 3 - uint8_t enable_get_from_output_files_time_bit : 1; // 3 - uint8_t enable_seek_on_memtable_time_bit : 1; // 3 - uint8_t enable_seek_child_seek_time_bit : 1; // 3 - uint8_t enable_seek_min_heap_time_bit : 1; // 3 - uint8_t enable_seek_max_heap_time_bit : 1; // 3 - uint8_t enable_seek_internal_seek_time_bit : 1; // 3 - uint8_t enable_find_next_user_entry_time_bit : 1; // 3 - uint8_t enable_write_wal_time_bit : 1; // 3 - uint8_t enable_write_memtable_time_bit : 1; // 3 - uint8_t enable_write_delay_time_bit : 1; // 3 - uint8_t enable_write_scheduling_flushes_compactions_time_bit : 1; // 3 - uint8_t enable_write_pre_and_post_process_time_bit : 1; // 3 - uint8_t enable_write_thread_wait_nanos_bit : 1; // 3 - uint8_t enable_merge_operator_time_nanos_bit : 1; // 3 - uint8_t enable_read_index_block_nanos_bit : 1; // 3 - uint8_t enable_read_filter_block_nanos_bit : 1; // 3 - uint8_t enable_new_table_block_iter_nanos_bit : 1; // 3 - uint8_t enable_new_table_iterator_nanos_bit : 1; // 3 - uint8_t enable_block_seek_nanos_bit : 1; // 3 - uint8_t enable_find_table_nanos_bit : 1; // 3 - uint8_t enable_key_lock_wait_time_bit : 1; // 3 - uint8_t enable_env_new_sequential_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_random_access_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_writable_file_nanos_bit : 1; // 3 - uint8_t enable_env_reuse_writable_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_random_rw_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_directory_nanos_bit : 1; // 3 - uint8_t enable_env_file_exists_nanos_bit : 1; // 3 - uint8_t enable_env_get_children_nanos_bit : 1; // 3 - uint8_t enable_env_get_children_file_attributes_nanos_bit : 1; // 3 - uint8_t enable_env_delete_file_nanos_bit : 1; // 3 - uint8_t enable_env_create_dir_nanos_bit : 1; // 3 - uint8_t enable_env_create_dir_if_missing_nanos_bit : 1; // 3 - uint8_t enable_env_delete_dir_nanos_bit : 1; // 3 - uint8_t enable_env_get_file_size_nanos_bit : 1; // 3 - uint8_t enable_env_get_file_modification_time_nanos_bit : 1; // 3 - uint8_t enable_env_rename_file_nanos_bit : 1; // 3 - uint8_t enable_env_link_file_nanos_bit : 1; // 3 - uint8_t enable_env_lock_file_nanos_bit : 1; // 3 - uint8_t enable_env_unlock_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_logger_nanos_bit : 1; // 3 - uint8_t enable_encrypt_data_nanos_bit : 1; // 3 - uint8_t enable_decrypt_data_nanos_bit : 1; // 3 + union { + struct { + uint8_t enable_get_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_next_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_prev_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_seek_cpu_nanos_bit : 1; // 4 + }; + uint16_t level4_by_mask; + }; - uint8_t enable_get_cpu_nanos_bit : 1; // 4 - uint8_t enable_iter_next_cpu_nanos_bit : 1; // 4 - uint8_t enable_iter_prev_cpu_nanos_bit : 1; // 4 - uint8_t enable_iter_seek_cpu_nanos_bit : 1; // 4 - - uint8_t enable_db_mutex_lock_nanos_bit : 1; // 5 - uint8_t enable_db_condition_wait_nanos_bit : 1; // 5 + union { + struct { + uint8_t enable_db_mutex_lock_nanos_bit : 1; // 5 + uint8_t enable_db_condition_wait_nanos_bit : 1; // 5 + }; + uint8_t level5_by_mask; + }; }; // set the perf stats bitfield for current thread diff --git a/include/rocksdb/perf_level.h b/include/rocksdb/perf_level.h index d6d4065af3c..01fe0ff5e4c 100644 --- a/include/rocksdb/perf_level.h +++ b/include/rocksdb/perf_level.h @@ -25,10 +25,9 @@ enum PerfLevel : unsigned char { }; // set the perf stats level for current thread -//[[deprecated("Please use SetPerfFlags")]] void SetPerfLevel(PerfLevel level); -// get current perf stats level for current thread -[[deprecated("Please use GetPerfFlags")]] PerfLevel GetPerfLevel(); +// get current estimated perf stats level for current thread +PerfLevel GetPerfLevel(); } // namespace rocksdb diff --git a/monitoring/perf_flags.cc b/monitoring/perf_flags.cc index 42a8a02a3e6..49226b7a507 100644 --- a/monitoring/perf_flags.cc +++ b/monitoring/perf_flags.cc @@ -99,7 +99,7 @@ const PerfFlags PerfFlagsEnableTime = { #ifdef ROCKSDB_SUPPORT_THREAD_LOCAL // TODO: support original Perf Level -__thread PerfFlags perf_flags = PerfFlagsEnableCount; +__thread PerfFlags perf_flags = {.level2_by_mask = (uint64_t)-1}; #else PerfFlags perf_flags = PerfFlagsEnableCount; #endif diff --git a/monitoring/perf_flags_imp.h b/monitoring/perf_flags_imp.h index 16c6421bcb3..a5d50fe774a 100644 --- a/monitoring/perf_flags_imp.h +++ b/monitoring/perf_flags_imp.h @@ -8,10 +8,6 @@ extern __thread PerfFlags perf_flags; #else extern PerfLevelByPerfFlags perf_flags; #endif -extern const PerfFlags PerfFlagsEnableCount; -extern const PerfFlags PerfFlagsEnableTimeExceptForMutex; -extern const PerfFlags PerfFlagsEnableTimeAndCPUTimeExceptForMutex; -extern const PerfFlags PerfFlagsEnableTime; } // namespace rocksdb diff --git a/monitoring/perf_level.cc b/monitoring/perf_level.cc index b93766db6f6..e30815ef76f 100644 --- a/monitoring/perf_level.cc +++ b/monitoring/perf_level.cc @@ -17,25 +17,28 @@ void SetPerfLevel(PerfLevel level) { assert(level > kUninitialized); assert(level < kOutOfBounds); switch (level) { - case kEnableCount: - perf_flags = PerfFlagsEnableCount; - break; - case kEnableTimeExceptForMutex: - perf_flags = PerfFlagsEnableTimeExceptForMutex; - break; - case kEnableTimeAndCPUTimeExceptForMutex: - perf_flags = PerfFlagsEnableTimeAndCPUTimeExceptForMutex; - break; case kEnableTime: - perf_flags = PerfFlagsEnableTime; - break; + perf_flags.level5_by_mask = -1; + case kEnableTimeAndCPUTimeExceptForMutex: + perf_flags.level4_by_mask = -1; + case kEnableTimeExceptForMutex: + perf_flags.level3_by_mask = -1; + case kEnableCount: + perf_flags.level2_by_mask = -1; + return; default: perf_flags = {}; break; } // perf_flags.perf_level = level; } - -// PerfLevel GetPerfLevel() { return (PerfLevel)perf_flags.perf_level; } +// get the estimated perf level +PerfLevel GetPerfLevel() { + if (perf_flags.level5_by_mask != 0) return (PerfLevel)5; + if (perf_flags.level4_by_mask != 0) return (PerfLevel)4; + if (perf_flags.level3_by_mask != 0) return (PerfLevel)3; + if (perf_flags.level2_by_mask != 0) return (PerfLevel)2; + return PerfLevel::kDisable; +} } // namespace rocksdb From c28cf61a94b70f9bfb0a9d4930684e59eb14e3e2 Mon Sep 17 00:00:00 2001 From: lemonhx Date: Mon, 29 Mar 2021 13:54:21 +0800 Subject: [PATCH 6/9] Add FFI and restore the previous test cases and restore previous modified code. --- db/c.cc | 18 ++++++-- db/compaction/compaction_job.cc | 4 +- db/db_iter_test.cc | 10 +++-- db/db_properties_test.cc | 4 +- db/flush_job.cc | 4 +- db/version_set.cc | 4 +- include/rocksdb/c.h | 4 ++ include/rocksdb/perf_context.h | 3 +- include/rocksdb/perf_flags.h | 10 ++--- monitoring/perf_flags.cc | 80 +-------------------------------- monitoring/perf_flags_imp.h | 2 - util/file_reader_writer.cc | 3 -- 12 files changed, 41 insertions(+), 105 deletions(-) diff --git a/db/c.cc b/db/c.cc index 4fe556c3063..47ccf8a9857 100644 --- a/db/c.cc +++ b/db/c.cc @@ -113,8 +113,9 @@ using rocksdb::Transaction; using rocksdb::Checkpoint; using rocksdb::TransactionLogIterator; using rocksdb::BatchResult; -using rocksdb::PerfLevel; -using rocksdb::PerfContext; +using rocksdb::WritableFile; +using rocksdb::WriteBatch; +using rocksdb::WriteBatchWithIndex; using rocksdb::MemoryUtil; using std::shared_ptr; @@ -2740,7 +2741,7 @@ rocksdb_ratelimiter_t* rocksdb_writeampbasedratelimiter_create( return rate_limiter; } -void rocksdb_ratelimiter_destroy(rocksdb_ratelimiter_t *limiter) { +void rocksdb_ratelimiter_destroy(rocksdb_ratelimiter_t* limiter) { delete limiter; } @@ -2749,8 +2750,17 @@ void rocksdb_set_perf_level(int v) { SetPerfLevel(level); } +void rocksdb_set_perf_flags_by_mask(uint64_t level2, uint64_t level3, + uint8_t level4, uint8_t level5) { + PerfFlags flags = {.level2_by_mask = level2, + .level3_by_mask = level3, + .level4_by_mask = level4, + .level5_by_mask = level5}; + SetPerfFlags(flags); +} + rocksdb_perfcontext_t* rocksdb_perfcontext_create() { - rocksdb_perfcontext_t* context = new rocksdb_perfcontext_t; + auto* context = new rocksdb_perfcontext_t; context->rep = rocksdb::get_perf_context(); return context; } diff --git a/db/compaction/compaction_job.cc b/db/compaction/compaction_job.cc index 69e1e528f09..452621cf7f9 100644 --- a/db/compaction/compaction_job.cc +++ b/db/compaction/compaction_job.cc @@ -867,8 +867,8 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) { uint64_t prev_cpu_write_nanos = 0; uint64_t prev_cpu_read_nanos = 0; if (measure_io_stats_) { - // prev_perf_level = GetPerfLevel(); - // SetPerfLevel(PerfLevel::kEnableTimeAndCPUTimeExceptForMutex); + prev_perf_level = GetPerfLevel(); + SetPerfLevel(PerfLevel::kEnableTimeAndCPUTimeExceptForMutex); prev_write_nanos = IOSTATS(write_nanos); prev_fsync_nanos = IOSTATS(fsync_nanos); prev_range_sync_nanos = IOSTATS(range_sync_nanos); diff --git a/db/db_iter_test.cc b/db/db_iter_test.cc index 9d87211d4fd..d435f487f3e 100644 --- a/db/db_iter_test.cc +++ b/db/db_iter_test.cc @@ -414,13 +414,14 @@ TEST_F(DBIteratorTest, DBIteratorPrevNext) { nullptr /*read_callback*/)); SetPerfLevel(kEnableCount); - // ASSERT_TRUE(GetPerfLevel() == kEnableCount); + ASSERT_TRUE(GetPerfLevel() == kEnableCount); get_perf_context()->Reset(); db_iter->SeekToLast(); ASSERT_TRUE(db_iter->Valid()); - ASSERT_EQ(static_cast(get_perf_context()->internal_key_skipped_count), 1); + ASSERT_EQ(static_cast(get_perf_context()->internal_key_skipped_count), + 1); ASSERT_EQ(db_iter->key().ToString(), "b"); SetPerfLevel(kDisable); @@ -537,13 +538,14 @@ TEST_F(DBIteratorTest, DBIteratorPrevNext) { nullptr /*read_callback*/)); SetPerfLevel(kEnableCount); - // ASSERT_TRUE(GetPerfLevel() == kEnableCount); + ASSERT_TRUE(GetPerfLevel() == kEnableCount); get_perf_context()->Reset(); db_iter->SeekToLast(); ASSERT_TRUE(db_iter->Valid()); - ASSERT_EQ(static_cast(get_perf_context()->internal_delete_skipped_count), 0); + ASSERT_EQ( + static_cast(get_perf_context()->internal_delete_skipped_count), 0); ASSERT_EQ(db_iter->key().ToString(), "b"); SetPerfLevel(kDisable); diff --git a/db/db_properties_test.cc b/db/db_properties_test.cc index 6deaaf187c8..f271f5a8d68 100644 --- a/db/db_properties_test.cc +++ b/db/db_properties_test.cc @@ -626,7 +626,7 @@ TEST_F(DBPropertiesTest, NumImmutableMemTable) { std::string num; uint64_t value; SetPerfLevel(kEnableTime); - // ASSERT_TRUE(GetPerfLevel() == kEnableTime); + ASSERT_TRUE(GetPerfLevel() == kEnableTime); ASSERT_OK(dbfull()->Put(writeOpt, handles_[1], "k1", big_value)); ASSERT_TRUE(dbfull()->GetProperty(handles_[1], @@ -724,7 +724,7 @@ TEST_F(DBPropertiesTest, NumImmutableMemTable) { ASSERT_EQ(int_num, base_total_size + 1); SetPerfLevel(kDisable); - // ASSERT_TRUE(GetPerfLevel() == kDisable); + ASSERT_TRUE(GetPerfLevel() == kDisable); } while (ChangeCompactOptions()); } diff --git a/db/flush_job.cc b/db/flush_job.cc index 804f6a4fc18..716e21e9749 100644 --- a/db/flush_job.cc +++ b/db/flush_job.cc @@ -212,8 +212,8 @@ Status FlushJob::Run(LogsWithPrepTracker* prep_tracker, uint64_t prev_cpu_write_nanos = 0; uint64_t prev_cpu_read_nanos = 0; if (measure_io_stats_) { - // prev_perf_level = GetPerfLevel(); - // SetPerfLevel(PerfLevel::kEnableTime); + prev_perf_level = GetPerfLevel(); + SetPerfLevel(PerfLevel::kEnableTime); prev_write_nanos = IOSTATS(write_nanos); prev_fsync_nanos = IOSTATS(fsync_nanos); prev_range_sync_nanos = IOSTATS(range_sync_nanos); diff --git a/db/version_set.cc b/db/version_set.cc index 80dacef1725..736240278d7 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -1697,7 +1697,7 @@ void Version::Get(const ReadOptions& read_options, const LookupKey& k, } bool timer_enabled = - // GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex && + GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex && get_perf_context()->per_level_perf_context_enabled; StopWatchNano timer(env_, timer_enabled /* auto_start */); *status = table_cache_->Get( @@ -1843,7 +1843,7 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range, while (f != nullptr) { MultiGetRange file_range = fp.CurrentFileRange(); bool timer_enabled = - // GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex && + GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex && get_perf_context()->per_level_perf_context_enabled; StopWatchNano timer(env_, timer_enabled /* auto_start */); Status s = table_cache_->MultiGet( diff --git a/include/rocksdb/c.h b/include/rocksdb/c.h index f21dbcf7d4a..c377b5fbc64 100644 --- a/include/rocksdb/c.h +++ b/include/rocksdb/c.h @@ -1120,6 +1120,10 @@ enum { }; extern ROCKSDB_LIBRARY_API void rocksdb_set_perf_level(int); +extern ROCKSDB_LIBRARY_API void rocksdb_set_perf_flags_by_mask(uint64_t level2, + uint64_t level3, + uint8_t level4, + uint8_t level5); extern ROCKSDB_LIBRARY_API rocksdb_perfcontext_t* rocksdb_perfcontext_create(); extern ROCKSDB_LIBRARY_API void rocksdb_perfcontext_reset( rocksdb_perfcontext_t* context); diff --git a/include/rocksdb/perf_context.h b/include/rocksdb/perf_context.h index 755fdcd6d0c..f11727fea2f 100644 --- a/include/rocksdb/perf_context.h +++ b/include/rocksdb/perf_context.h @@ -6,11 +6,12 @@ #pragma once #include + #include #include +#include "rocksdb/perf_flags.h" #include "rocksdb/perf_level.h" - namespace rocksdb { // A thread local context for gathering performance counter efficiently diff --git a/include/rocksdb/perf_flags.h b/include/rocksdb/perf_flags.h index 78645e99d27..14625f47249 100644 --- a/include/rocksdb/perf_flags.h +++ b/include/rocksdb/perf_flags.h @@ -86,7 +86,7 @@ struct PerfFlags { }; uint64_t level3_by_mask; }; - + // represent original Level 4 union { struct { uint8_t enable_get_cpu_nanos_bit : 1; // 4 @@ -94,9 +94,9 @@ struct PerfFlags { uint8_t enable_iter_prev_cpu_nanos_bit : 1; // 4 uint8_t enable_iter_seek_cpu_nanos_bit : 1; // 4 }; - uint16_t level4_by_mask; + uint8_t level4_by_mask; }; - + // represent original Level 5 union { struct { uint8_t enable_db_mutex_lock_nanos_bit : 1; // 5 @@ -106,10 +106,10 @@ struct PerfFlags { }; }; -// set the perf stats bitfield for current thread +// set the perf flags for current thread void SetPerfFlags(PerfFlags pbf); -// get current perf stats bitfield for current thread +// get current perf flags for current thread PerfFlags GetPerfFlags(); } // namespace rocksdb diff --git a/monitoring/perf_flags.cc b/monitoring/perf_flags.cc index 49226b7a507..d8aaded323e 100644 --- a/monitoring/perf_flags.cc +++ b/monitoring/perf_flags.cc @@ -1,78 +1,4 @@ #include "monitoring/perf_flags_imp.h" - -#ifndef PERF_FLAGS_ENABLE_COUNT -#define PERF_FLAGS_ENABLE_COUNT \ - .enable_user_key_comparison_count_bit = 1, \ - .enable_block_cache_hit_count_bit = 1, .enable_block_read_count_bit = 1, \ - .enable_block_read_byte_bit = 1, \ - .enable_block_cache_index_hit_count_bit = 1, \ - .enable_index_block_read_count_bit = 1, \ - .enable_block_cache_filter_hit_count_bit = 1, \ - .enable_filter_block_read_count_bit = 1, \ - .enable_compression_dict_block_read_count_bit = 1, \ - .enable_get_read_bytes_bit = 1, .enable_multiget_read_bytes_bit = 1, \ - .enable_iter_read_bytes_bit = 1, .enable_internal_key_skipped_count_bit = 1, \ - .enable_internal_delete_skipped_count_bit = 1, \ - .enable_internal_recent_skipped_count_bit = 1, \ - .enable_internal_merge_count_bit = 1, \ - .enable_get_from_memtable_count_bit = 1, \ - .enable_seek_on_memtable_count_bit = 1, \ - .enable_next_on_memtable_count_bit = 1, \ - .enable_prev_on_memtable_count_bit = 1, \ - .enable_seek_child_seek_count_bit = 1, \ - .enable_bloom_memtable_hit_count_bit = 1, \ - .enable_bloom_memtable_miss_count_bit = 1, \ - .enable_bloom_sst_hit_count_bit = 1, .enable_bloom_sst_miss_count_bit = 1, \ - .enable_key_lock_wait_count_bit = 1 -#endif - -#ifndef PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX -#define PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX \ - .enable_block_read_time_bit = 1, .enable_block_checksum_time_bit = 1, \ - .enable_block_decompress_time_bit = 1, .enable_get_snapshot_time_bit = 1, \ - .enable_get_from_memtable_time_bit = 1, \ - .enable_get_post_process_time_bit = 1, \ - .enable_get_from_output_files_time_bit = 1, \ - .enable_seek_on_memtable_time_bit = 1, .enable_seek_child_seek_time_bit = 1, \ - .enable_seek_min_heap_time_bit = 1, .enable_seek_max_heap_time_bit = 1, \ - .enable_seek_internal_seek_time_bit = 1, \ - .enable_find_next_user_entry_time_bit = 1, .enable_write_wal_time_bit = 1, \ - .enable_write_memtable_time_bit = 1, .enable_write_delay_time_bit = 1, \ - .enable_write_scheduling_flushes_compactions_time_bit = 1, \ - .enable_write_pre_and_post_process_time_bit = 1, \ - .enable_write_thread_wait_nanos_bit = 1, \ - .enable_merge_operator_time_nanos_bit = 1, \ - .enable_read_index_block_nanos_bit = 1, \ - .enable_read_filter_block_nanos_bit = 1, \ - .enable_new_table_block_iter_nanos_bit = 1, \ - .enable_new_table_iterator_nanos_bit = 1, .enable_block_seek_nanos_bit = 1, \ - .enable_find_table_nanos_bit = 1, .enable_key_lock_wait_time_bit = 1, \ - .enable_env_new_sequential_file_nanos_bit = 1, \ - .enable_env_new_random_access_file_nanos_bit = 1, \ - .enable_env_new_writable_file_nanos_bit = 1, \ - .enable_env_reuse_writable_file_nanos_bit = 1, \ - .enable_env_new_random_rw_file_nanos_bit = 1, \ - .enable_env_new_directory_nanos_bit = 1, \ - .enable_env_file_exists_nanos_bit = 1, \ - .enable_env_get_children_nanos_bit = 1, \ - .enable_env_get_children_file_attributes_nanos_bit = 1, \ - .enable_env_delete_file_nanos_bit = 1, .enable_env_create_dir_nanos_bit = 1, \ - .enable_env_create_dir_if_missing_nanos_bit = 1, \ - .enable_env_delete_dir_nanos_bit = 1, \ - .enable_env_get_file_size_nanos_bit = 1, \ - .enable_env_get_file_modification_time_nanos_bit = 1, \ - .enable_env_rename_file_nanos_bit = 1, .enable_env_link_file_nanos_bit = 1, \ - .enable_env_lock_file_nanos_bit = 1, .enable_env_unlock_file_nanos_bit = 1, \ - .enable_env_new_logger_nanos_bit = 1, .enable_encrypt_data_nanos_bit = 1, \ - .enable_decrypt_data_nanos_bit = 1 -#endif - -#ifndef PERF_FLAGS_ENABLE_TIME_AND_CPU_TIME_EXCEPT_FOR_MUTEX -#define PERF_FLAGS_ENABLE_TIME_AND_CPU_TIME_EXCEPT_FOR_MUTEX \ - .enable_get_cpu_nanos_bit = 1, .enable_iter_next_cpu_nanos_bit = 1, \ - .enable_iter_prev_cpu_nanos_bit = 1, .enable_iter_seek_cpu_nanos_bit = 1 -#endif - namespace rocksdb { const PerfFlags PerfFlagsEnableCount = { // .perf_level = 2, @@ -96,16 +22,14 @@ const PerfFlags PerfFlagsEnableTime = { }; // set default value of perf_flags - #ifdef ROCKSDB_SUPPORT_THREAD_LOCAL -// TODO: support original Perf Level __thread PerfFlags perf_flags = {.level2_by_mask = (uint64_t)-1}; #else PerfFlags perf_flags = PerfFlagsEnableCount; #endif -// set the perf stats bitfield for current thread void SetPerfFlags(PerfFlags pbf) { perf_flags = pbf; } -// get current perf stats bitfield for current thread + PerfFlags GetPerfFlags() { return perf_flags; } + } // namespace rocksdb diff --git a/monitoring/perf_flags_imp.h b/monitoring/perf_flags_imp.h index a5d50fe774a..52ec389ab2d 100644 --- a/monitoring/perf_flags_imp.h +++ b/monitoring/perf_flags_imp.h @@ -10,5 +10,3 @@ extern PerfLevelByPerfFlags perf_flags; #endif } // namespace rocksdb - -#define BITFIELD_METRIC(metric) enable_##metric##_bit diff --git a/util/file_reader_writer.cc b/util/file_reader_writer.cc index e74369e3f1d..3c67760799b 100644 --- a/util/file_reader_writer.cc +++ b/util/file_reader_writer.cc @@ -202,7 +202,6 @@ Status RandomAccessFileReader::MultiRead(ReadRequest* read_reqs, StopWatch sw(env_, stats_, hist_type_, (stats_ != nullptr) ? &elapsed : nullptr, true /*overwrite*/, true /*delay_enabled*/); - // auto prev_perf_level = GetPerfLevel(); auto prev_perf_flags = GetPerfFlags(); IOSTATS_TIMER_GUARD(read_nanos); @@ -462,7 +461,6 @@ Status WritableFileWriter::SyncInternal(bool use_fsync) { Status s; IOSTATS_TIMER_GUARD(fsync_nanos); TEST_SYNC_POINT("WritableFileWriter::SyncInternal:0"); - // auto prev_perf_level = GetPerfLevel(); auto prev_perf_flags = GetPerfFlags(); IOSTATS_CPU_TIMER_GUARD(cpu_write_nanos, env_); if (use_fsync) { @@ -512,7 +510,6 @@ Status WritableFileWriter::WriteBuffered(const char* data, size_t size) { } #endif { - // auto prev_perf_level = GetPerfLevel(); auto prev_perf_flags = GetPerfFlags(); IOSTATS_CPU_TIMER_GUARD(cpu_write_nanos, env_); s = writable_file_->Append(Slice(src, allowed)); From a7357c3627f459e05bd1786a7f2b0d83afc59c42 Mon Sep 17 00:00:00 2001 From: LemonHX Date: Mon, 29 Mar 2021 13:59:12 +0800 Subject: [PATCH 7/9] git failed to diff this file for strage reason --- include/rocksdb/perf_flags.h | 60 ++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/include/rocksdb/perf_flags.h b/include/rocksdb/perf_flags.h index 14625f47249..d402fa40851 100644 --- a/include/rocksdb/perf_flags.h +++ b/include/rocksdb/perf_flags.h @@ -4,33 +4,39 @@ namespace rocksdb { struct PerfFlags { - uint8_t enable_user_key_comparison_count_bit : 1; // 2 - uint8_t enable_block_cache_hit_count_bit : 1; // 2 - uint8_t enable_block_read_count_bit : 1; // 2 - uint8_t enable_block_read_byte_bit : 1; // 2 - uint8_t enable_block_cache_index_hit_count_bit : 1; // 2 - uint8_t enable_index_block_read_count_bit : 1; // 2 - uint8_t enable_block_cache_filter_hit_count_bit : 1; // 2 - uint8_t enable_filter_block_read_count_bit : 1; // 2 - uint8_t enable_compression_dict_block_read_count_bit : 1; // 2 - uint8_t enable_get_read_bytes_bit : 1; // 2 - uint8_t enable_multiget_read_bytes_bit : 1; // 2 - uint8_t enable_iter_read_bytes_bit : 1; // 2 - uint8_t enable_internal_key_skipped_count_bit : 1; // 2 - uint8_t enable_internal_delete_skipped_count_bit : 1; // 2 - uint8_t enable_internal_recent_skipped_count_bit : 1; // 2 - uint8_t enable_internal_merge_count_bit : 1; // 2 - uint8_t enable_get_from_memtable_count_bit : 1; // 2 - uint8_t enable_seek_on_memtable_count_bit : 1; // 2 - uint8_t enable_next_on_memtable_count_bit : 1; // 2 - uint8_t enable_prev_on_memtable_count_bit : 1; // 2 - uint8_t enable_seek_child_seek_count_bit : 1; // 2 - uint8_t enable_bloom_memtable_hit_count_bit : 1; // 2 - uint8_t enable_bloom_memtable_miss_count_bit : 1; // 2 - uint8_t enable_bloom_sst_hit_count_bit : 1; // 2 - uint8_t enable_bloom_sst_miss_count_bit : 1; // 2 - uint8_t enable_key_lock_wait_count_bit : 1; // 2 - + // represent original Level 2 + union { + struct { + uint8_t enable_user_key_comparison_count_bit : 1; // 2 + uint8_t enable_block_cache_hit_count_bit : 1; // 2 + uint8_t enable_block_read_count_bit : 1; // 2 + uint8_t enable_block_read_byte_bit : 1; // 2 + uint8_t enable_block_cache_index_hit_count_bit : 1; // 2 + uint8_t enable_index_block_read_count_bit : 1; // 2 + uint8_t enable_block_cache_filter_hit_count_bit : 1; // 2 + uint8_t enable_filter_block_read_count_bit : 1; // 2 + uint8_t enable_compression_dict_block_read_count_bit : 1; // 2 + uint8_t enable_get_read_bytes_bit : 1; // 2 + uint8_t enable_multiget_read_bytes_bit : 1; // 2 + uint8_t enable_iter_read_bytes_bit : 1; // 2 + uint8_t enable_internal_key_skipped_count_bit : 1; // 2 + uint8_t enable_internal_delete_skipped_count_bit : 1; // 2 + uint8_t enable_internal_recent_skipped_count_bit : 1; // 2 + uint8_t enable_internal_merge_count_bit : 1; // 2 + uint8_t enable_get_from_memtable_count_bit : 1; // 2 + uint8_t enable_seek_on_memtable_count_bit : 1; // 2 + uint8_t enable_next_on_memtable_count_bit : 1; // 2 + uint8_t enable_prev_on_memtable_count_bit : 1; // 2 + uint8_t enable_seek_child_seek_count_bit : 1; // 2 + uint8_t enable_bloom_memtable_hit_count_bit : 1; // 2 + uint8_t enable_bloom_memtable_miss_count_bit : 1; // 2 + uint8_t enable_bloom_sst_hit_count_bit : 1; // 2 + uint8_t enable_bloom_sst_miss_count_bit : 1; // 2 + uint8_t enable_key_lock_wait_count_bit : 1; // 2 + }; + uint64_t level2_by_mask; + }; + // represent original Level 3 union { struct { uint8_t enable_measure_cpu_time_bit : 1; // 3 From d39adb21d5b55c67ee5660a21ccc63103a760745 Mon Sep 17 00:00:00 2001 From: lemonhx Date: Wed, 14 Apr 2021 08:25:41 +0000 Subject: [PATCH 8/9] rollback design --- CMakeLists.txt | 2 +- db/c.cc | 12 +- db/compaction/compaction_job.cc | 5 +- db/db_impl/db_impl.cc | 2 +- db/db_impl/db_impl_compaction_flush.cc | 3 +- db/db_iter.cc | 3 +- db/dbformat.cc | 4 +- db/dbformat.h | 2 + db/flush_job.cc | 3 +- db/perf_context_test.cc | 3 +- db/table_cache.cc | 1 - db/version_set.cc | 2 + include/rocksdb/c.h | 5 +- include/rocksdb/perf_flags.h | 197 +++++++++--------- include/rocksdb/perf_level.h | 3 +- monitoring/iostats_context_imp.h | 6 +- monitoring/perf_context.cc | 4 +- monitoring/perf_context_imp.h | 81 ++++--- monitoring/perf_flags.cc | 138 ++++++++++-- monitoring/perf_level.cc | 55 ++++- monitoring/perf_step_timer.h | 5 +- table/block_based/block.cc | 1 + table/block_based/block_based_filter_block.cc | 1 + table/block_based/block_based_table_reader.cc | 5 +- .../block_based/filter_block_reader_common.cc | 1 + .../block_based/uncompression_dict_reader.cc | 1 + table/get_context.cc | 1 + table/merging_iterator.cc | 2 + table/plain/plain_table_reader.cc | 9 +- tools/db_bench_tool.cc | 2 +- .../transactions/transaction_lock_mgr.cc | 3 +- 31 files changed, 341 insertions(+), 221 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f40d510a9f..9b06ea9eb6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -189,7 +189,7 @@ if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare -Wshadow -Wno-unused-parameter -Wno-unused-variable -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers -Wno-strict-aliasing") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare -Wshadow -Wno-unused-parameter -Wno-unused-variable -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers -Wno-strict-aliasing -w") if(MINGW) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format") add_definitions(-D_POSIX_C_SOURCE=1) diff --git a/db/c.cc b/db/c.cc index 47ccf8a9857..37d11e1a01f 100644 --- a/db/c.cc +++ b/db/c.cc @@ -47,6 +47,9 @@ #include #include +using rocksdb::PerfContext; +using rocksdb::PerfLevel; +using rocksdb::PerfFlags; using rocksdb::BytewiseComparator; using rocksdb::Cache; using rocksdb::ColumnFamilyDescriptor; @@ -2750,12 +2753,9 @@ void rocksdb_set_perf_level(int v) { SetPerfLevel(level); } -void rocksdb_set_perf_flags_by_mask(uint64_t level2, uint64_t level3, - uint8_t level4, uint8_t level5) { - PerfFlags flags = {.level2_by_mask = level2, - .level3_by_mask = level3, - .level4_by_mask = level4, - .level5_by_mask = level5}; +void rocksdb_set_perf_flags_by_mask(uint8_t* flags_bytes) { + PerfFlags flags; + memmove(&flags,flags_bytes,sizeof(PerfFlags)); SetPerfFlags(flags); } diff --git a/db/compaction/compaction_job.cc b/db/compaction/compaction_job.cc index 452621cf7f9..8f4ac48fa6b 100644 --- a/db/compaction/compaction_job.cc +++ b/db/compaction/compaction_job.cc @@ -7,8 +7,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. -#include +#include "db/compaction/compaction_job.h" + #include +#include #include #include #include @@ -19,7 +21,6 @@ #include #include "db/builder.h" -#include "db/compaction/compaction_job.h" #include "db/db_impl/db_impl.h" #include "db/db_iter.h" #include "db/dbformat.h" diff --git a/db/db_impl/db_impl.cc b/db/db_impl/db_impl.cc index 7caa3a3e4a4..24fa3b0daeb 100644 --- a/db/db_impl/db_impl.cc +++ b/db/db_impl/db_impl.cc @@ -33,9 +33,9 @@ #include "db/error_handler.h" #include "db/event_helpers.h" #include "db/external_sst_file_ingestion_job.h" -#include "db/import_column_family_job.h" #include "db/flush_job.h" #include "db/forward_iterator.h" +#include "db/import_column_family_job.h" #include "db/job_context.h" #include "db/log_reader.h" #include "db/log_writer.h" diff --git a/db/db_impl/db_impl_compaction_flush.cc b/db/db_impl/db_impl_compaction_flush.cc index ea5f9b15070..f7a009a0dd1 100644 --- a/db/db_impl/db_impl_compaction_flush.cc +++ b/db/db_impl/db_impl_compaction_flush.cc @@ -6,11 +6,10 @@ // Copyright (c) 2011 The LevelDB Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. -#include "db/db_impl/db_impl.h" - #include #include "db/builder.h" +#include "db/db_impl/db_impl.h" #include "db/error_handler.h" #include "db/event_helpers.h" #include "file/sst_file_manager_impl.h" diff --git a/db/db_iter.cc b/db/db_iter.cc index 10ce051515e..52db743682f 100644 --- a/db/db_iter.cc +++ b/db/db_iter.cc @@ -8,9 +8,10 @@ // found in the LICENSE file. See the AUTHORS file for names of contributors. #include "db/db_iter.h" -#include + #include #include +#include #include "db/dbformat.h" #include "db/merge_context.h" diff --git a/db/dbformat.cc b/db/dbformat.cc index 130ba4e8adf..b7d776786d2 100644 --- a/db/dbformat.cc +++ b/db/dbformat.cc @@ -8,8 +8,10 @@ // found in the LICENSE file. See the AUTHORS file for names of contributors. #include "db/dbformat.h" -#include #include + +#include + #include "monitoring/perf_context_imp.h" #include "port/port.h" #include "util/coding.h" diff --git a/db/dbformat.h b/db/dbformat.h index 1d9b7ef7e3f..8370313e3ad 100644 --- a/db/dbformat.h +++ b/db/dbformat.h @@ -9,9 +9,11 @@ #pragma once #include + #include #include #include + #include "db/lookup_key.h" #include "db/merge_context.h" #include "logging/logging.h" diff --git a/db/flush_job.cc b/db/flush_job.cc index 716e21e9749..16800a83413 100644 --- a/db/flush_job.cc +++ b/db/flush_job.cc @@ -9,9 +9,8 @@ #include "db/flush_job.h" -#include - #include +#include #include #include "db/builder.h" diff --git a/db/perf_context_test.cc b/db/perf_context_test.cc index 94eabff7ff5..6456d3b985f 100644 --- a/db/perf_context_test.cc +++ b/db/perf_context_test.cc @@ -3,6 +3,8 @@ // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). // +#include "rocksdb/perf_context.h" + #include #include #include @@ -15,7 +17,6 @@ #include "port/port.h" #include "rocksdb/db.h" #include "rocksdb/memtablerep.h" -#include "rocksdb/perf_context.h" #include "rocksdb/slice_transform.h" #include "test_util/testharness.h" #include "util/stop_watch.h" diff --git a/db/table_cache.cc b/db/table_cache.cc index bc2cce0e43b..94989373862 100644 --- a/db/table_cache.cc +++ b/db/table_cache.cc @@ -14,7 +14,6 @@ #include "db/snapshot_impl.h" #include "db/version_edit.h" #include "file/filename.h" - #include "monitoring/perf_context_imp.h" #include "rocksdb/statistics.h" #include "table/block_based/block_based_table_reader.h" diff --git a/db/version_set.cc b/db/version_set.cc index 736240278d7..c8408d0b53d 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -10,6 +10,7 @@ #include "db/version_set.h" #include + #include #include #include @@ -19,6 +20,7 @@ #include #include #include + #include "compaction/compaction.h" #include "db/internal_stats.h" #include "db/log_reader.h" diff --git a/include/rocksdb/c.h b/include/rocksdb/c.h index c377b5fbc64..15ed853389a 100644 --- a/include/rocksdb/c.h +++ b/include/rocksdb/c.h @@ -1120,10 +1120,7 @@ enum { }; extern ROCKSDB_LIBRARY_API void rocksdb_set_perf_level(int); -extern ROCKSDB_LIBRARY_API void rocksdb_set_perf_flags_by_mask(uint64_t level2, - uint64_t level3, - uint8_t level4, - uint8_t level5); +extern ROCKSDB_LIBRARY_API void rocksdb_set_perf_flags_by_mask(uint8_t* flags_bytes); extern ROCKSDB_LIBRARY_API rocksdb_perfcontext_t* rocksdb_perfcontext_create(); extern ROCKSDB_LIBRARY_API void rocksdb_perfcontext_reset( rocksdb_perfcontext_t* context); diff --git a/include/rocksdb/perf_flags.h b/include/rocksdb/perf_flags.h index d402fa40851..4fcd7bb47b6 100644 --- a/include/rocksdb/perf_flags.h +++ b/include/rocksdb/perf_flags.h @@ -2,116 +2,105 @@ #include namespace rocksdb { - struct PerfFlags { // represent original Level 2 - union { - struct { - uint8_t enable_user_key_comparison_count_bit : 1; // 2 - uint8_t enable_block_cache_hit_count_bit : 1; // 2 - uint8_t enable_block_read_count_bit : 1; // 2 - uint8_t enable_block_read_byte_bit : 1; // 2 - uint8_t enable_block_cache_index_hit_count_bit : 1; // 2 - uint8_t enable_index_block_read_count_bit : 1; // 2 - uint8_t enable_block_cache_filter_hit_count_bit : 1; // 2 - uint8_t enable_filter_block_read_count_bit : 1; // 2 - uint8_t enable_compression_dict_block_read_count_bit : 1; // 2 - uint8_t enable_get_read_bytes_bit : 1; // 2 - uint8_t enable_multiget_read_bytes_bit : 1; // 2 - uint8_t enable_iter_read_bytes_bit : 1; // 2 - uint8_t enable_internal_key_skipped_count_bit : 1; // 2 - uint8_t enable_internal_delete_skipped_count_bit : 1; // 2 - uint8_t enable_internal_recent_skipped_count_bit : 1; // 2 - uint8_t enable_internal_merge_count_bit : 1; // 2 - uint8_t enable_get_from_memtable_count_bit : 1; // 2 - uint8_t enable_seek_on_memtable_count_bit : 1; // 2 - uint8_t enable_next_on_memtable_count_bit : 1; // 2 - uint8_t enable_prev_on_memtable_count_bit : 1; // 2 - uint8_t enable_seek_child_seek_count_bit : 1; // 2 - uint8_t enable_bloom_memtable_hit_count_bit : 1; // 2 - uint8_t enable_bloom_memtable_miss_count_bit : 1; // 2 - uint8_t enable_bloom_sst_hit_count_bit : 1; // 2 - uint8_t enable_bloom_sst_miss_count_bit : 1; // 2 - uint8_t enable_key_lock_wait_count_bit : 1; // 2 - }; - uint64_t level2_by_mask; - }; + // TODO: think a better design for context_by_level structure + uint8_t enable_perf_context_by_level_count_bit : 1; // 2 + uint8_t enable_user_key_comparison_count_bit : 1; // 2 + uint8_t enable_block_cache_hit_count_bit : 1; // 2 + uint8_t enable_block_read_count_bit : 1; // 2 + uint8_t enable_block_read_byte_bit : 1; // 2 + uint8_t enable_block_cache_index_hit_count_bit : 1; // 2 + uint8_t enable_index_block_read_count_bit : 1; // 2 + uint8_t enable_block_cache_filter_hit_count_bit : 1; // 2 + uint8_t enable_filter_block_read_count_bit : 1; // 2 + uint8_t enable_compression_dict_block_read_count_bit : 1; // 2 + uint8_t enable_get_read_bytes_bit : 1; // 2 + uint8_t enable_multiget_read_bytes_bit : 1; // 2 + uint8_t enable_iter_read_bytes_bit : 1; // 2 + uint8_t enable_internal_key_skipped_count_bit : 1; // 2 + uint8_t enable_internal_delete_skipped_count_bit : 1; // 2 + uint8_t enable_internal_recent_skipped_count_bit : 1; // 2 + uint8_t enable_internal_merge_count_bit : 1; // 2 + uint8_t enable_get_from_memtable_count_bit : 1; // 2 + uint8_t enable_seek_on_memtable_count_bit : 1; // 2 + uint8_t enable_next_on_memtable_count_bit : 1; // 2 + uint8_t enable_prev_on_memtable_count_bit : 1; // 2 + uint8_t enable_seek_child_seek_count_bit : 1; // 2 + uint8_t enable_bloom_memtable_hit_count_bit : 1; // 2 + uint8_t enable_bloom_memtable_miss_count_bit : 1; // 2 + uint8_t enable_bloom_sst_hit_count_bit : 1; // 2 + uint8_t enable_bloom_sst_miss_count_bit : 1; // 2 + uint8_t enable_key_lock_wait_count_bit : 1; // 2 + // represent original Level 3 - union { - struct { - uint8_t enable_measure_cpu_time_bit : 1; // 3 - uint8_t enable_block_read_time_bit : 1; // 3 - uint8_t enable_block_checksum_time_bit : 1; // 3 - uint8_t enable_block_decompress_time_bit : 1; // 3 - uint8_t enable_get_snapshot_time_bit : 1; // 3 - uint8_t enable_get_from_memtable_time_bit : 1; // 3 - uint8_t enable_get_post_process_time_bit : 1; // 3 - uint8_t enable_get_from_output_files_time_bit : 1; // 3 - uint8_t enable_seek_on_memtable_time_bit : 1; // 3 - uint8_t enable_seek_child_seek_time_bit : 1; // 3 - uint8_t enable_seek_min_heap_time_bit : 1; // 3 - uint8_t enable_seek_max_heap_time_bit : 1; // 3 - uint8_t enable_seek_internal_seek_time_bit : 1; // 3 - uint8_t enable_find_next_user_entry_time_bit : 1; // 3 - uint8_t enable_write_wal_time_bit : 1; // 3 - uint8_t enable_write_memtable_time_bit : 1; // 3 - uint8_t enable_write_delay_time_bit : 1; // 3 - uint8_t enable_write_scheduling_flushes_compactions_time_bit : 1; // 3 - uint8_t enable_write_pre_and_post_process_time_bit : 1; // 3 - uint8_t enable_write_thread_wait_nanos_bit : 1; // 3 - uint8_t enable_merge_operator_time_nanos_bit : 1; // 3 - uint8_t enable_read_index_block_nanos_bit : 1; // 3 - uint8_t enable_read_filter_block_nanos_bit : 1; // 3 - uint8_t enable_new_table_block_iter_nanos_bit : 1; // 3 - uint8_t enable_new_table_iterator_nanos_bit : 1; // 3 - uint8_t enable_block_seek_nanos_bit : 1; // 3 - uint8_t enable_find_table_nanos_bit : 1; // 3 - uint8_t enable_key_lock_wait_time_bit : 1; // 3 - uint8_t enable_env_new_sequential_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_random_access_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_writable_file_nanos_bit : 1; // 3 - uint8_t enable_env_reuse_writable_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_random_rw_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_directory_nanos_bit : 1; // 3 - uint8_t enable_env_file_exists_nanos_bit : 1; // 3 - uint8_t enable_env_get_children_nanos_bit : 1; // 3 - uint8_t enable_env_get_children_file_attributes_nanos_bit : 1; // 3 - uint8_t enable_env_delete_file_nanos_bit : 1; // 3 - uint8_t enable_env_create_dir_nanos_bit : 1; // 3 - uint8_t enable_env_create_dir_if_missing_nanos_bit : 1; // 3 - uint8_t enable_env_delete_dir_nanos_bit : 1; // 3 - uint8_t enable_env_get_file_size_nanos_bit : 1; // 3 - uint8_t enable_env_get_file_modification_time_nanos_bit : 1; // 3 - uint8_t enable_env_rename_file_nanos_bit : 1; // 3 - uint8_t enable_env_link_file_nanos_bit : 1; // 3 - uint8_t enable_env_lock_file_nanos_bit : 1; // 3 - uint8_t enable_env_unlock_file_nanos_bit : 1; // 3 - uint8_t enable_env_new_logger_nanos_bit : 1; // 3 - uint8_t enable_encrypt_data_nanos_bit : 1; // 3 - uint8_t enable_decrypt_data_nanos_bit : 1; // 3 - }; - uint64_t level3_by_mask; - }; + uint8_t enable_measure_cpu_time_bit : 1; // 3 + uint8_t enable_block_read_time_bit : 1; // 3 + uint8_t enable_block_checksum_time_bit : 1; // 3 + uint8_t enable_block_decompress_time_bit : 1; // 3 + uint8_t enable_get_snapshot_time_bit : 1; // 3 + uint8_t enable_get_from_memtable_time_bit : 1; // 3 + uint8_t enable_get_post_process_time_bit : 1; // 3 + uint8_t enable_get_from_output_files_time_bit : 1; // 3 + uint8_t enable_seek_on_memtable_time_bit : 1; // 3 + uint8_t enable_seek_child_seek_time_bit : 1; // 3 + uint8_t enable_seek_min_heap_time_bit : 1; // 3 + uint8_t enable_seek_max_heap_time_bit : 1; // 3 + uint8_t enable_seek_internal_seek_time_bit : 1; // 3 + uint8_t enable_find_next_user_entry_time_bit : 1; // 3 + uint8_t enable_write_wal_time_bit : 1; // 3 + uint8_t enable_write_memtable_time_bit : 1; // 3 + uint8_t enable_write_delay_time_bit : 1; // 3 + uint8_t enable_write_scheduling_flushes_compactions_time_bit : 1; // 3 + uint8_t enable_write_pre_and_post_process_time_bit : 1; // 3 + uint8_t enable_write_thread_wait_nanos_bit : 1; // 3 + uint8_t enable_merge_operator_time_nanos_bit : 1; // 3 + uint8_t enable_read_index_block_nanos_bit : 1; // 3 + uint8_t enable_read_filter_block_nanos_bit : 1; // 3 + uint8_t enable_new_table_block_iter_nanos_bit : 1; // 3 + uint8_t enable_new_table_iterator_nanos_bit : 1; // 3 + uint8_t enable_block_seek_nanos_bit : 1; // 3 + uint8_t enable_find_table_nanos_bit : 1; // 3 + uint8_t enable_key_lock_wait_time_bit : 1; // 3 + uint8_t enable_env_new_sequential_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_random_access_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_writable_file_nanos_bit : 1; // 3 + uint8_t enable_env_reuse_writable_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_random_rw_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_directory_nanos_bit : 1; // 3 + uint8_t enable_env_file_exists_nanos_bit : 1; // 3 + uint8_t enable_env_get_children_nanos_bit : 1; // 3 + uint8_t enable_env_get_children_file_attributes_nanos_bit : 1; // 3 + uint8_t enable_env_delete_file_nanos_bit : 1; // 3 + uint8_t enable_env_create_dir_nanos_bit : 1; // 3 + uint8_t enable_env_create_dir_if_missing_nanos_bit : 1; // 3 + uint8_t enable_env_delete_dir_nanos_bit : 1; // 3 + uint8_t enable_env_get_file_size_nanos_bit : 1; // 3 + uint8_t enable_env_get_file_modification_time_nanos_bit : 1; // 3 + uint8_t enable_env_rename_file_nanos_bit : 1; // 3 + uint8_t enable_env_link_file_nanos_bit : 1; // 3 + uint8_t enable_env_lock_file_nanos_bit : 1; // 3 + uint8_t enable_env_unlock_file_nanos_bit : 1; // 3 + uint8_t enable_env_new_logger_nanos_bit : 1; // 3 + uint8_t enable_encrypt_data_nanos_bit : 1; // 3 + uint8_t enable_decrypt_data_nanos_bit : 1; // 3 + // represent original Level 4 - union { - struct { - uint8_t enable_get_cpu_nanos_bit : 1; // 4 - uint8_t enable_iter_next_cpu_nanos_bit : 1; // 4 - uint8_t enable_iter_prev_cpu_nanos_bit : 1; // 4 - uint8_t enable_iter_seek_cpu_nanos_bit : 1; // 4 - }; - uint8_t level4_by_mask; - }; + // TODO: think a better design for iostats + uint8_t enable_iostats_cpu_timer_bit : 1; // 4 + uint8_t enable_get_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_next_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_prev_cpu_nanos_bit : 1; // 4 + uint8_t enable_iter_seek_cpu_nanos_bit : 1; // 4 + // represent original Level 5 - union { - struct { - uint8_t enable_db_mutex_lock_nanos_bit : 1; // 5 - uint8_t enable_db_condition_wait_nanos_bit : 1; // 5 - }; - uint8_t level5_by_mask; - }; + uint8_t enable_db_mutex_lock_nanos_bit : 1; // 5 + uint8_t enable_db_condition_wait_nanos_bit : 1; // 5 }; - +extern const PerfFlags PERF_LEVEL2; +extern const PerfFlags PERF_LEVEL3; +extern const PerfFlags PERF_LEVEL4; +extern const PerfFlags PERF_LEVEL5; // set the perf flags for current thread void SetPerfFlags(PerfFlags pbf); diff --git a/include/rocksdb/perf_level.h b/include/rocksdb/perf_level.h index 01fe0ff5e4c..9f5f28f57ee 100644 --- a/include/rocksdb/perf_level.h +++ b/include/rocksdb/perf_level.h @@ -21,7 +21,8 @@ enum PerfLevel : unsigned char { // time (neither wall time nor CPU time) for mutexes. kEnableTimeAndCPUTimeExceptForMutex = 4, kEnableTime = 5, // enable count and time stats - kOutOfBounds = 6 // N.B. Must always be the last value! + kCustomFlags = 6, // could not measured by level because is a custom bit flags configuration + kOutOfBounds = 7, // N.B. Must always be the last value! }; // set the perf stats level for current thread diff --git a/monitoring/iostats_context_imp.h b/monitoring/iostats_context_imp.h index 19e34209b1b..634f320ca00 100644 --- a/monitoring/iostats_context_imp.h +++ b/monitoring/iostats_context_imp.h @@ -4,6 +4,7 @@ // (found in the LICENSE.Apache file in the root directory). // #pragma once +#include "monitoring/perf_flags_imp.h" #include "monitoring/perf_step_timer.h" #include "rocksdb/iostats_context.h" @@ -34,14 +35,13 @@ extern __thread IOStatsContext iostats_context; // Declare and set start time of the timer #define IOSTATS_TIMER_GUARD(metric) \ - PerfStepTimer iostats_step_timer_##metric(&(iostats_context.metric)); \ + PerfStepTimer iostats_step_timer_##metric(&(iostats_context.metric),(bool)perf_flags.enable_iostats_cpu_timer_bit); \ iostats_step_timer_##metric.Start(); // Declare and set start time of the timer #define IOSTATS_CPU_TIMER_GUARD(metric, env) \ PerfStepTimer iostats_step_timer_##metric( \ - &(iostats_context.metric), env, true, \ - PerfLevel::kEnableTimeAndCPUTimeExceptForMutex); \ + &(iostats_context.metric),(bool)perf_flags.enable_iostats_cpu_timer_bit, env, true); \ iostats_step_timer_##metric.Start(); #else // ROCKSDB_SUPPORT_THREAD_LOCAL diff --git a/monitoring/perf_context.cc b/monitoring/perf_context.cc index 40b0b215c47..2e2e1b31bc4 100644 --- a/monitoring/perf_context.cc +++ b/monitoring/perf_context.cc @@ -5,6 +5,7 @@ // #include + #include "monitoring/perf_context_imp.h" namespace rocksdb { @@ -30,8 +31,9 @@ PerfContext* get_perf_context() { #endif #endif } - PerfContext::~PerfContext() { + auto str = this->ToString(true); + printf("%s\n",str.c_str()); #if !defined(NPERF_CONTEXT) && defined(ROCKSDB_SUPPORT_THREAD_LOCAL) && !defined(OS_SOLARIS) ClearPerLevelPerfContext(); #endif diff --git a/monitoring/perf_context_imp.h b/monitoring/perf_context_imp.h index f42bf901c6f..573ea4bcffc 100644 --- a/monitoring/perf_context_imp.h +++ b/monitoring/perf_context_imp.h @@ -23,16 +23,12 @@ extern thread_local PerfContext perf_context; #if defined(NPERF_CONTEXT) -#define PERF_TIMER_STOP(metric) -#define PERF_TIMER_START(metric) #define PERF_TIMER_GUARD(metric) -#define PERF_TIMER_GUARD_WITH_ENV(metric, env) -#define PERF_CPU_TIMER_GUARD(metric, env) -#define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition, stats, \ - ticker_type) +#define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition) #define PERF_TIMER_MEASURE(metric) +#define PERF_TIMER_STOP(metric) +#define PERF_TIMER_START(metric) #define PERF_COUNTER_ADD(metric, value) -#define PERF_COUNTER_BY_LEVEL_ADD(metric, value, level) #else @@ -42,35 +38,28 @@ extern thread_local PerfContext perf_context; #define PERF_TIMER_START(metric) perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_TIMER_GUARD(metric) \ - PerfStepTimer perf_step_timer_##metric( \ - &(perf_context.metric), nullptr, \ - (bool)perf_flags.enable_measure_cpu_time_bit, \ - (bool)perf_flags.enable_##metric##_bit); \ +#define PERF_TIMER_GUARD(metric) \ + PerfStepTimer perf_step_timer_##metric(&(perf_context.metric),(bool)perf_flags.enable_##metric##_bit); \ perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_TIMER_GUARD_WITH_ENV(metric, env) \ - PerfStepTimer perf_step_timer_##metric( \ - &(perf_context.metric), env, \ - (bool)perf_flags.enable_measure_cpu_time_bit, \ - (bool)perf_flags.enable_##metric##_bit); \ +#define PERF_TIMER_GUARD_WITH_ENV(metric, env) \ + PerfStepTimer perf_step_timer_##metric(&(perf_context.metric), (bool)perf_flags.enable_##metric##_bit, env); \ perf_step_timer_##metric.Start(); // Declare and set start time of the timer -#define PERF_CPU_TIMER_GUARD(metric, env) \ - PerfStepTimer perf_step_timer_##metric( \ - &(perf_context.metric), env, true, \ - (bool)perf_flags.enable_##metric##_bit); \ +#define PERF_CPU_TIMER_GUARD(metric, env) \ + PerfStepTimer perf_step_timer_##metric( \ + &(perf_context.metric), (bool)perf_flags.enable_##metric##_bit, env, true); \ perf_step_timer_##metric.Start(); -#define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition, stats, \ - ticker_type) \ - PerfStepTimer perf_step_timer_##metric( \ - &(perf_context.metric), nullptr, false, \ - (bool)perf_flags.enable_##metric##_bit, stats, ticker_type); \ - if (condition) { \ - perf_step_timer_##metric.Start(); \ +#define PERF_CONDITIONAL_TIMER_FOR_MUTEX_GUARD(metric, condition, stats, \ + ticker_type) \ + PerfStepTimer perf_step_timer_##metric(&(perf_context.metric),(bool)perf_flags.enable_##metric##_bit , nullptr, \ + false, stats, \ + ticker_type); \ + if (condition) { \ + perf_step_timer_##metric.Start(); \ } // Update metric with time elapsed since last START. start time is reset @@ -78,25 +67,27 @@ extern thread_local PerfContext perf_context; #define PERF_TIMER_MEASURE(metric) perf_step_timer_##metric.Measure(); // Increase metric value -#define PERF_COUNTER_ADD(metric, value) \ - if (perf_flags.enable_##metric##_bit) { \ - perf_context.metric += value; \ +#define PERF_COUNTER_ADD(metric, value) \ + if ((bool)perf_flags.enable_##metric##_bit) { \ + perf_context.metric += value; \ } // Increase metric value -// TODO: add a flag count -#define PERF_COUNTER_BY_LEVEL_ADD(metric, value, level) \ - if (perf_context.per_level_perf_context_enabled && \ - perf_context.level_to_perf_context) { \ - if ((*(perf_context.level_to_perf_context)).find(level) != \ - (*(perf_context.level_to_perf_context)).end()) { \ - (*(perf_context.level_to_perf_context))[level].metric += value; \ - } else { \ - PerfContextByLevel empty_context; \ - (*(perf_context.level_to_perf_context))[level] = empty_context; \ - (*(perf_context.level_to_perf_context))[level].metric += value; \ - } \ - } +#define PERF_COUNTER_BY_LEVEL_ADD(metric, value, level) \ + if ((bool)perf_flags.enable_perf_context_by_level_count_bit && \ + perf_context.per_level_perf_context_enabled && \ + perf_context.level_to_perf_context) { \ + if ((*(perf_context.level_to_perf_context)).find(level) != \ + (*(perf_context.level_to_perf_context)).end()) { \ + (*(perf_context.level_to_perf_context))[level].metric += value; \ + } \ + else { \ + PerfContextByLevel empty_context; \ + (*(perf_context.level_to_perf_context))[level] = empty_context; \ + (*(perf_context.level_to_perf_context))[level].metric += value; \ + } \ + } \ + #endif -} // namespace rocksdb +} \ No newline at end of file diff --git a/monitoring/perf_flags.cc b/monitoring/perf_flags.cc index d8aaded323e..22c2279c4e6 100644 --- a/monitoring/perf_flags.cc +++ b/monitoring/perf_flags.cc @@ -1,31 +1,127 @@ #include "monitoring/perf_flags_imp.h" + +#define PERF_FLAGS_INIT_LEVEL2 \ +.enable_perf_context_by_level_count_bit = 1, \ +.enable_user_key_comparison_count_bit = 1, \ +.enable_block_cache_hit_count_bit = 1, \ +.enable_block_read_count_bit = 1, \ +.enable_block_read_byte_bit = 1, \ +.enable_block_cache_index_hit_count_bit = 1, \ +.enable_index_block_read_count_bit = 1, \ +.enable_block_cache_filter_hit_count_bit = 1, \ +.enable_filter_block_read_count_bit = 1, \ +.enable_compression_dict_block_read_count_bit = 1, \ +.enable_get_read_bytes_bit = 1, \ +.enable_multiget_read_bytes_bit = 1, \ +.enable_iter_read_bytes_bit = 1, \ +.enable_internal_key_skipped_count_bit = 1, \ +.enable_internal_delete_skipped_count_bit = 1, \ +.enable_internal_recent_skipped_count_bit = 1, \ +.enable_internal_merge_count_bit = 1, \ +.enable_get_from_memtable_count_bit = 1, \ +.enable_seek_on_memtable_count_bit = 1, \ +.enable_next_on_memtable_count_bit = 1, \ +.enable_prev_on_memtable_count_bit = 1, \ +.enable_seek_child_seek_count_bit = 1, \ +.enable_bloom_memtable_hit_count_bit = 1, \ +.enable_bloom_memtable_miss_count_bit = 1, \ +.enable_bloom_sst_hit_count_bit = 1, \ +.enable_bloom_sst_miss_count_bit = 1, \ +.enable_key_lock_wait_count_bit = 1 + +#define PERF_FLAGS_INIT_LEVEL3 \ +.enable_measure_cpu_time_bit = 1, \ +.enable_block_read_time_bit = 1, \ +.enable_block_checksum_time_bit = 1, \ +.enable_block_decompress_time_bit = 1, \ +.enable_get_snapshot_time_bit = 1, \ +.enable_get_from_memtable_time_bit = 1, \ +.enable_get_post_process_time_bit = 1, \ +.enable_get_from_output_files_time_bit = 1, \ +.enable_seek_on_memtable_time_bit = 1, \ +.enable_seek_child_seek_time_bit = 1, \ +.enable_seek_min_heap_time_bit = 1, \ +.enable_seek_max_heap_time_bit = 1, \ +.enable_seek_internal_seek_time_bit = 1, \ +.enable_find_next_user_entry_time_bit = 1, \ +.enable_write_wal_time_bit = 1, \ +.enable_write_memtable_time_bit = 1, \ +.enable_write_delay_time_bit = 1, \ +.enable_write_scheduling_flushes_compactions_time_bit = 1, \ +.enable_write_pre_and_post_process_time_bit = 1, \ +.enable_write_thread_wait_nanos_bit = 1, \ +.enable_merge_operator_time_nanos_bit = 1, \ +.enable_read_index_block_nanos_bit = 1, \ +.enable_read_filter_block_nanos_bit = 1, \ +.enable_new_table_block_iter_nanos_bit = 1, \ +.enable_new_table_iterator_nanos_bit = 1, \ +.enable_block_seek_nanos_bit = 1, \ +.enable_find_table_nanos_bit = 1, \ +.enable_key_lock_wait_time_bit = 1, \ +.enable_env_new_sequential_file_nanos_bit = 1, \ +.enable_env_new_random_access_file_nanos_bit = 1, \ +.enable_env_new_writable_file_nanos_bit = 1, \ +.enable_env_reuse_writable_file_nanos_bit = 1, \ +.enable_env_new_random_rw_file_nanos_bit = 1, \ +.enable_env_new_directory_nanos_bit = 1, \ +.enable_env_file_exists_nanos_bit = 1, \ +.enable_env_get_children_nanos_bit = 1, \ +.enable_env_get_children_file_attributes_nanos_bit = 1, \ +.enable_env_delete_file_nanos_bit = 1, \ +.enable_env_create_dir_nanos_bit = 1, \ +.enable_env_create_dir_if_missing_nanos_bit = 1, \ +.enable_env_delete_dir_nanos_bit = 1, \ +.enable_env_get_file_size_nanos_bit = 1, \ +.enable_env_get_file_modification_time_nanos_bit = 1, \ +.enable_env_rename_file_nanos_bit = 1, \ +.enable_env_link_file_nanos_bit = 1, \ +.enable_env_lock_file_nanos_bit = 1, \ +.enable_env_unlock_file_nanos_bit = 1, \ +.enable_env_new_logger_nanos_bit = 1, \ +.enable_encrypt_data_nanos_bit = 1, \ +.enable_decrypt_data_nanos_bit = 1 + +#define PERF_FLAGS_INIT_LEVEL4 \ +.enable_iostats_cpu_timer_bit = 1, \ +.enable_get_cpu_nanos_bit = 1, \ +.enable_iter_next_cpu_nanos_bit = 1, \ +.enable_iter_prev_cpu_nanos_bit = 1, \ +.enable_iter_seek_cpu_nanos_bit = 1 + +#define PERF_FLAGS_INIT_LEVEL5 \ +.enable_db_mutex_lock_nanos_bit = 1, \ +.enable_db_condition_wait_nanos_bit = 1 \ + namespace rocksdb { -const PerfFlags PerfFlagsEnableCount = { - // .perf_level = 2, - PERF_FLAGS_ENABLE_COUNT}; - -const PerfFlags PerfFlagsEnableTimeExceptForMutex = { - // .perf_level = 3, - PERF_FLAGS_ENABLE_COUNT, PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX}; -const PerfFlags PerfFlagsEnableTimeAndCPUTimeExceptForMutex = { - // .perf_level = 4, - PERF_FLAGS_ENABLE_COUNT, PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX, - PERF_FLAGS_ENABLE_TIME_AND_CPU_TIME_EXCEPT_FOR_MUTEX}; - -const PerfFlags PerfFlagsEnableTime = { - // .perf_level = 5, - PERF_FLAGS_ENABLE_COUNT, - PERF_FLAGS_ENABLE_TIME_EXCEPT_FOR_MUTEX, - PERF_FLAGS_ENABLE_TIME_AND_CPU_TIME_EXCEPT_FOR_MUTEX, - .enable_db_mutex_lock_nanos_bit = 1, - .enable_db_condition_wait_nanos_bit = 1, + +const PerfFlags PERF_LEVEL2 = { + PERF_FLAGS_INIT_LEVEL2 +}; +const PerfFlags PERF_LEVEL3 = { + PERF_FLAGS_INIT_LEVEL2, + PERF_FLAGS_INIT_LEVEL3 +}; +const PerfFlags PERF_LEVEL4 = { + PERF_FLAGS_INIT_LEVEL2, + PERF_FLAGS_INIT_LEVEL3, + PERF_FLAGS_INIT_LEVEL4 +}; +const PerfFlags PERF_LEVEL5 = { + PERF_FLAGS_INIT_LEVEL2, + PERF_FLAGS_INIT_LEVEL3, + PERF_FLAGS_INIT_LEVEL4, + PERF_FLAGS_INIT_LEVEL5 }; // set default value of perf_flags #ifdef ROCKSDB_SUPPORT_THREAD_LOCAL -__thread PerfFlags perf_flags = {.level2_by_mask = (uint64_t)-1}; +__thread PerfFlags perf_flags = { + PERF_FLAGS_INIT_LEVEL2 +}; #else -PerfFlags perf_flags = PerfFlagsEnableCount; +PerfFlags perf_flags = { + PERF_FLAGS_INIT_LEVEL2 +}; #endif void SetPerfFlags(PerfFlags pbf) { perf_flags = pbf; } diff --git a/monitoring/perf_level.cc b/monitoring/perf_level.cc index e30815ef76f..e75b335106a 100644 --- a/monitoring/perf_level.cc +++ b/monitoring/perf_level.cc @@ -8,6 +8,8 @@ #include +#include + #include "monitoring/perf_flags_imp.h" namespace rocksdb { @@ -18,13 +20,16 @@ void SetPerfLevel(PerfLevel level) { assert(level < kOutOfBounds); switch (level) { case kEnableTime: - perf_flags.level5_by_mask = -1; + perf_flags = PERF_LEVEL5; + break; case kEnableTimeAndCPUTimeExceptForMutex: - perf_flags.level4_by_mask = -1; + perf_flags = PERF_LEVEL4; + break; case kEnableTimeExceptForMutex: - perf_flags.level3_by_mask = -1; + perf_flags = PERF_LEVEL3; + break; case kEnableCount: - perf_flags.level2_by_mask = -1; + perf_flags = PERF_LEVEL2; return; default: perf_flags = {}; @@ -34,11 +39,43 @@ void SetPerfLevel(PerfLevel level) { } // get the estimated perf level PerfLevel GetPerfLevel() { - if (perf_flags.level5_by_mask != 0) return (PerfLevel)5; - if (perf_flags.level4_by_mask != 0) return (PerfLevel)4; - if (perf_flags.level3_by_mask != 0) return (PerfLevel)3; - if (perf_flags.level2_by_mask != 0) return (PerfLevel)2; - return PerfLevel::kDisable; + int cmp5 = memcmp(&perf_flags, &PERF_LEVEL5, sizeof(PerfFlags)); + if (cmp5 == 0) { + return kEnableTime; + } else if (cmp5 < 0) { + int cmp4 = memcmp(&perf_flags, &PERF_LEVEL4, sizeof(PerfFlags)); + if (cmp4 == 0) { + return kEnableTimeAndCPUTimeExceptForMutex; + } else if (cmp4 < 0) { + int cmp3 = memcmp(&perf_flags, &PERF_LEVEL3, sizeof(PerfFlags)); + if (cmp3 == 0) { + return kEnableTimeExceptForMutex; + } else if (cmp3 < 0) { + int cmp2 = memcmp(&perf_flags, &PERF_LEVEL2, sizeof(PerfFlags)); + if (cmp2 == 0) { + return kEnableCount; + } else if (cmp2 < 0) { + PerfFlags empt = {}; + int cmp1 = memcmp(&perf_flags, &empt, sizeof(PerfFlags)); + if (cmp1 == 0) { + return kDisable; + } else if (cmp1 < 0) { + abort(); + } else { + return kCustomFlags; + } + } else { + return kCustomFlags; + } + } else { + return kCustomFlags; + } + } else { + return kCustomFlags; + } + } else { + abort(); + } } } // namespace rocksdb diff --git a/monitoring/perf_step_timer.h b/monitoring/perf_step_timer.h index d2c5ee86db3..4c43ce62227 100644 --- a/monitoring/perf_step_timer.h +++ b/monitoring/perf_step_timer.h @@ -12,9 +12,10 @@ namespace rocksdb { class PerfStepTimer { public: - explicit PerfStepTimer(uint64_t* metric, Env* env = nullptr, - bool use_cpu_time = false, + explicit PerfStepTimer(uint64_t* metric, bool perf_counter_enabled_ = false, + Env* env = nullptr, + bool use_cpu_time = false, Statistics* statistics = nullptr, uint32_t ticker_type = 0) : perf_counter_enabled_(perf_counter_enabled_), diff --git a/table/block_based/block.cc b/table/block_based/block.cc index b0accaa7508..fcba797a901 100644 --- a/table/block_based/block.cc +++ b/table/block_based/block.cc @@ -10,6 +10,7 @@ // Decodes the blocks generated by block_builder.cc. #include "table/block_based/block.h" + #include #include #include diff --git a/table/block_based/block_based_filter_block.cc b/table/block_based/block_based_filter_block.cc index 319c5bf6d87..8bac865081b 100644 --- a/table/block_based/block_based_filter_block.cc +++ b/table/block_based/block_based_filter_block.cc @@ -8,6 +8,7 @@ // found in the LICENSE file. See the AUTHORS file for names of contributors. #include "table/block_based/block_based_filter_block.h" + #include #include "db/dbformat.h" diff --git a/table/block_based/block_based_table_reader.cc b/table/block_based/block_based_table_reader.cc index a7593a9a99f..4b9257aac1d 100644 --- a/table/block_based/block_based_table_reader.cc +++ b/table/block_based/block_based_table_reader.cc @@ -17,7 +17,7 @@ #include "db/dbformat.h" #include "db/pinned_iterators_manager.h" - +#include "monitoring/perf_context_imp.h" #include "rocksdb/cache.h" #include "rocksdb/comparator.h" #include "rocksdb/env.h" @@ -27,7 +27,6 @@ #include "rocksdb/statistics.h" #include "rocksdb/table.h" #include "rocksdb/table_properties.h" - #include "table/block_based/block.h" #include "table/block_based/block_based_filter_block.h" #include "table/block_based/block_based_table_factory.h" @@ -44,8 +43,6 @@ #include "table/persistent_cache_helper.h" #include "table/sst_file_writer_collectors.h" #include "table/two_level_iterator.h" - -#include "monitoring/perf_context_imp.h" #include "test_util/sync_point.h" #include "util/coding.h" #include "util/crc32c.h" diff --git a/table/block_based/filter_block_reader_common.cc b/table/block_based/filter_block_reader_common.cc index b6a33498678..257ca0f5b12 100644 --- a/table/block_based/filter_block_reader_common.cc +++ b/table/block_based/filter_block_reader_common.cc @@ -5,6 +5,7 @@ // #include "table/block_based/filter_block_reader_common.h" + #include "monitoring/perf_context_imp.h" #include "table/block_based/block_based_table_reader.h" diff --git a/table/block_based/uncompression_dict_reader.cc b/table/block_based/uncompression_dict_reader.cc index 559e8af5cbd..beaca59c23e 100644 --- a/table/block_based/uncompression_dict_reader.cc +++ b/table/block_based/uncompression_dict_reader.cc @@ -5,6 +5,7 @@ // #include "table/block_based/uncompression_dict_reader.h" + #include "monitoring/perf_context_imp.h" #include "table/block_based/block_based_table_reader.h" #include "util/compression.h" diff --git a/table/get_context.cc b/table/get_context.cc index 70b7e6ae23a..35b9ef627fe 100644 --- a/table/get_context.cc +++ b/table/get_context.cc @@ -4,6 +4,7 @@ // (found in the LICENSE.Apache file in the root directory). #include "table/get_context.h" + #include "db/merge_helper.h" #include "db/pinned_iterators_manager.h" #include "db/read_callback.h" diff --git a/table/merging_iterator.cc b/table/merging_iterator.cc index 592eddfb41a..61ebf64982f 100644 --- a/table/merging_iterator.cc +++ b/table/merging_iterator.cc @@ -8,8 +8,10 @@ // found in the LICENSE file. See the AUTHORS file for names of contributors. #include "table/merging_iterator.h" + #include #include + #include "db/dbformat.h" #include "db/pinned_iterators_manager.h" #include "memory/arena.h" diff --git a/table/plain/plain_table_reader.cc b/table/plain/plain_table_reader.cc index f6c348fdbf9..754a4806994 100644 --- a/table/plain/plain_table_reader.cc +++ b/table/plain/plain_table_reader.cc @@ -11,14 +11,15 @@ #include #include "db/dbformat.h" - +#include "memory/arena.h" +#include "monitoring/histogram.h" +#include "monitoring/perf_context_imp.h" #include "rocksdb/cache.h" #include "rocksdb/comparator.h" #include "rocksdb/env.h" #include "rocksdb/filter_policy.h" #include "rocksdb/options.h" #include "rocksdb/statistics.h" - #include "table/block_based/block.h" #include "table/block_based/filter_block.h" #include "table/bloom_block.h" @@ -29,10 +30,6 @@ #include "table/plain/plain_table_factory.h" #include "table/plain/plain_table_key_coding.h" #include "table/two_level_iterator.h" - -#include "memory/arena.h" -#include "monitoring/histogram.h" -#include "monitoring/perf_context_imp.h" #include "util/coding.h" #include "util/dynamic_bloom.h" #include "util/hash.h" diff --git a/tools/db_bench_tool.cc b/tools/db_bench_tool.cc index eb741c9e62d..05621ad0234 100644 --- a/tools/db_bench_tool.cc +++ b/tools/db_bench_tool.cc @@ -892,7 +892,7 @@ DEFINE_int32(thread_status_per_interval, 0, "Takes and report a snapshot of the current status of each thread" " when this is greater than 0."); -DEFINE_int32(perf_level, rocksdb::PerfLevel::kDisable, "Level of perf collection"); +DEFINE_int32(perf_level, rocksdb::PerfLevel::kEnableTime, "Level of perf collection"); static bool ValidateRateLimit(const char* flagname, double value) { const double EPSILON = 1e-10; diff --git a/utilities/transactions/transaction_lock_mgr.cc b/utilities/transactions/transaction_lock_mgr.cc index 084d817ea08..d883415adbd 100644 --- a/utilities/transactions/transaction_lock_mgr.cc +++ b/utilities/transactions/transaction_lock_mgr.cc @@ -7,9 +7,8 @@ #include "utilities/transactions/transaction_lock_mgr.h" -#include - #include +#include #include #include #include From df2844c1136d8b9fa71dad1eb35cf1d2e0ae47dd Mon Sep 17 00:00:00 2001 From: lemonhx Date: Thu, 15 Apr 2021 11:12:32 +0800 Subject: [PATCH 9/9] removed nested if --- include/rocksdb/perf_flags.h | 11 ++-- monitoring/perf_flags.cc | 108 +++++++++++++++-------------------- monitoring/perf_level.cc | 49 ++++------------ 3 files changed, 61 insertions(+), 107 deletions(-) diff --git a/include/rocksdb/perf_flags.h b/include/rocksdb/perf_flags.h index 4fcd7bb47b6..ae7cac66645 100644 --- a/include/rocksdb/perf_flags.h +++ b/include/rocksdb/perf_flags.h @@ -1,5 +1,5 @@ #pragma once -#include +#include namespace rocksdb { struct PerfFlags { @@ -97,10 +97,11 @@ struct PerfFlags { uint8_t enable_db_mutex_lock_nanos_bit : 1; // 5 uint8_t enable_db_condition_wait_nanos_bit : 1; // 5 }; -extern const PerfFlags PERF_LEVEL2; -extern const PerfFlags PERF_LEVEL3; -extern const PerfFlags PERF_LEVEL4; -extern const PerfFlags PERF_LEVEL5; +extern const PerfFlags PERF_LEVEL1; +extern const PerfFlags PERF_LEVEL2; +extern const PerfFlags PERF_LEVEL3; +extern const PerfFlags PERF_LEVEL4; +extern const PerfFlags PERF_LEVEL5; // set the perf flags for current thread void SetPerfFlags(PerfFlags pbf); diff --git a/monitoring/perf_flags.cc b/monitoring/perf_flags.cc index 22c2279c4e6..16c6309b233 100644 --- a/monitoring/perf_flags.cc +++ b/monitoring/perf_flags.cc @@ -16,42 +16,39 @@ .enable_iter_read_bytes_bit = 1, \ .enable_internal_key_skipped_count_bit = 1, \ .enable_internal_delete_skipped_count_bit = 1, \ -.enable_internal_recent_skipped_count_bit = 1, \ -.enable_internal_merge_count_bit = 1, \ -.enable_get_from_memtable_count_bit = 1, \ -.enable_seek_on_memtable_count_bit = 1, \ -.enable_next_on_memtable_count_bit = 1, \ -.enable_prev_on_memtable_count_bit = 1, \ -.enable_seek_child_seek_count_bit = 1, \ -.enable_bloom_memtable_hit_count_bit = 1, \ -.enable_bloom_memtable_miss_count_bit = 1, \ -.enable_bloom_sst_hit_count_bit = 1, \ -.enable_bloom_sst_miss_count_bit = 1, \ -.enable_key_lock_wait_count_bit = 1 +.enable_internal_recent_skipped_count_bit = 1, \ + .enable_internal_merge_count_bit = 1, \ + .enable_get_from_memtable_count_bit = 1, \ + .enable_seek_on_memtable_count_bit = 1, \ + .enable_next_on_memtable_count_bit = 1, \ + .enable_prev_on_memtable_count_bit = 1, \ + .enable_seek_child_seek_count_bit = 1, \ + .enable_bloom_memtable_hit_count_bit = 1, \ + .enable_bloom_memtable_miss_count_bit = 1, \ + .enable_bloom_sst_hit_count_bit = 1, .enable_bloom_sst_miss_count_bit = 1, \ + .enable_key_lock_wait_count_bit = 1 -#define PERF_FLAGS_INIT_LEVEL3 \ -.enable_measure_cpu_time_bit = 1, \ -.enable_block_read_time_bit = 1, \ -.enable_block_checksum_time_bit = 1, \ -.enable_block_decompress_time_bit = 1, \ -.enable_get_snapshot_time_bit = 1, \ -.enable_get_from_memtable_time_bit = 1, \ -.enable_get_post_process_time_bit = 1, \ -.enable_get_from_output_files_time_bit = 1, \ -.enable_seek_on_memtable_time_bit = 1, \ -.enable_seek_child_seek_time_bit = 1, \ -.enable_seek_min_heap_time_bit = 1, \ -.enable_seek_max_heap_time_bit = 1, \ -.enable_seek_internal_seek_time_bit = 1, \ -.enable_find_next_user_entry_time_bit = 1, \ -.enable_write_wal_time_bit = 1, \ -.enable_write_memtable_time_bit = 1, \ -.enable_write_delay_time_bit = 1, \ -.enable_write_scheduling_flushes_compactions_time_bit = 1, \ -.enable_write_pre_and_post_process_time_bit = 1, \ -.enable_write_thread_wait_nanos_bit = 1, \ -.enable_merge_operator_time_nanos_bit = 1, \ -.enable_read_index_block_nanos_bit = 1, \ +#define PERF_FLAGS_INIT_LEVEL3 \ + PERF_FLAGS_INIT_LEVEL2, \ + .enable_measure_cpu_time_bit = 1, .enable_block_read_time_bit = 1, \ + .enable_block_checksum_time_bit = 1, \ + .enable_block_decompress_time_bit = 1, \ + .enable_get_snapshot_time_bit = 1, \ + .enable_get_from_memtable_time_bit = 1, \ + .enable_get_post_process_time_bit = 1, \ + .enable_get_from_output_files_time_bit = 1, \ + .enable_seek_on_memtable_time_bit = 1, \ + .enable_seek_child_seek_time_bit = 1, \ + .enable_seek_min_heap_time_bit = 1, .enable_seek_max_heap_time_bit = 1, \ + .enable_seek_internal_seek_time_bit = 1, \ + .enable_find_next_user_entry_time_bit = 1, \ + .enable_write_wal_time_bit = 1, .enable_write_memtable_time_bit = 1, \ + .enable_write_delay_time_bit = 1, \ + .enable_write_scheduling_flushes_compactions_time_bit = 1, \ + .enable_write_pre_and_post_process_time_bit = 1, \ + .enable_write_thread_wait_nanos_bit = 1, \ + .enable_merge_operator_time_nanos_bit = 1, \ + .enable_read_index_block_nanos_bit = 1, \ .enable_read_filter_block_nanos_bit = 1, \ .enable_new_table_block_iter_nanos_bit = 1, \ .enable_new_table_iterator_nanos_bit = 1, \ @@ -81,37 +78,22 @@ .enable_encrypt_data_nanos_bit = 1, \ .enable_decrypt_data_nanos_bit = 1 -#define PERF_FLAGS_INIT_LEVEL4 \ -.enable_iostats_cpu_timer_bit = 1, \ -.enable_get_cpu_nanos_bit = 1, \ -.enable_iter_next_cpu_nanos_bit = 1, \ -.enable_iter_prev_cpu_nanos_bit = 1, \ -.enable_iter_seek_cpu_nanos_bit = 1 +#define PERF_FLAGS_INIT_LEVEL4 \ + PERF_FLAGS_INIT_LEVEL3, \ + .enable_iostats_cpu_timer_bit = 1, .enable_get_cpu_nanos_bit = 1, \ + .enable_iter_next_cpu_nanos_bit = 1, \ + .enable_iter_prev_cpu_nanos_bit = 1, .enable_iter_seek_cpu_nanos_bit = 1 -#define PERF_FLAGS_INIT_LEVEL5 \ -.enable_db_mutex_lock_nanos_bit = 1, \ -.enable_db_condition_wait_nanos_bit = 1 \ +#define PERF_FLAGS_INIT_LEVEL5 \ + PERF_FLAGS_INIT_LEVEL4, .enable_db_mutex_lock_nanos_bit = 1, \ + .enable_db_condition_wait_nanos_bit = 1 namespace rocksdb { - -const PerfFlags PERF_LEVEL2 = { - PERF_FLAGS_INIT_LEVEL2 -}; -const PerfFlags PERF_LEVEL3 = { - PERF_FLAGS_INIT_LEVEL2, - PERF_FLAGS_INIT_LEVEL3 -}; -const PerfFlags PERF_LEVEL4 = { - PERF_FLAGS_INIT_LEVEL2, - PERF_FLAGS_INIT_LEVEL3, - PERF_FLAGS_INIT_LEVEL4 -}; -const PerfFlags PERF_LEVEL5 = { - PERF_FLAGS_INIT_LEVEL2, - PERF_FLAGS_INIT_LEVEL3, - PERF_FLAGS_INIT_LEVEL4, - PERF_FLAGS_INIT_LEVEL5 -}; +const PerfFlags PERF_LEVEL1 = {}; +const PerfFlags PERF_LEVEL2 = {PERF_FLAGS_INIT_LEVEL2}; +const PerfFlags PERF_LEVEL3 = {PERF_FLAGS_INIT_LEVEL3}; +const PerfFlags PERF_LEVEL4 = {PERF_FLAGS_INIT_LEVEL4}; +const PerfFlags PERF_LEVEL5 = {PERF_FLAGS_INIT_LEVEL5}; // set default value of perf_flags #ifdef ROCKSDB_SUPPORT_THREAD_LOCAL diff --git a/monitoring/perf_level.cc b/monitoring/perf_level.cc index e75b335106a..bb44bd11d8b 100644 --- a/monitoring/perf_level.cc +++ b/monitoring/perf_level.cc @@ -6,8 +6,7 @@ #include "rocksdb/perf_level.h" -#include - +#include #include #include "monitoring/perf_flags_imp.h" @@ -37,44 +36,16 @@ void SetPerfLevel(PerfLevel level) { } // perf_flags.perf_level = level; } -// get the estimated perf level PerfLevel GetPerfLevel() { - int cmp5 = memcmp(&perf_flags, &PERF_LEVEL5, sizeof(PerfFlags)); - if (cmp5 == 0) { - return kEnableTime; - } else if (cmp5 < 0) { - int cmp4 = memcmp(&perf_flags, &PERF_LEVEL4, sizeof(PerfFlags)); - if (cmp4 == 0) { - return kEnableTimeAndCPUTimeExceptForMutex; - } else if (cmp4 < 0) { - int cmp3 = memcmp(&perf_flags, &PERF_LEVEL3, sizeof(PerfFlags)); - if (cmp3 == 0) { - return kEnableTimeExceptForMutex; - } else if (cmp3 < 0) { - int cmp2 = memcmp(&perf_flags, &PERF_LEVEL2, sizeof(PerfFlags)); - if (cmp2 == 0) { - return kEnableCount; - } else if (cmp2 < 0) { - PerfFlags empt = {}; - int cmp1 = memcmp(&perf_flags, &empt, sizeof(PerfFlags)); - if (cmp1 == 0) { - return kDisable; - } else if (cmp1 < 0) { - abort(); - } else { - return kCustomFlags; - } - } else { - return kCustomFlags; - } - } else { - return kCustomFlags; - } - } else { - return kCustomFlags; - } - } else { - abort(); + void* levels[5] = {(void*)&PERF_LEVEL1, (void*)&PERF_LEVEL2, + (void*)&PERF_LEVEL3, (void*)&PERF_LEVEL4, + (void*)&PERF_LEVEL5}; + for (int i = 0; i < 5; ++i) { + int cmp = memcmp(&perf_flags, levels[i], sizeof(PerfFlags)); + if (cmp == 0) return (PerfLevel)(i + 1); + if (cmp < 0 && i == 0) return kOutOfBounds; + if (cmp < 0) return kCustomFlags; + if (cmp > 0 && i == 4) return kOutOfBounds; } }