OPTION(rocksdb_index_type, OPT_STR, "binary_search") // Type of index for SST files: binary_search, hash_search, two_level
OPTION(rocksdb_partition_filters, OPT_BOOL, false) // (experimental) partition SST index/filters into smaller blocks
OPTION(rocksdb_metadata_block_size, OPT_INT, 4*1024) // The block size for index partitions (0 = rocksdb default)
+OPTION(rocksdb_perf, OPT_BOOL, false) // Enabling this will have 5-10% impact on performance for the stats collection
+OPTION(rocksdb_collect_compaction_stats, OPT_BOOL, false) //For rocksdb, this behavior will be an overhead of 5%~10%, collected only rocksdb_perf is enabled.
+OPTION(rocksdb_collect_extended_stats, OPT_BOOL, false) //For rocksdb, this behavior will be an overhead of 5%~10%, collected only rocksdb_perf is enabled.
+OPTION(rocksdb_collect_memory_stats, OPT_BOOL, false) //For rocksdb, this behavior will be an overhead of 5%~10%, collected only rocksdb_perf is enabled.
// rocksdb options that will be used for omap(if omap_backend is rocksdb)
OPTION(filestore_rocksdb_options, OPT_STR, "compaction_readahead_size=2097152")
#include "common/perf_counters.h"
#include "common/debug.h"
#include "include/str_list.h"
+#include "include/stringify.h"
#include "include/str_map.h"
#include "KeyValueDB.h"
#include "RocksDBStore.h"
return -EINVAL;
}
}
+
+ if (g_conf->rocksdb_perf) {
+ dbstats = rocksdb::CreateDBStatistics();
+ opt.statistics = dbstats;
+ }
+
opt.create_if_missing = create_if_missing;
if (g_conf->rocksdb_separate_wal_dir) {
opt.wal_dir = path + ".wal";
cct->get_perfcounters_collection()->remove(logger);
}
+void RocksDBStore::get_statistics(Formatter *f)
+{
+ if (!g_conf->rocksdb_perf) {
+ dout(20) << __func__ << "RocksDB perf is disabled, can't probe for stats"
+ << dendl;
+ return;
+ }
+
+ if (g_conf->rocksdb_collect_compaction_stats) {
+ std::string stats;
+ bool status = db->GetProperty("rocksdb.stats", &stats);
+ if (status) {
+ f->open_object_section("rocksdb_statistics");
+ f->dump_string("rocksdb_compaction_statistics", stats);
+ f->close_section();
+ }
+ }
+ if (g_conf->rocksdb_collect_extended_stats) {
+ if (dbstats) {
+ f->open_object_section("rocksdb_extended_statistics");
+ f->dump_string("rocksdb_extended_statistics", dbstats->ToString().c_str());
+ f->close_section();
+ }
+ f->open_object_section("rocksdbstore_perf_counters");
+ logger->dump_formatted(f,0);
+ f->close_section();
+ }
+ if (g_conf->rocksdb_collect_memory_stats) {
+ f->open_object_section("rocksdb_memtable_statistics");
+ std::string str(stringify(bbt_opts.block_cache->GetUsage()));
+ f->dump_string("block_cache_usage", str.data());
+ str.clear();
+ str.append(stringify(bbt_opts.block_cache->GetPinnedUsage()));
+ f->dump_string("block_cache_pinned_blocks_usage", str);
+ str.clear();
+ db->GetProperty("rocksdb.cur-size-all-mem-tables", &str);
+ f->dump_string("rocksdb_memtable_usage", str);
+ f->close_section();
+ }
+}
+
int RocksDBStore::submit_transaction(KeyValueDB::Transaction t)
{
utime_t start = ceph_clock_now(g_ceph_context);
}
}
-ew/delete
int RocksDBStore::get(
const string &prefix,
const std::set<string> &keys,
#include <memory>
#include <boost/scoped_ptr.hpp>
#include "rocksdb/write_batch.h"
+#include "rocksdb/perf_context.h"
+#include "rocksdb/iostats_context.h"
+#include "rocksdb/statistics.h"
+#include "rocksdb/table.h"
#include <errno.h>
#include "common/errno.h"
#include "common/dout.h"
class Iterator;
class Logger;
struct Options;
+ struct BlockBasedTableOptions;
}
extern rocksdb::Logger *create_rocksdb_ceph_logger();
void *priv;
rocksdb::DB *db;
rocksdb::Env *env;
+ std::shared_ptr<rocksdb::Statistics> dbstats;
+ rocksdb::BlockBasedTableOptions bbt_opts;
string options_str;
+
int do_open(ostream &out, bool create_if_missing);
// manage async compactions
priv(p),
db(NULL),
env(static_cast<rocksdb::Env*>(p)),
+ dbstats(NULL),
compact_queue_lock("RocksDBStore::compact_thread_lock"),
compact_queue_stop(false),
compact_thread(this),
int create_and_open(ostream &out);
void close();
+
+ void get_statistics(Formatter *f);
+
struct RocksWBHandler: public rocksdb::WriteBatch::Handler {
std::string seen ;
int num_seen = 0;