facebook / CacheLib

Pluggable in-process caching engine to build and scale high performance services
https://www.cachelib.org
Apache License 2.0
1.18k stars 254 forks source link

Fail to persist nvm cache due to "exceeding metadata limit" #268

Closed waterxjw closed 8 months ago

waterxjw commented 10 months ago

I want to enable a persistent cache by following the wiki. Meanwhile, I enable the NVM cache. when I shutdown the cache, it seems that nvm cache shut down failed.

I1021 02:28:38.815955 57910 BlockCache.cpp:678] Flush block cache
I1021 02:28:38.823921 57910 BlockCache.cpp:769] Starting block cache persist
E1021 02:29:21.929277 57910 NvmCache-inl.h:883] Got error persisting cache: exceeding metadata limit
E1021 02:29:21.929424 57910 CacheAllocator-inl.h:3545] Could not shutdown nvmcache cleanly

it seems the reason is that "device metadata size" is not enough. but i am confused about how to set "device metadata size" properly. i don't find useful information about it in document. i note the default size is set by following code

  auto getDefaultMetadataSize = [](size_t size, size_t alignment) {
    XDCHECK(folly::isPowTwo(alignment));
    auto mask = ~(alignment - 1);
    return (static_cast<size_t>(kDefaultMetadataPercent * size / 100) & mask);
  };

why the default size is not enough? and i want to know the appropriate value

jaesoo-fb commented 10 months ago

Hi @waterxjw

The required metadata size can vary depending on the state of the NVM cache (e.g., the number of BlockCache items). There is no good estimate for that; e.g., the space needed for BlockCache index table is proportional to the number of keys and the sum of key sizes for all items.

I suggest to start from setting it big enough (i.e., using setDeviceMetadataSize(...)), so you can have a good estimate for your use case to find the best size.