]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: introduce l_bluestore_write_deferred_bytes perf counter.
authorIgor Fedotov <ifedotov@suse.com>
Fri, 6 Aug 2021 23:22:12 +0000 (02:22 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Tue, 10 Aug 2021 11:34:15 +0000 (14:34 +0300)
Signed-off-by: Igor Fedotov <ifedotov@suse.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h
src/test/objectstore/store_test.cc

index 20bc17b244938cd3283325c1e62d61a5e69006db..b6809e8464bc469258abe8e04d7c852331a57917 100644 (file)
@@ -4989,7 +4989,10 @@ void BlueStore::_init_logger()
                    "Small writes into unused portion of existing blob");
   b.add_u64_counter(l_bluestore_write_deferred,
                    "bluestore_write_deferred",
-                   "Overwrites using deferred");
+                   "Total deferred writes submitted");
+  b.add_u64_counter(l_bluestore_write_deferred_bytes,
+                   "bluestore_write_deferred_bytes",
+                   "Total bytes submitted as deferred writes");
   b.add_u64_counter(l_bluestore_write_small_pre_read,
                    "bluestore_write_small_pre_read",
                    "Small writes that required we read some data (possibly "
@@ -12492,12 +12495,14 @@ void BlueStore::_zoned_clean_zone(uint64_t zone_num) {
 #endif
 
 bluestore_deferred_op_t *BlueStore::_get_deferred_op(
-  TransContext *txc)
+  TransContext *txc, uint64_t len)
 {
   if (!txc->deferred_txn) {
     txc->deferred_txn = new bluestore_deferred_transaction_t;
   }
   txc->deferred_txn->ops.push_back(bluestore_deferred_op_t());
+  logger->inc(l_bluestore_write_deferred);
+  logger->inc(l_bluestore_write_deferred_bytes, len);
   return &txc->deferred_txn->ops.back();
 }
 
@@ -13470,7 +13475,7 @@ void BlueStore::_do_write_small(
            if (b_len < prefer_deferred_size) {
              dout(20) << __func__ << " deferring small 0x" << std::hex
                       << b_len << std::dec << " unused write via deferred" << dendl;
-             bluestore_deferred_op_t *op = _get_deferred_op(txc);
+             bluestore_deferred_op_t *op = _get_deferred_op(txc, bl.length());
              op->op = bluestore_deferred_op_t::OP_WRITE;
              b->get_blob().map(
                b_off, b_len,
@@ -13479,7 +13484,6 @@ void BlueStore::_do_write_small(
                  return 0;
                });
              op->data = bl;
-             logger->inc(l_bluestore_write_deferred);
            } else {
              b->get_blob().map_bl(
                b_off, bl,
@@ -13559,7 +13563,7 @@ void BlueStore::_do_write_small(
          b->dirty_blob().calc_csum(b_off, bl);
 
          if (!g_conf()->bluestore_debug_omit_block_device_write) {
-           bluestore_deferred_op_t *op = _get_deferred_op(txc);
+           bluestore_deferred_op_t *op = _get_deferred_op(txc, bl.length());
            op->op = bluestore_deferred_op_t::OP_WRITE;
            int r = b->get_blob().map(
              b_off, b_len,
@@ -13579,7 +13583,6 @@ void BlueStore::_do_write_small(
          b->dirty_blob().mark_used(le->blob_offset, le->length);
          txc->statfs_delta.stored() += le->length;
          dout(20) << __func__ << "  lex " << *le << dendl;
-         logger->inc(l_bluestore_write_deferred);
          return;
        }
        // try to reuse blob if we can
@@ -13821,7 +13824,7 @@ void BlueStore::_do_write_big_apply_deferred(
   txc->statfs_delta.stored() += le->length;
 
   if (!g_conf()->bluestore_debug_omit_block_device_write) {
-    bluestore_deferred_op_t* op = _get_deferred_op(txc);
+    bluestore_deferred_op_t* op = _get_deferred_op(txc, bl.length());
     op->op = bluestore_deferred_op_t::OP_WRITE;
     op->extents.swap(dctx.res_extents);
     op->data = std::move(bl);
@@ -14308,7 +14311,7 @@ int BlueStore::_do_alloc_write(
       if (l->length() < prefer_deferred_size.load()) {
        dout(20) << __func__ << " deferring 0x" << std::hex
                 << l->length() << std::dec << " write via deferred" << dendl;
-       bluestore_deferred_op_t *op = _get_deferred_op(txc);
+       bluestore_deferred_op_t *op = _get_deferred_op(txc, l->length());
        op->op = bluestore_deferred_op_t::OP_WRITE;
        int r = wi.b->get_blob().map(
          b_off, l->length(),
@@ -14318,7 +14321,6 @@ int BlueStore::_do_alloc_write(
          });
         ceph_assert(r == 0);
        op->data = *l;
-       logger->inc(l_bluestore_write_deferred);
       } else {
        wi.b->get_blob().map_bl(
          b_off, *l,
index a73b3b853359bfbab5b90f17b63b8d9bb18e643a..8052d9055a2a37011934d2e7060ffa3e4ae5b795 100644 (file)
@@ -126,6 +126,7 @@ enum {
   l_bluestore_write_small_bytes,
   l_bluestore_write_small_unused,
   l_bluestore_write_deferred,
+  l_bluestore_write_deferred_bytes,
   l_bluestore_write_small_pre_read,
   l_bluestore_write_new,
   l_bluestore_txc,
@@ -2480,7 +2481,7 @@ private:
   void _zoned_clean_zone(uint64_t zone_num);
 #endif
 
-  bluestore_deferred_op_t *_get_deferred_op(TransContext *txc);
+  bluestore_deferred_op_t *_get_deferred_op(TransContext *txc, uint64_t len);
   void _deferred_queue(TransContext *txc);
 public:
   void deferred_try_submit();
index 5ecc953d13686f3dea86b51c03887a59654013b3..89818d50077fd8f3d81be9de947b4cffbe48352b 100644 (file)
@@ -7460,6 +7460,7 @@ TEST_P(StoreTestSpecificAUSize, DeferredOnBigOverwrite2) {
     ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 2u);
     ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 0u);
     ASSERT_EQ(logger->get(l_bluestore_write_deferred), 0u);
+    ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 0);
   }
 
   logger->reset();
@@ -7477,7 +7478,8 @@ TEST_P(StoreTestSpecificAUSize, DeferredOnBigOverwrite2) {
     ASSERT_EQ(logger->get(l_bluestore_write_big_bytes), bl.length());
     ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 4u);
     ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 2u);
-    ASSERT_EQ(logger->get(l_bluestore_write_deferred), 2u);
+    ASSERT_EQ(logger->get(l_bluestore_write_deferred), 4u);
+    ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 2 * 65536);
   }
 
   {
@@ -7533,6 +7535,7 @@ TEST_P(StoreTestSpecificAUSize, DeferredOnBigOverwrite3) {
     ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 64u);
     ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 0u);
     ASSERT_EQ(logger->get(l_bluestore_write_deferred), 0u);
+    ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 0u);
   }
   {
     ObjectStore::Transaction t;
@@ -7607,7 +7610,7 @@ TEST_P(StoreTestSpecificAUSize, DeferredDifferentChunks) {
              CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
       r = queue_transaction(store, ch, std::move(t));
       ++exp_bluestore_write_big;
-      if (expected_write_size != prefer_deferred_size)
+      if (expected_write_size < prefer_deferred_size)
        ++exp_bluestore_write_big_deferred;
       ASSERT_EQ(r, 0);
     }