]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: use Best-Effort policy when evicting onode from cache 12876/head
authorxie xingguo <xie.xingguo@zte.com.cn>
Wed, 11 Jan 2017 07:02:34 +0000 (15:02 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Thu, 12 Jan 2017 01:28:59 +0000 (09:28 +0800)
We want a precise control of cache usage, and BE can achieve this goal
in a better way.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/common/config_opts.h
src/os/bluestore/BlueStore.cc

index 85121c1180e4490328e2d1f163d03d240af37ae8..48354c2ea561d125ddd392e774b1571c7908c62e 100644 (file)
@@ -1045,6 +1045,7 @@ OPTION(bluestore_extent_map_shard_min_size, OPT_U32, 150)
 OPTION(bluestore_extent_map_shard_target_size_slop, OPT_DOUBLE, .2)
 OPTION(bluestore_extent_map_inline_shard_prealloc_size, OPT_U32, 256)
 OPTION(bluestore_cache_trim_interval, OPT_DOUBLE, .1)
+OPTION(bluestore_cache_trim_max_skip_pinned, OPT_U32, 64) // skip this many onodes pinned in cache before we give up
 OPTION(bluestore_cache_type, OPT_STR, "2q")   // lru, 2q
 OPTION(bluestore_2q_cache_kin_ratio, OPT_DOUBLE, .5)    // kin page slot size / max page slot size
 OPTION(bluestore_2q_cache_kout_ratio, OPT_DOUBLE, .5)   // number of kout page slot / total number of page slot
index 6816e5d718db878e568654d32f73cd34aeb218af..ff3600b6a8516419e6e2172edfd07b47d869bd82 100644 (file)
@@ -642,13 +642,26 @@ void BlueStore::LRUCache::_trim(uint64_t onode_max, uint64_t buffer_max)
   auto p = onode_lru.end();
   assert(p != onode_lru.begin());
   --p;
+  int skipped = 0;
+  int max_skipped = g_conf->bluestore_cache_trim_max_skip_pinned;
   while (num > 0) {
     Onode *o = &*p;
     int refs = o->nref.load();
     if (refs > 1) {
       dout(20) << __func__ << "  " << o->oid << " has " << refs
-              << " refs; stopping with " << num << " left to trim" << dendl;
-      break;
+              << " refs, skipping" << dendl;
+      if (++skipped >= max_skipped) {
+        dout(20) << __func__ << " maximum skip pinned reached; stopping with "
+                 << num << " left to trim" << dendl;
+        break;
+      }
+
+      if (p == onode_lru.begin()) {
+        break;
+      } else {
+        p--;
+        continue;
+      }
     }
     dout(30) << __func__ << "  rm " << o->oid << dendl;
     if (p != onode_lru.begin()) {
@@ -895,13 +908,26 @@ void BlueStore::TwoQCache::_trim(uint64_t onode_max, uint64_t buffer_max)
   auto p = onode_lru.end();
   assert(p != onode_lru.begin());
   --p;
+  int skipped = 0;
+  int max_skipped = g_conf->bluestore_cache_trim_max_skip_pinned;
   while (num > 0) {
     Onode *o = &*p;
     int refs = o->nref.load();
     if (refs > 1) {
       dout(20) << __func__ << "  " << o->oid << " has " << refs
-              << " refs; stopping with " << num << " left to trim" << dendl;
-      break;
+              << " refs; skipping" << dendl;
+      if (++skipped >= max_skipped) {
+        dout(20) << __func__ << " maximum skip pinned reached; stopping with "
+                 << num << " left to trim" << dendl;
+        break;
+      }
+
+      if (p == onode_lru.begin()) {
+        break;
+      } else {
+        p--;
+        continue;
+      }
     }
     dout(30) << __func__ << "  trim " << o->oid << dendl;
     if (p != onode_lru.begin()) {