From f38f18c149b9347a26d845539eaeef29979e9006 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Sat, 7 Aug 2021 02:22:12 +0300 Subject: [PATCH] os/bluestore: introduce l_bluestore_write_deferred_bytes perf counter. Signed-off-by: Igor Fedotov --- src/os/bluestore/BlueStore.cc | 20 +++++++++++--------- src/os/bluestore/BlueStore.h | 3 ++- src/test/objectstore/store_test.cc | 7 +++++-- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 20bc17b244938..b6809e8464bc4 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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, diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index a73b3b853359b..8052d9055a2a3 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -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(); diff --git a/src/test/objectstore/store_test.cc b/src/test/objectstore/store_test.cc index 5ecc953d13686..89818d50077fd 100644 --- a/src/test/objectstore/store_test.cc +++ b/src/test/objectstore/store_test.cc @@ -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); } -- 2.39.5