b632ed0c67
Summary: For tiered storage project, we need to know the block read count and read bytes of files with different temperature. Add FileIOByTemperature to IOStatsContext and collect the bytes read and read count from different temperature files through the RandomAccessFileReader. Pull Request resolved: https://github.com/facebook/rocksdb/pull/8710 Test Plan: make check, add the testing cases Reviewed By: siying Differential Revision: D30582400 Pulled By: zhichao-cao fbshipit-source-id: d83173de594374fc8404af5ce93a6a9be72c7141
83 lines
2.7 KiB
C++
83 lines
2.7 KiB
C++
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
// (found in the LICENSE.Apache file in the root directory).
|
|
|
|
#include <sstream>
|
|
#include "monitoring/iostats_context_imp.h"
|
|
#include "rocksdb/env.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
#ifdef NIOSTATS_CONTEXT
|
|
// Should not be used because the counters are not thread-safe.
|
|
// Put here just to make get_iostats_context() simple without ifdef.
|
|
static IOStatsContext iostats_context;
|
|
#elif defined(ROCKSDB_SUPPORT_THREAD_LOCAL)
|
|
__thread IOStatsContext iostats_context;
|
|
#else
|
|
#error \
|
|
"No thread-local support. Disable iostats context with -DNIOSTATS_CONTEXT."
|
|
#endif
|
|
|
|
IOStatsContext* get_iostats_context() {
|
|
return &iostats_context;
|
|
}
|
|
|
|
void IOStatsContext::Reset() {
|
|
#ifndef NIOSTATS_CONTEXT
|
|
thread_pool_id = Env::Priority::TOTAL;
|
|
bytes_read = 0;
|
|
bytes_written = 0;
|
|
open_nanos = 0;
|
|
allocate_nanos = 0;
|
|
write_nanos = 0;
|
|
read_nanos = 0;
|
|
range_sync_nanos = 0;
|
|
prepare_write_nanos = 0;
|
|
fsync_nanos = 0;
|
|
logger_nanos = 0;
|
|
cpu_write_nanos = 0;
|
|
cpu_read_nanos = 0;
|
|
file_io_stats_by_temperature.Reset();
|
|
#endif //! NIOSTATS_CONTEXT
|
|
}
|
|
|
|
#define IOSTATS_CONTEXT_OUTPUT(counter) \
|
|
if (!exclude_zero_counters || counter > 0) { \
|
|
ss << #counter << " = " << counter << ", "; \
|
|
}
|
|
|
|
std::string IOStatsContext::ToString(bool exclude_zero_counters) const {
|
|
#ifdef NIOSTATS_CONTEXT
|
|
(void)exclude_zero_counters;
|
|
return "";
|
|
#else
|
|
std::ostringstream ss;
|
|
IOSTATS_CONTEXT_OUTPUT(thread_pool_id);
|
|
IOSTATS_CONTEXT_OUTPUT(bytes_read);
|
|
IOSTATS_CONTEXT_OUTPUT(bytes_written);
|
|
IOSTATS_CONTEXT_OUTPUT(open_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(allocate_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(write_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(read_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(range_sync_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(fsync_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(prepare_write_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(logger_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(cpu_write_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(cpu_read_nanos);
|
|
IOSTATS_CONTEXT_OUTPUT(file_io_stats_by_temperature.hot_file_bytes_read);
|
|
IOSTATS_CONTEXT_OUTPUT(file_io_stats_by_temperature.warm_file_bytes_read);
|
|
IOSTATS_CONTEXT_OUTPUT(file_io_stats_by_temperature.cold_file_bytes_read);
|
|
IOSTATS_CONTEXT_OUTPUT(file_io_stats_by_temperature.hot_file_read_count);
|
|
IOSTATS_CONTEXT_OUTPUT(file_io_stats_by_temperature.warm_file_read_count);
|
|
IOSTATS_CONTEXT_OUTPUT(file_io_stats_by_temperature.cold_file_read_count);
|
|
std::string str = ss.str();
|
|
str.erase(str.find_last_not_of(", ") + 1);
|
|
return str;
|
|
#endif //! NIOSTATS_CONTEXT
|
|
}
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|