From 71bc60170e4e9e24677eb2d6df05aaadc7ffd9c2 Mon Sep 17 00:00:00 2001 From: Yite Gu Date: Wed, 31 Jul 2024 15:24:03 +0800 Subject: [PATCH] blk/kerneldevice: add perfcounter for block async discard Adding perfcounter helps to understand the status of async discard. Signed-off-by: Yite Gu (cherry picked from commit f446f4c1d4613e964de1956d6e7a10a1c410ae6b) --- src/blk/kernel/KernelDevice.cc | 16 ++++++++++++++++ src/blk/kernel/KernelDevice.h | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/src/blk/kernel/KernelDevice.cc b/src/blk/kernel/KernelDevice.cc index 3ee4d7c0657..0780a6aacfb 100644 --- a/src/blk/kernel/KernelDevice.cc +++ b/src/blk/kernel/KernelDevice.cc @@ -88,10 +88,25 @@ KernelDevice::KernelDevice(CephContext* cct, aio_callback_t cb, void *cbpriv, ai } io_queue = std::make_unique(iodepth); } + + char name[128]; + sprintf(name, "blk-kernel-device-%s", dev_name); + PerfCountersBuilder b(cct, name, + l_blk_kernel_device_first, l_blk_kernel_device_last); + b.set_prio_default(PerfCountersBuilder::PRIO_USEFUL); + b.add_u64_counter(l_blk_kernel_device_discard_op, "discard_op", + "Number of discard ops issued to kernel device"); + + logger.reset(b.create_perf_counters()); + cct->get_perfcounters_collection()->add(logger.get()); } KernelDevice::~KernelDevice() { + if (logger) { + cct->get_perfcounters_collection()->remove(logger.get()); + logger.reset(); + } cct->_conf.remove_observer(this); } @@ -791,6 +806,7 @@ void KernelDevice::_discard_thread(uint64_t tid) discard_running ++; l.unlock(); dout(20) << __func__ << " finishing" << dendl; + logger->inc(l_blk_kernel_device_discard_op, discard_processing.size()); for (auto p = discard_processing.begin(); p != discard_processing.end(); ++p) { _discard(p.get_start(), p.get_len()); } diff --git a/src/blk/kernel/KernelDevice.h b/src/blk/kernel/KernelDevice.h index fac869f6584..1444bfa54bb 100644 --- a/src/blk/kernel/KernelDevice.h +++ b/src/blk/kernel/KernelDevice.h @@ -29,6 +29,12 @@ #define RW_IO_MAX (INT_MAX & CEPH_PAGE_MASK) +enum { + l_blk_kernel_device_first = 1000, + l_blk_kernel_device_discard_op, + l_blk_kernel_device_last, +}; + class KernelDevice : public BlockDevice, public md_config_obs_t { protected: @@ -53,6 +59,7 @@ private: void *discard_callback_priv; bool aio_stop; bool need_notify = false; + std::unique_ptr logger; ceph::mutex discard_lock = ceph::make_mutex("KernelDevice::discard_lock"); ceph::condition_variable discard_cond; -- 2.39.5