From e8d40c31b3cca0c3e1ae9abe9b9003b1288026a9 Mon Sep 17 00:00:00 2001 From: Igor Canadi Date: Wed, 11 Dec 2013 08:33:29 -0800 Subject: [PATCH] [RocksDB perf] Cache speedup Summary: I have ran a get benchmark where all the data is in the cache and observed that most of the time is spent on waiting for lock in LRUCache. This is an effort to optimize LRUCache. Test Plan: The data was loaded with fillseq. Then, I ran a benchmark: /db_bench --db=/tmp/rocksdb_stat_bench --num=1000000 --benchmarks=readrandom --statistics=1 --use_existing_db=1 --threads=16 --disable_seek_compaction=1 --cache_size=20000000000 --cache_numshardbits=8 --table_cache_numshardbits=8 I ran the benchmark three times. Here are the results: AFTER THE PATCH: 798072, 803998, 811807 BEFORE THE PATCH: 782008, 815593, 763017 Reviewers: dhruba, haobo, kailiu Reviewed By: haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D14571 --- util/cache.cc | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/util/cache.cc b/util/cache.cc index deec52864..8fa03626b 100644 --- a/util/cache.cc +++ b/util/cache.cc @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include "rocksdb/cache.h" #include "port/port.h" @@ -111,8 +111,8 @@ class HandleTable { } void Resize() { - uint32_t new_length = 4; - while (new_length < elems_) { + uint32_t new_length = 16; + while (new_length < elems_ * 1.5) { new_length *= 2; } LRUHandle** new_list = new LRUHandle*[new_length]; @@ -255,18 +255,20 @@ Cache::Handle* LRUCache::Insert( LRUHandle* e = reinterpret_cast( malloc(sizeof(LRUHandle)-1 + key.size())); - std::list last_reference_list; + std::vector last_reference_list; + last_reference_list.reserve(1); + + e->value = value; + e->deleter = deleter; + e->charge = charge; + e->key_length = key.size(); + e->hash = hash; + e->refs = 2; // One from LRUCache, one for the returned handle + memcpy(e->key_data, key.data(), key.size()); { MutexLock l(&mutex_); - e->value = value; - e->deleter = deleter; - e->charge = charge; - e->key_length = key.size(); - e->hash = hash; - e->refs = 2; // One from LRUCache, one for the returned handle - memcpy(e->key_data, key.data(), key.size()); LRU_Append(e); LRUHandle* old = table_.Insert(e);