From cfd4d0f680dbb44c5f0cecc2cfccfad9cf573df2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Dziepak?= Date: Tue, 29 Nov 2016 15:24:58 +0000 Subject: [PATCH] db: add metrics for short reads and memory used for results MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Paweł Dziepak --- database.cc | 27 +++++++++++++++++++++++++++ database.hh | 3 +++ query-result.hh | 8 +++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/database.cc b/database.cc index b7e22bc44a..2341908007 100644 --- a/database.cc +++ b/database.cc @@ -1813,6 +1813,27 @@ database::setup_collectd() { , "queue_length", "queued_reads_system_keyspace") , scollectd::make_typed(scollectd::data_type::GAUGE, [this] { return _system_read_concurrency_sem.waiters(); }) )); + + _collectd.push_back( + scollectd::add_polled_metric(scollectd::type_instance_id("database" + , scollectd::per_cpu_plugin_instance + , "bytes", "total_result_memory") + , scollectd::make_typed(scollectd::data_type::GAUGE, [this] { + return get_result_memory_limiter().total_used_memory(); + }) + )); + _collectd.push_back( + scollectd::add_polled_metric(scollectd::type_instance_id("database" + , scollectd::per_cpu_plugin_instance + , "total_operations", "short_data_queries") + , scollectd::make_typed(scollectd::data_type::DERIVE, _stats->short_data_queries) + )); + _collectd.push_back( + scollectd::add_polled_metric(scollectd::type_instance_id("database" + , scollectd::per_cpu_plugin_instance + , "total_operations", "short_mutation_queries") + , scollectd::make_typed(scollectd::data_type::DERIVE, _stats->short_mutation_queries) + )); } database::~database() { @@ -2413,6 +2434,9 @@ database::query(schema_ptr s, const query::read_command& cmd, query::result_requ ++s->total_reads_failed; } else { ++s->total_reads; + auto result = f.get0(); + s->short_data_queries += bool(result->is_short_read()); + return make_ready_future>(std::move(result)); } return f; }); @@ -2428,6 +2452,9 @@ database::query_mutations(schema_ptr s, const query::read_command& cmd, const qu ++s->total_reads_failed; } else { ++s->total_reads; + auto result = f.get0(); + s->short_mutation_queries += bool(result.is_short_read()); + return make_ready_future(std::move(result)); } return f; }); diff --git a/database.hh b/database.hh index 47eb01cd84..7d39610197 100644 --- a/database.hh +++ b/database.hh @@ -1049,6 +1049,9 @@ private: uint64_t total_reads = 0; uint64_t total_reads_failed = 0; uint64_t sstable_read_queue_overloaded = 0; + + uint64_t short_data_queries = 0; + uint64_t short_mutation_queries = 0; }; lw_shared_ptr _stats; diff --git a/query-result.hh b/query-result.hh index 91c526ca79..ee2e7c51c2 100644 --- a/query-result.hh +++ b/query-result.hh @@ -49,18 +49,24 @@ namespace query { class result_memory_accounter; class result_memory_limiter { + const size_t _maximum_total_result_memory; semaphore _memory_limiter; public: static constexpr size_t minimum_result_size = 4 * 1024; static constexpr size_t maximum_result_size = 1 * 1024 * 1024; public: result_memory_limiter() - : _memory_limiter(memory::stats().total_memory() / 10) + : _maximum_total_result_memory(memory::stats().total_memory() / 10) + , _memory_limiter(_maximum_total_result_memory) { } result_memory_limiter(const result_memory_limiter&) = delete; result_memory_limiter(result_memory_limiter&&) = delete; + ssize_t total_used_memory() const { + return _maximum_total_result_memory - _memory_limiter.available_units(); + } + // Reserves minimum_result_size and creates new memory accounter. future new_read();