in src/server/server.cc [859:964]
Server::InfoEntries Server::GetRocksDBInfo() {
InfoEntries entries;
if (is_loading_) return entries;
rocksdb::DB *db = storage->GetDB();
uint64_t memtable_sizes = 0, cur_memtable_sizes = 0, num_snapshots = 0, num_running_flushes = 0;
uint64_t num_immutable_tables = 0, memtable_flush_pending = 0, compaction_pending = 0;
uint64_t num_running_compaction = 0, num_live_versions = 0, num_super_version = 0, num_background_errors = 0;
db->GetAggregatedIntProperty("rocksdb.size-all-mem-tables", &memtable_sizes);
db->GetAggregatedIntProperty("rocksdb.cur-size-all-mem-tables", &cur_memtable_sizes);
db->GetAggregatedIntProperty("rocksdb.num-immutable-mem-table", &num_immutable_tables);
db->GetAggregatedIntProperty("rocksdb.mem-table-flush-pending", &memtable_flush_pending);
db->GetAggregatedIntProperty("rocksdb.current-super-version-number", &num_super_version);
db->GetAggregatedIntProperty("rocksdb.background-errors", &num_background_errors);
db->GetAggregatedIntProperty("rocksdb.compaction-pending", &compaction_pending);
db->GetAggregatedIntProperty("rocksdb.num-live-versions", &num_live_versions);
{
// All column families share the same block cache, so it's good to count a single one.
uint64_t block_cache_usage = 0;
uint64_t block_cache_pinned_usage = 0;
auto subkey_cf_handle = storage->GetCFHandle(ColumnFamilyID::PrimarySubkey);
db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kBlockCacheUsage, &block_cache_usage);
entries.emplace_back("block_cache_usage", block_cache_usage);
db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kBlockCachePinnedUsage, &block_cache_pinned_usage);
entries.emplace_back("block_cache_pinned_usage[" + subkey_cf_handle->GetName() + "]", block_cache_pinned_usage);
// All column faimilies share the same property of the DB, so it's good to count a single one.
db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kNumSnapshots, &num_snapshots);
db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kNumRunningFlushes, &num_running_flushes);
db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kNumRunningCompactions, &num_running_compaction);
}
for (const auto &cf_handle : *storage->GetCFHandles()) {
uint64_t estimate_keys = 0;
uint64_t index_and_filter_cache_usage = 0;
std::map<std::string, std::string> cf_stats_map;
db->GetIntProperty(cf_handle, rocksdb::DB::Properties::kEstimateNumKeys, &estimate_keys);
entries.emplace_back("estimate_keys[" + cf_handle->GetName() + "]", estimate_keys);
db->GetIntProperty(cf_handle, rocksdb::DB::Properties::kEstimateTableReadersMem, &index_and_filter_cache_usage);
entries.emplace_back("index_and_filter_cache_usage[" + cf_handle->GetName() + "]", index_and_filter_cache_usage);
db->GetMapProperty(cf_handle, rocksdb::DB::Properties::kCFStats, &cf_stats_map);
entries.emplace_back("level0_file_limit_slowdown[" + cf_handle->GetName() + "]",
cf_stats_map["l0-file-count-limit-delays"]);
entries.emplace_back("level0_file_limit_stop[" + cf_handle->GetName() + "]",
cf_stats_map["l0-file-count-limit-stops"]);
entries.emplace_back("pending_compaction_bytes_slowdown[" + cf_handle->GetName() + "]",
cf_stats_map["pending-compaction-bytes-delays"]);
entries.emplace_back("pending_compaction_bytes_stop[" + cf_handle->GetName() + "]",
cf_stats_map["pending-compaction-bytes-stops"]);
entries.emplace_back("level0_file_limit_stop_with_ongoing_compaction[" + cf_handle->GetName() + "]",
cf_stats_map["cf-l0-file-count-limit-stops-with-ongoing-compaction"]);
entries.emplace_back("level0_file_limit_slowdown_with_ongoing_compaction[" + cf_handle->GetName() + "]",
cf_stats_map["cf-l0-file-count-limit-delays-with-ongoing-compaction"]);
entries.emplace_back("memtable_count_limit_slowdown[" + cf_handle->GetName() + "]",
cf_stats_map["memtable-limit-delays"]);
entries.emplace_back("memtable_count_limit_stop[" + cf_handle->GetName() + "]",
cf_stats_map["memtable-limit-stops"]);
}
auto rocksdb_stats = storage->GetDB()->GetDBOptions().statistics;
if (rocksdb_stats) {
std::map<std::string, uint32_t> block_cache_stats = {
{"block_cache_hit", rocksdb::Tickers::BLOCK_CACHE_HIT},
{"block_cache_index_hit", rocksdb::Tickers::BLOCK_CACHE_INDEX_HIT},
{"block_cache_filter_hit", rocksdb::Tickers::BLOCK_CACHE_FILTER_HIT},
{"block_cache_data_hit", rocksdb::Tickers::BLOCK_CACHE_DATA_HIT},
{"block_cache_miss", rocksdb::Tickers::BLOCK_CACHE_MISS},
{"block_cache_index_miss", rocksdb::Tickers::BLOCK_CACHE_INDEX_MISS},
{"block_cache_filter_miss", rocksdb::Tickers::BLOCK_CACHE_FILTER_MISS},
{"block_cache_data_miss", rocksdb::Tickers::BLOCK_CACHE_DATA_MISS},
};
for (const auto &iter : block_cache_stats) {
entries.emplace_back(iter.first, rocksdb_stats->getTickerCount(iter.second));
}
}
entries.emplace_back("all_mem_tables", memtable_sizes);
entries.emplace_back("cur_mem_tables", cur_memtable_sizes);
entries.emplace_back("snapshots", num_snapshots);
entries.emplace_back("num_immutable_tables", num_immutable_tables);
entries.emplace_back("num_running_flushes", num_running_flushes);
entries.emplace_back("memtable_flush_pending", memtable_flush_pending);
entries.emplace_back("compaction_pending", compaction_pending);
entries.emplace_back("num_running_compactions", num_running_compaction);
entries.emplace_back("num_live_versions", num_live_versions);
entries.emplace_back("num_super_version", num_super_version);
entries.emplace_back("num_background_errors", num_background_errors);
auto db_stats = storage->GetDBStats();
entries.emplace_back("flush_count", db_stats->flush_count.load());
entries.emplace_back("compaction_count", db_stats->compaction_count.load());
entries.emplace_back("put_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_PUT));
entries.emplace_back("get_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_GET) +
stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_MULTIGET));
entries.emplace_back("seek_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_SEEK));
entries.emplace_back("next_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_NEXT));
entries.emplace_back("prev_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_PREV));
db_job_mu_.lock();
entries.emplace_back("is_bgsaving", (is_bgsave_in_progress_ ? "yes" : "no"));
entries.emplace_back("is_compacting", (db_compacting_ ? "yes" : "no"));
db_job_mu_.unlock();
return entries;
}