JindoSDk 通过 jemalloc 控制内存上涨最佳实践§

背景§

jindosdk hadoop sdk 使用 jni 调用 native 实现,因此 jvm 相关 gc 参数无法有效控制 native 内存上涨,可以通过 jemalloc 配置来进行控制。

部属方法§

jindosdk 4.6.8 及以上版本完整产出物在 tar 包中默认携带了 jemalloc:

.
├── bin
│   ├── ...
├── conf
│   ├── ...
├── lib
│   ├── jindo-core-6.7.5.jar
│   ├── jindo-sdk-6.7.5.jar
│   └── native
│       ├── libjemalloc.so
│       ├── ...
├── plugins
│   ├── ...
├── tools
│   ├── ...
└── versions
    └── JINDOSDK_VERSION

假设安装目录为/opt/apps/JINDOSDK/jindosdk-current/,要保证所有调用jindosdk的环境,都配置以下的环境变量:

LD_PRELOAD=/opt/apps/JINDOSDK/jindosdk-current/lib/native/libjemalloc.so
MALLOC_CONF=narenas:1,tcache:false,dirty_decay_ms:0,muzzy_decay_ms:0,background_thread:true,abort_conf:true

效果§

wget https://jindodata-binary.oss-cn-shanghai.aliyuncs.com/resources/memcheck/jindo-sdk-memleak-check-1.0.jar

执行以下memleak-check测试

HADOOP_HEAPSIZE=2560 HADOOP_ROOT_LOGGER=ERROR,console hadoop jar jindo-sdk-memleak-check-1.0.jar MemLeakTestProgram -baseDir oss:/<your-bucket>/ -duration 8899

使用默认glibc,最终占用3627M

使用jemalloc不设置MALLOC_CONF,最终占用2929M

使用jemalloc并设置MALLOC_CONF,最终占用2289M

其他§

上面的配置适合内存紧张的场景,可能对性能有一定影响。当需要综合考虑内存占用与性能时,可以尝试以下配置:

LD_PRELOAD=/opt/apps/JINDOSDK/jindosdk-current/lib/native/libjemalloc.so
MALLOC_CONF=percpu_arena:percpu,lg_tcache_max:12,dirty_decay_ms:5000,muzzy_decay_ms:5000