From 0967e8a974fbd9b1a6c5942d5daab12bb44a0c0e Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Tue, 31 Mar 2020 13:04:54 +0000 Subject: add some simple statistics when exploring state --- searchlib/src/vespa/searchlib/tensor/hnsw_graph.cpp | 19 +++++++++++++++++++ searchlib/src/vespa/searchlib/tensor/hnsw_graph.h | 2 ++ searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp | 7 +++++++ 3 files changed, 28 insertions(+) (limited to 'searchlib') diff --git a/searchlib/src/vespa/searchlib/tensor/hnsw_graph.cpp b/searchlib/src/vespa/searchlib/tensor/hnsw_graph.cpp index db8d1067980..6f902a30861 100644 --- a/searchlib/src/vespa/searchlib/tensor/hnsw_graph.cpp +++ b/searchlib/src/vespa/searchlib/tensor/hnsw_graph.cpp @@ -50,4 +50,23 @@ HnswGraph::set_link_array(uint32_t docid, uint32_t level, const LinkArrayRef& ne links.remove(old_links_ref); } +std::vector +HnswGraph::level_histogram() const +{ + std::vector result; + size_t num_nodes = node_refs.size(); + for (size_t i = 0; i < num_nodes; ++i) { + uint32_t levels = 0; + auto node_ref = node_refs[i].load_acquire(); + if (node_ref.valid()) { + levels = nodes.get(node_ref).size(); + } + while (result.size() <= levels) { + result.push_back(0); + } + ++result[levels]; + } + return result; +} + } // namespace diff --git a/searchlib/src/vespa/searchlib/tensor/hnsw_graph.h b/searchlib/src/vespa/searchlib/tensor/hnsw_graph.h index 64892d06f09..233b9087af7 100644 --- a/searchlib/src/vespa/searchlib/tensor/hnsw_graph.h +++ b/searchlib/src/vespa/searchlib/tensor/hnsw_graph.h @@ -69,6 +69,8 @@ struct HnswGraph { } size_t size() const { return node_refs.size(); } + + std::vector level_histogram() const; }; } diff --git a/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp b/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp index de6daba650c..10be90a7f30 100644 --- a/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp +++ b/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp @@ -381,6 +381,13 @@ HnswIndex::get_state(const vespalib::slime::Inserter& inserter) const { auto& object = inserter.insertObject(); StateExplorerUtils::memory_usage_to_slime(memory_usage(), object.setObject("memory_usage")); + object.setLong("nodes", _graph.size()); + auto& level_histogram = object.setArray("level_histogram"); + for (uint32_t hist_val : _graph.level_histogram()) { + level_histogram.addLong(hist_val); + } + object.setLong("entry_docid", _graph.entry_docid); + object.setLong("entry_level", _graph.entry_level); } std::unique_ptr -- cgit v1.2.3