From 9845258f184c823d1e48da1dcb97bdde97220bb6 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 22 Apr 2015 11:27:35 -0400 Subject: [PATCH] librbd: updated cache max objects calculation The previous calculation was based upon the image's object size. Since the cache stores smaller bufferheads, the object size is not a good indicator of cache usage and was resulting in objects being evicted from the cache too often. Instead, base the max number of objects on the memory load required to store the extra metadata for the objects. Fixes: #7385 Backport: firefly, hammer Signed-off-by: Jason Dillaman (cherry picked from commit 0b378942c4f1b79cb65967f2d3466728ca1c8d5b) Conflicts: src/librbd/ImageCtx.cc because firefly has cct->_conf->rbd_cache_size instead of cache_size --- src/librbd/ImageCtx.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 1295d421c2353..a1dce1c8f914f 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -189,10 +189,9 @@ namespace librbd { if (object_cacher) { uint64_t obj = cct->_conf->rbd_cache_max_dirty_object; if (!obj) { - obj = cct->_conf->rbd_cache_size / (1ull << order); - obj = obj * 4 + 10; + obj = MIN(2000, MAX(10, cct->_conf->rbd_cache_size / 100 / sizeof(ObjectCacher::Object))); } - ldout(cct, 10) << " cache bytes " << cct->_conf->rbd_cache_size << " order " << (int)order + ldout(cct, 10) << " cache bytes " << cct->_conf->rbd_cache_size << " -> about " << obj << " objects" << dendl; object_cacher->set_max_objects(obj); } -- 2.39.5