不同内存分配器对RocksDB的影响
文章来源:
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 或其他能提升内存使用率的分配器。
相关文章