From a70690834048c96306a614c7ce683c8dd0ba56ef Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 3 Oct 2016 18:28:37 -0400 Subject: [PATCH] os/bluestore: instrument cache blob and extent counts Signed-off-by: Sage Weil --- src/os/bluestore/BlueStore.cc | 13 +++++-- src/os/bluestore/BlueStore.h | 64 +++++++++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 2f680c012c2e5..5d224de65e8dd 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -1695,7 +1695,7 @@ void BlueStore::ExtentMap::decode_some(bufferlist& bl) uint64_t prev_len = 0; unsigned n = 0; while (!p.end()) { - Extent *le = new Extent(); + Extent *le = new Extent(onode->c->cache); uint64_t blobid; small_decode_varint(blobid, p); if ((blobid & BLOBID_FLAG_CONTIGUOUS) == 0) { @@ -2441,6 +2441,10 @@ void BlueStore::_init_logger() "Sum for onode-lookups hit in the cache"); b.add_u64(l_bluestore_onode_misses, "bluestore_onode_misses", "Sum for onode-lookups missed in the cache"); + b.add_u64(l_bluestore_extents, "bluestore_extents", + "Number of extents in cache"); + b.add_u64(l_bluestore_blobs, "bluestore_blobs", + "Number of blobs in cache"); b.add_u64(l_bluestore_buffers, "bluestore_buffers", "Number of buffers in cache"); b.add_u64(l_bluestore_buffer_bytes, "bluestore_buffer_bytes", @@ -4525,12 +4529,17 @@ void BlueStore::_reap_collections() void BlueStore::_update_cache_logger() { uint64_t num_onodes = 0; + uint64_t num_extents = 0; + uint64_t num_blobs = 0; uint64_t num_buffers = 0; uint64_t num_buffer_bytes = 0; for (auto c : cache_shards) { - c->add_stats(&num_onodes, &num_buffers, &num_buffer_bytes); + c->add_stats(&num_onodes, &num_extents, &num_blobs, + &num_buffers, &num_buffer_bytes); } logger->set(l_bluestore_onodes, num_onodes); + logger->set(l_bluestore_extents, num_extents); + logger->set(l_bluestore_blobs, num_blobs); logger->set(l_bluestore_buffers, num_buffers); logger->set(l_bluestore_buffer_bytes, num_buffer_bytes); } diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 04c42b4cacdcf..744a43a6606e8 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -75,6 +75,8 @@ enum { l_bluestore_onodes, l_bluestore_onode_hits, l_bluestore_onode_misses, + l_bluestore_extents, + l_bluestore_blobs, l_bluestore_buffers, l_bluestore_buffer_bytes, l_bluestore_buffer_hit_bytes, @@ -207,10 +209,17 @@ public: Cache *cache; map writing_map; - BufferSpace(Cache *c) : cache(c) {} + BufferSpace(Cache *c) : cache(c) { + if (cache) { + cache->add_blob(); + } + } ~BufferSpace() { assert(buffer_map.empty()); assert(writing_map.empty()); + if (cache) { + cache->rm_blob(); + } } void _add_buffer(Buffer *b, int level, Buffer *near) { @@ -512,10 +521,24 @@ public: uint8_t blob_depth; /// blob overlapping count BlobRef blob; ///< the blob with our data - explicit Extent() {} - explicit Extent(uint32_t lo) : logical_offset(lo) {} + /// ctor for lookup only + explicit Extent(uint32_t lo) : logical_offset(lo) { } + /// ctor for delayed intitialization (see decode_some()) + explicit Extent(Cache *cache) { + cache->add_extent(); + } + /// ctor for general usage Extent(uint32_t lo, uint32_t o, uint32_t l, uint8_t bd, BlobRef& b) - : logical_offset(lo), blob_offset(o), length(l), blob_depth(bd), blob(b){} + : logical_offset(lo), blob_offset(o), length(l), blob_depth(bd), blob(b) { + if (blob) { + blob->shared_blob->bc.cache->add_extent(); + } + } + ~Extent() { + if (blob) { + blob->shared_blob->bc.cache->rm_extent(); + } + } // comparators for intrusive_set friend bool operator<(const Extent &a, const Extent &b) { @@ -702,6 +725,9 @@ public: PerfCounters *logger; std::recursive_mutex lock; ///< protect lru and other structures + std::atomic num_extents = {0}; + std::atomic num_blobs = {0}; + static Cache *create(string type, PerfCounters *logger); virtual ~Cache() {} @@ -715,9 +741,25 @@ public: virtual void _adjust_buffer_size(Buffer *b, int64_t delta) = 0; virtual void _touch_buffer(Buffer *b) = 0; + void add_extent() { + ++num_extents; + } + void rm_extent() { + --num_extents; + } + + void add_blob() { + ++num_blobs; + } + void rm_blob() { + --num_blobs; + } + virtual void trim(uint64_t onode_max, uint64_t buffer_max) = 0; - virtual void add_stats(uint64_t *onodes, uint64_t *buffers, + virtual void add_stats(uint64_t *onodes, uint64_t *extents, + uint64_t *blobs, + uint64_t *buffers, uint64_t *bytes) = 0; #ifdef DEBUG_CACHE @@ -791,10 +833,14 @@ public: void trim(uint64_t onode_max, uint64_t buffer_max) override; - void add_stats(uint64_t *onodes, uint64_t *buffers, + void add_stats(uint64_t *onodes, uint64_t *extents, + uint64_t *blobs, + uint64_t *buffers, uint64_t *bytes) override { std::lock_guard l(lock); *onodes += onode_lru.size(); + *extents += num_extents; + *blobs += num_blobs; *buffers += buffer_lru.size(); *bytes += buffer_size; } @@ -874,10 +920,14 @@ public: void trim(uint64_t onode_max, uint64_t buffer_max) override; - void add_stats(uint64_t *onodes, uint64_t *buffers, + void add_stats(uint64_t *onodes, uint64_t *extents, + uint64_t *blobs, + uint64_t *buffers, uint64_t *bytes) override { std::lock_guard l(lock); *onodes += onode_lru.size(); + *extents += num_extents; + *blobs += num_blobs; *buffers += buffer_hot.size() + buffer_warm_in.size(); *bytes += buffer_bytes; } -- 2.39.5