summaryrefslogtreecommitdiffstats
path: root/src/kv/KeyValueHistogram.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/kv/KeyValueHistogram.cc')
-rw-r--r--src/kv/KeyValueHistogram.cc78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/kv/KeyValueHistogram.cc b/src/kv/KeyValueHistogram.cc
new file mode 100644
index 000000000..5015225d5
--- /dev/null
+++ b/src/kv/KeyValueHistogram.cc
@@ -0,0 +1,78 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "include/stringify.h"
+#include "KeyValueHistogram.h"
+using std::map;
+using std::string;
+using ceph::Formatter;
+
+#define KEY_SLAB 32
+#define VALUE_SLAB 64
+
+int KeyValueHistogram::get_key_slab(size_t sz)
+{
+ return (sz / KEY_SLAB);
+}
+
+string KeyValueHistogram::get_key_slab_to_range(int slab)
+{
+ int lower_bound = slab * KEY_SLAB;
+ int upper_bound = (slab + 1) * KEY_SLAB;
+ string ret = "[" + stringify(lower_bound) + "," + stringify(upper_bound) + ")";
+ return ret;
+}
+
+int KeyValueHistogram::get_value_slab(size_t sz)
+{
+ return (sz / VALUE_SLAB);
+}
+
+string KeyValueHistogram::get_value_slab_to_range(int slab)
+{
+ int lower_bound = slab * VALUE_SLAB;
+ int upper_bound = (slab + 1) * VALUE_SLAB;
+ string ret = "[" + stringify(lower_bound) + "," + stringify(upper_bound) + ")";
+ return ret;
+}
+
+void KeyValueHistogram::update_hist_entry(map<string, map<int, struct key_dist> >& key_hist,
+ const string& prefix, size_t key_size, size_t value_size)
+{
+ uint32_t key_slab = get_key_slab(key_size);
+ uint32_t value_slab = get_value_slab(value_size);
+ key_hist[prefix][key_slab].count++;
+ key_hist[prefix][key_slab].max_len =
+ std::max<size_t>(key_size, key_hist[prefix][key_slab].max_len);
+ key_hist[prefix][key_slab].val_map[value_slab].count++;
+ key_hist[prefix][key_slab].val_map[value_slab].max_len =
+ std::max<size_t>(value_size,
+ key_hist[prefix][key_slab].val_map[value_slab].max_len);
+}
+
+void KeyValueHistogram::dump(Formatter* f)
+{
+ f->open_object_section("rocksdb_value_distribution");
+ for (auto i : value_hist) {
+ f->dump_unsigned(get_value_slab_to_range(i.first).data(), i.second);
+ }
+ f->close_section();
+
+ f->open_object_section("rocksdb_key_value_histogram");
+ for (auto i : key_hist) {
+ f->dump_string("prefix", i.first);
+ f->open_object_section("key_hist");
+ for (auto k : i.second) {
+ f->dump_unsigned(get_key_slab_to_range(k.first).data(), k.second.count);
+ f->dump_unsigned("max_len", k.second.max_len);
+ f->open_object_section("value_hist");
+ for (auto j : k.second.val_map) {
+ f->dump_unsigned(get_value_slab_to_range(j.first).data(), j.second.count);
+ f->dump_unsigned("max_len", j.second.max_len);
+ }
+ f->close_section();
+ }
+ f->close_section();
+ }
+ f->close_section();
+}