From e087862d5bd894572a6c223b45f4275cadd4b480 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Mon, 14 Jul 2014 14:27:17 +0800 Subject: [PATCH] Add rbdcache max dirty object option Librbd will calculate max dirty object according to rbd_cache_max_size, it doesn't suitable for every case. If user set image order 24, the calculating result is too small for reality. It will increase the overhead of trim call which is called each read/write op. Now we make it as option for tunning, by default this value is calculated. Signed-off-by: Haomai Wang (cherry picked from commit 3c7229a2fea98b30627878c86b1410c8eef2b5d7) --- src/common/config_opts.h | 1 + src/librbd/ImageCtx.cc | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index f8dd5f0ed968f..c0679b020c96b 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -713,6 +713,7 @@ OPTION(rbd_cache_size, OPT_LONGLONG, 32<<20) // cache size in bytes OPTION(rbd_cache_max_dirty, OPT_LONGLONG, 24<<20) // dirty limit in bytes - set to 0 for write-through caching OPTION(rbd_cache_target_dirty, OPT_LONGLONG, 16<<20) // target dirty limit in bytes OPTION(rbd_cache_max_dirty_age, OPT_FLOAT, 1.0) // seconds in cache before writeback starts +OPTION(rbd_cache_max_dirty_object, OPT_INT, 0) // dirty limit for objects - set to 0 for auto calculate from rbd_cache_size OPTION(rbd_cache_block_writes_upfront, OPT_BOOL, false) // whether to block writes to the cache before the aio_write call completes (true), or block before the aio completion is called (false) OPTION(rbd_concurrent_management_ops, OPT_INT, 10) // how many operations can be in flight for a management operation like deleting or resizing an image OPTION(rbd_balance_snap_reads, OPT_BOOL, false) diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index d2f0a4a96b193..b5c2db6e7895e 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -185,10 +185,14 @@ namespace librbd { // size object cache appropriately if (object_cacher) { - uint64_t obj = cct->_conf->rbd_cache_size / (1ull << order); + uint64_t obj = cct->_conf->rbd_cache_max_dirty_object; + if (!obj) { + obj = cct->_conf->rbd_cache_size / (1ull << order); + obj = obj * 4 + 10; + } ldout(cct, 10) << " cache bytes " << cct->_conf->rbd_cache_size << " order " << (int)order << " -> about " << obj << " objects" << dendl; - object_cacher->set_max_objects(obj * 4 + 10); + object_cacher->set_max_objects(obj); } ldout(cct, 10) << "init_layout stripe_unit " << stripe_unit @@ -587,7 +591,7 @@ namespace librbd { cache_lock.Unlock(); if (unclean) { lderr(cct) << "could not release all objects from cache: " - << unclean << " bytes remain" << dendl; + << unclean << " bytes remain" << dendl; return -EBUSY; } return r; -- 2.39.5