CacheLib学习笔记
编译
官方编译教程:https://cachelib.org/docs/installation/
Debian 11上的liburing版本是0.7-3,好像太老了,编译会报错
error: ‘IORING_SETUP_SQE128’ was not declared in this scope
把它删掉就好了:
sudo apt remove liburing1 liburing-dev
然后编译:
./contrib/build.sh -j
编译结果默认存在./opt/cachelib里。如果要编译安装到另一个目录,比如$HOME/opt/cachelib:
./contrib/build.sh -j -p $HOME/opt/cachelib
注意,编译安装好了之后是不能移动的,因为里面有些so文件中硬编码了RUNPATH,比如:
% readelf -d libthriftprotocol.so.1.0.0 | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/home/searchstar/opt/cachelib/lib:/usr/local/lib]
移动了位置之后就会发生library not found的错误:解决找不到RUNPATH下的库的问题
存在的问题
gcc internal error
Debian 11上的gcc版本为10.2.1 20210110,太老了。如果出现了internal error的话,可以用nix安装新版本的gcc10:
nix-env -iA nixpkgs.gcc10
nix包管理器教程:使用国内源安装和使用Nix包管理器
配置环境变量
把编译安装的目录的绝对路径存入CACHELIB_HOME里,然后在~/.profile里加入如下内容来将其头文件和库暴露出去:
export CPLUS_INCLUDE_PATH=$CACHELIB_HOME/include:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=$CACHELIB_HOME/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=$CACHELIB_HOME/lib:$LD_LIBRARY_PATH
export CMAKE_PREFIX_PATH=$CACHELIB_HOME/lib/cmake:$CMAKE_PREFIX_PATH
然后source ~/.profile
使用
官方文档:https://cachelib.org/docs/
CMake
官方文档里似乎没写。
find_package(cachelib REQUIRED)
target_link_libraries(${PROJECT_NAME}
PRIVATE
cachelib
)
# Additional "FindXXX.cmake" files are here (e.g. FindSodium.cmake)
CLCMAKE="$workspace/CacheLib/cachelib/cmake"
CMAKE_PARAMS="-DCMAKE_MODULE_PATH='$CLCMAKE'"
mkdir -p build
cd build
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo $CMAKE_PARAMS
make
cd ..
头文件
#include <cachelib/allocator/CacheAllocator.h>
Hybrid Cache
facebook::cachelib::LruAllocator::Config lruConfig;
facebook::cachelib::LruAllocator::NvmCacheConfig nvmConfig;
nvmConfig.navyConfig.setBlockSize(4096);
nvmConfig.navyConfig.setSimpleFile(
options.db_paths[0].path + "/cachelib",
cachelib_size,
true /*truncateFile*/);
nvmConfig.navyConfig.blockCache().setRegionSize(16 * 1024 * 1024);
lruConfig.enableNvmCache(nvmConfig);
lruConfig.setAccessConfig({/*bucketsPower*/ 25, /*locksPower*/ 10})
.validate();
facebook::cachelib::LruAllocator cache(lruConfig);
auto poolId =
cache.addPool("default_pool", cache.getCacheMemoryStats().ramCacheSize);
bucketsPower默认是10,也就是默认1024个bucket,locksPower默认是5,也就是32个lock,都太小了,一定要手动调成更大的值。bucketsPower取值教程:https://cachelib.org/docs/Cache_Library_User_Guides/Configure_HashTable#choosing-a-good-value
常用方法
allocate(poolId, key, value_size): 返回WriteHandle
WriteHandle::getMemory, WriteHandle::getSize: value的内存起始地址和大小。可以用memcpy之类的往这块内存里面写东西。但好像不能更改大小。
insertOrReplace(WriteHandle)
find(key): 返回ReadHandle
findToWrite: 返回WriteHandle
检查ReadHandle或者WriteHandle是否有效:if (handle) {
ReadHandle::getMemory, ReadHandle::getSize: value的内存起始地址和大小。只读。
remove(key)

浙公网安备 33010602011771号