Skip to content

Commit 65b0fa9

Browse files
authored
[Enhancement] Adjust calculation method for page cache mem usage metrics (#37740)
Signed-off-by: Zaorang Yang <[email protected]>
1 parent 96375b6 commit 65b0fa9

File tree

3 files changed

+43
-16
lines changed

3 files changed

+43
-16
lines changed

be/src/storage/page_cache.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "runtime/current_thread.h"
4040
#include "runtime/mem_tracker.h"
4141
#include "util/defer_op.h"
42+
#include "util/lru_cache.h"
4243
#include "util/metrics.h"
4344
#include "util/starrocks_metrics.h"
4445

@@ -85,7 +86,7 @@ static void init_metrics() {
8586
}
8687

8788
StoragePageCache::StoragePageCache(MemTracker* mem_tracker, size_t capacity)
88-
: _mem_tracker(mem_tracker), _cache(new_lru_cache(capacity)) {
89+
: _mem_tracker(mem_tracker), _cache(new_lru_cache(capacity, ChargeMode::MEMSIZE)) {
8990
init_metrics();
9091
}
9192

@@ -127,8 +128,10 @@ bool StoragePageCache::lookup(const CacheKey& key, PageCacheHandle* handle) {
127128
}
128129

129130
void StoragePageCache::insert(const CacheKey& key, const Slice& data, PageCacheHandle* handle, bool in_memory) {
131+
// mem size should equals to data size when running UT
132+
int64_t mem_size = data.size;
130133
#ifndef BE_TEST
131-
int64_t mem_size = malloc_usable_size(data.data);
134+
mem_size = malloc_usable_size(data.data);
132135
tls_thread_status.mem_release(mem_size);
133136
SCOPED_THREAD_LOCAL_MEM_TRACKER_SETTER(_mem_tracker);
134137
tls_thread_status.mem_consume(mem_size);
@@ -140,8 +143,9 @@ void StoragePageCache::insert(const CacheKey& key, const Slice& data, PageCacheH
140143
if (in_memory) {
141144
priority = CachePriority::DURABLE;
142145
}
143-
144-
auto* lru_handle = _cache->insert(key.encode(), data.data, data.size, deleter, priority);
146+
// Use mem size managed by memory allocator as this record charge size. At the same time, we should record this record size
147+
// for data fetching when lookup.
148+
auto* lru_handle = _cache->insert(key.encode(), data.data, mem_size, deleter, priority, data.size);
145149
*handle = PageCacheHandle(_cache.get(), lru_handle);
146150
}
147151

be/src/util/lru_cache.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,10 @@ void LRUCache::set_capacity(size_t capacity) {
193193
}
194194
}
195195

196+
void LRUCache::set_charge_mode(ChargeMode charge_mode) {
197+
_charge_mode = charge_mode;
198+
}
199+
196200
uint64_t LRUCache::get_lookup_count() const {
197201
std::lock_guard l(_mutex);
198202
return _lookup_count;
@@ -295,7 +299,8 @@ void LRUCache::_evict_one_entry(LRUHandle* e) {
295299
}
296300

297301
Cache::Handle* LRUCache::insert(const CacheKey& key, uint32_t hash, void* value, size_t charge,
298-
void (*deleter)(const CacheKey& key, void* value), CachePriority priority) {
302+
void (*deleter)(const CacheKey& key, void* value), CachePriority priority,
303+
size_t value_size) {
299304
auto* e = reinterpret_cast<LRUHandle*>(malloc(sizeof(LRUHandle) - 1 + key.size()));
300305
e->value = value;
301306
e->deleter = deleter;
@@ -306,6 +311,7 @@ Cache::Handle* LRUCache::insert(const CacheKey& key, uint32_t hash, void* value,
306311
e->next = e->prev = nullptr;
307312
e->in_cache = true;
308313
e->priority = priority;
314+
e->value_size = value_size;
309315
memcpy(e->key_data, key.data(), key.size());
310316
std::vector<LRUHandle*> last_ref_list;
311317
{
@@ -395,10 +401,12 @@ uint32_t ShardedLRUCache::_shard(uint32_t hash) {
395401
return hash >> (32 - kNumShardBits);
396402
}
397403

398-
ShardedLRUCache::ShardedLRUCache(size_t capacity) : _last_id(0), _capacity(capacity) {
404+
ShardedLRUCache::ShardedLRUCache(size_t capacity, ChargeMode charge_mode)
405+
: _last_id(0), _capacity(capacity), _charge_mode(charge_mode) {
399406
const size_t per_shard = (_capacity + (kNumShards - 1)) / kNumShards;
400407
for (auto& _shard : _shards) {
401408
_shard.set_capacity(per_shard);
409+
_shard.set_charge_mode(_charge_mode);
402410
}
403411
}
404412

@@ -427,9 +435,10 @@ bool ShardedLRUCache::adjust_capacity(int64_t delta, size_t min_capacity) {
427435
}
428436

429437
Cache::Handle* ShardedLRUCache::insert(const CacheKey& key, void* value, size_t charge,
430-
void (*deleter)(const CacheKey& key, void* value), CachePriority priority) {
438+
void (*deleter)(const CacheKey& key, void* value), CachePriority priority,
439+
size_t value_size) {
431440
const uint32_t hash = _hash_slice(key);
432-
return _shards[_shard(hash)].insert(key, hash, value, charge, deleter, priority);
441+
return _shards[_shard(hash)].insert(key, hash, value, charge, deleter, priority, value_size);
433442
}
434443

435444
Cache::Handle* ShardedLRUCache::lookup(const CacheKey& key) {
@@ -453,7 +462,8 @@ void* ShardedLRUCache::value(Handle* handle) {
453462

454463
Slice ShardedLRUCache::value_slice(Handle* handle) {
455464
auto lru_handle = reinterpret_cast<LRUHandle*>(handle);
456-
return {(char*)lru_handle->value, lru_handle->charge};
465+
size_t record_size = _charge_mode == ChargeMode::VALUESIZE ? lru_handle->charge : lru_handle->value_size;
466+
return {(char*)lru_handle->value, record_size};
457467
}
458468

459469
uint64_t ShardedLRUCache::new_id() {
@@ -526,8 +536,8 @@ void ShardedLRUCache::get_cache_status(rapidjson::Document* document) {
526536
}
527537
}
528538

529-
Cache* new_lru_cache(size_t capacity) {
530-
return new ShardedLRUCache(capacity);
539+
Cache* new_lru_cache(size_t capacity, ChargeMode charge_mode) {
540+
return new ShardedLRUCache(capacity, charge_mode);
531541
}
532542

533543
} // namespace starrocks

be/src/util/lru_cache.h

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,16 @@ namespace starrocks {
2020
class Cache;
2121
class CacheKey;
2222

23+
enum class ChargeMode {
24+
// use value size as charge
25+
VALUESIZE = 0,
26+
// use allocator tracking size as charge
27+
MEMSIZE = 1
28+
};
29+
2330
// Create a new cache with a fixed size capacity. This implementation
2431
// of Cache uses a least-recently-used eviction policy.
25-
extern Cache* new_lru_cache(size_t capacity);
32+
extern Cache* new_lru_cache(size_t capacity, ChargeMode charge_mode = ChargeMode::VALUESIZE);
2633

2734
class CacheKey {
2835
public:
@@ -134,7 +141,7 @@ class Cache {
134141
// value will be passed to "deleter".
135142
virtual Handle* insert(const CacheKey& key, void* value, size_t charge,
136143
void (*deleter)(const CacheKey& key, void* value),
137-
CachePriority priority = CachePriority::NORMAL) = 0;
144+
CachePriority priority = CachePriority::NORMAL, size_t value_size = 0) = 0;
138145

139146
// If the cache has no mapping for "key", returns NULL.
140147
//
@@ -206,6 +213,7 @@ typedef struct LRUHandle {
206213
uint32_t refs;
207214
uint32_t hash; // Hash of key(); used for fast sharding and comparisons
208215
CachePriority priority = CachePriority::NORMAL;
216+
size_t value_size;
209217
char key_data[1]; // Beginning of key
210218

211219
CacheKey key() const {
@@ -266,10 +274,12 @@ class LRUCache {
266274
// Separate from constructor so caller can easily make an array of LRUCache
267275
void set_capacity(size_t capacity);
268276

277+
void set_charge_mode(ChargeMode charge_mode);
278+
269279
// Like Cache methods, but with an extra "hash" parameter.
270280
Cache::Handle* insert(const CacheKey& key, uint32_t hash, void* value, size_t charge,
271281
void (*deleter)(const CacheKey& key, void* value),
272-
CachePriority priority = CachePriority::NORMAL);
282+
CachePriority priority = CachePriority::NORMAL, size_t value_size = 0);
273283
Cache::Handle* lookup(const CacheKey& key, uint32_t hash);
274284
void release(Cache::Handle* handle);
275285
void erase(const CacheKey& key, uint32_t hash);
@@ -290,6 +300,8 @@ class LRUCache {
290300
// Initialized before use.
291301
size_t _capacity{0};
292302

303+
ChargeMode _charge_mode;
304+
293305
// _mutex protects the following state.
294306
mutable std::mutex _mutex;
295307
size_t _usage{0};
@@ -310,10 +322,10 @@ static const int kNumShards = 1 << kNumShardBits;
310322

311323
class ShardedLRUCache : public Cache {
312324
public:
313-
explicit ShardedLRUCache(size_t capacity);
325+
explicit ShardedLRUCache(size_t capacity, ChargeMode charge_mode = ChargeMode::VALUESIZE);
314326
~ShardedLRUCache() override = default;
315327
Handle* insert(const CacheKey& key, void* value, size_t charge, void (*deleter)(const CacheKey& key, void* value),
316-
CachePriority priority = CachePriority::NORMAL) override;
328+
CachePriority priority = CachePriority::NORMAL, size_t value_size = 0) override;
317329
Handle* lookup(const CacheKey& key) override;
318330
void release(Handle* handle) override;
319331
void erase(const CacheKey& key) override;
@@ -339,6 +351,7 @@ class ShardedLRUCache : public Cache {
339351
std::mutex _mutex;
340352
uint64_t _last_id;
341353
size_t _capacity;
354+
ChargeMode _charge_mode;
342355
};
343356

344357
} // namespace starrocks

0 commit comments

Comments
 (0)