如何确认RocksDB实际使用的内存分配器?
验证RocksDB是否使用指定内存分配器
操作背景
按照官方指导,在Linux系统上为RocksDB配置更高效的非标准内存分配器(如jemalloc、tcmalloc),操作步骤如下:
# 示例:在Debian系统安装jemalloc apt install -y libjemalloc-dev # 启动Kafka Streams应用前设置LD_PRELOAD export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so"
但实际工作负载下,使用jemalloc后的内存消耗与未使用时完全一致(均为4.5GiB),换用tcmalloc后内存使用量也没有变化。于是通过分析动态链接库使用情况排查问题。
动态链接库分析结果
1. 查看RocksDB JNI库的依赖链接
执行命令:ldd /tmp/librocksdbjni16525886107314830425.so
输出:
linux-vdso.so.1 (0x00007fffc3ba6000) /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4 (0x00007f5e50dff000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5e51d94000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f5e51d8f000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5e51d8a000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5e50bd3000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5e51ca1000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5e51c81000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5e509aa000) /lib64/ld-linux-x86-64.so.2 (0x00007f5e51d9f000) libunwind.so.8 => /lib/x86_64-linux-gnu/libunwind.so.8 (0x00007f5e51c66000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f5e51c3b000)
2. 检查RocksDB库中malloc相关符号
执行命令:objdump -T /tmp/librocksdbjni16525886107314830425.so | grep malloc
输出:
0000000000000000 DF *UND* 0000000000000000 (GLIBC_2.2.5) malloc_usable_size 0000000000000000 DF *UND* 0000000000000000 (GLIBC_2.2.5) malloc 0000000000000000 w D *UND* 0000000000000000 mallocx 0000000000000000 w D *UND* 0000000000000000 malloc_stats_print 0000000000558360 w DF .text 00000000000000e2 Base _ZN7rocksdb23JemallocNodumpAllocatorD1Ev 00000000002fedd0 g DF .text 0000000000000093 Base rocksdb_jemalloc_nodump_allocator_create 0000000000558360 w DF .text 00000000000000e2 Base _ZN7rocksdb23JemallocNodumpAllocatorD2Ev 0000000000bf85e0 w DO .data.rel.ro 00000000000000c0 Base _ZTVN7rocksdb23JemallocNodumpAllocatorE 0000000000557fa0 g DF .text 00000000000002f7 Base _ZN7rocksdb26NewJemallocNodumpAllocatorERNS_24JemallocAllocatorOptionsEPSt10shared_ptrINS_15MemoryAllocatorEE 0000000000557bd0 g DF .text 000000000000015b Base _ZN7rocksdb23JemallocNodumpAllocatorC1ERNS_24JemallocAllocatorOptionsE 0000000000557d30 g DF .text 0000000000000096 Base _ZN7rocksdb23JemallocNodumpAllocator11IsSupportedEPSs 00000000005582d0 w DF .text 0000000000000008 Base _ZNK7rocksdb23JemallocNodumpAllocator4NameEv 0000000000557bd0 g DF .text 000000000000015b Base _ZN7rocksdb23JemallocNodumpAllocatorC2ERNS_24JemallocAllocatorOptionsE 00000000007eb510 g DF .text 0000000000000005 Base _Z12toku_xmallocm 0000000000301fb0 g DF .text 000000000000000b Base rocksdb_options_set_dump_malloc_stats 0000000000557dd0 g DF .text 00000000000001c3 Base _ZN7rocksdb23JemallocNodumpAllocator14PrepareOptionsERKNS_13ConfigOptionsE 00000000007ebe30 g DF .text 00000000000000e5 Base _ZN8memarena17malloc_from_arenaEm 0000000000558450 w DF .text 00000000000000bb Base _ZN7rocksdb23JemallocNodumpAllocatorD0Ev
问题
尽管获取了以上分析结果,仍无法确定RocksDB是否实际使用了指定的内存分配器。
内容的提问来源于stack exchange,提问作者Andras Hatvani
相关产品推荐
相关产品推荐

