背景
- 随着OKC主网、测试网的持续运行,DB数据持续增长,尤其是归档节点保留了全量数据,数据量已经达到TB。
- 为了提高OKC性能,测试网、主网已全面支持Rocksdb,并推荐用户使用Rocksdb。
问题
目前,主网归档节点使用Rocksdb时,出现内存占用过高达60至100GB,甚至对于内存不高的机器出现OOM,导致节点挂掉,无法正常出块。
解决方案
经调查,Rocksdb在归档节点占用内存大的主要原因是,为了保证Rocksdb的高读写性能,默认将rocksdb的参数设为max_open_files=-1
。
这导致启动Rocksdb时将DB中的所有file都打开并缓存,致使内存占用巨大。
解决这个问题,有两种方法:
- 升级机器内存。
- 修改参数配置:
- 升级节点至最新版本(>v1.1.5)
- 启动节点时设置参数
--rocksdb.opts max_open_files=20000
参数值根据系统配置具体调整,该值设为-1
表示不限制Rocksdb打开文件数;
参数值>0时,值越大内存占用越大,DB读写性能越高;值越小内存占用越小,DB读写性能越低。
以下为max_open_files
与内存占用关系,数值并不足够精确,仅供参考:
max_open_files | 节点占内存GB |
65536 | 30 |
16384 | 26 |
2048 | 10 |
1024 | 9 |
注意:以上数据为完成文章时的实测数据,随着主网持续运行DB增长以及节点运行参数不同,实际结果会有不同,仅供参考
- 其他优化建议
--iavl-enable-async-commit=false # 关闭iavl异步持久化
--iavl-cache-size=xxx # iavl缓存,默认10000000,适当减小
--iavl-fast-storage-cache-size=yyy # fast storage缓存,默认10000000,适当减小