不同内存分配器对RocksDB的影响

2022-04-15 00:00:00 专区 内存 使用率 回收 分配器

文章来源:

https://blog.cloudflare.com/the-effect-of-switching-to-tcmalloc-on-rocksdb-memory-use/

文章讲的是,在将存储引擎迁移RocksDB的过程中,发现内存使用率异常。

排查发现是内存分配器 glibc的问题,导致存在大量的内存碎片。

因为:

1. 内存按arena分配,arena是一块连续的内存。回收是栈式回收。由于栈顶的未释放,可能造成整个arena不能回收

2. 在高并发多线程环境下,为了减少锁的争用,允许存在多个arena。这些arena被不同的线程使用,但彼此之间独立,意味着空闲空间不能合并,造成浪费

解决方案是,限制 arena 的个数,或使用时总是进行清理,但治标不治本。

与此不同的是,TCMalloc 就是为多线程内存分配而生。TCMalloc 将内存分为三层:

1. 使用层,应用在该层分配内存

2. 中间层,池化设计,使用层释放的内存可被重用,或者交还操作系统

3. 物理层,通过操作系统管理内存

总结:

如果是内存敏感应用, glibc 可不是好选择。请选用TCMalloc,jemalloc 或其他能提升内存使用率的分配器。  

相关文章