]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/bluestore: instrument cache blob and extent counts
authorSage Weil <sage@redhat.com>
Mon, 3 Oct 2016 22:28:37 +0000 (18:28 -0400)
committerSage Weil <sage@redhat.com>
Mon, 3 Oct 2016 22:42:03 +0000 (18:42 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index 2f680c012c2e56ca5a678caab42a6041f500fd7c..5d224de65e8dd528b7ad26c8b64965a83b5829ae 100644 (file)
@@ -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);
 }
index 04c42b4cacdcf9e7056e06811ecd1add1da9ebb5..744a43a6606e8ca7de00cdf0117ac8857f946e37 100644 (file)
@@ -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<uint64_t, state_list_t> 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<uint64_t> num_extents = {0};
+    std::atomic<uint64_t> 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<std::recursive_mutex> 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<std::recursive_mutex> l(lock);
       *onodes += onode_lru.size();
+      *extents += num_extents;
+      *blobs += num_blobs;
       *buffers += buffer_hot.size() + buffer_warm_in.size();
       *bytes += buffer_bytes;
     }