如何对 Rocksdb以及类似存储引擎社区 提出 有效的性能问题?
性能 是rocksdb的优点,活跃的社区十分欢迎大家对各自使用rocksdb 过程中性能相关的疑惑点进行提问。提问的时候如果能够提供更多,更详细的信息 是可以增加快速得到恢复回复的概率。当然,性能是一个非常广泛且有巨量影响因素的话题,单纯从一个简单的描述是无法进行更进一步的性能问题讨论的。
社区从两方面给出了如下 性能相关issue的建议(当然有经验的同学这一些描述即可不用在意),这一些建议也是我们存储产品对内,对外展示性能的一个模版,个人觉得还是比较受用。
1. 问题描述
-
哪一种operation 性能较差?Get(), Put(), or Iterator ?
-
如果是其中一种workload,那么这个场景下的哪一项指标(qps , p50,p99,p9999…) 不满足你的预期?你的预期的指标是多少?
- 吞吐: 如果是吞吐的问题,你使用的压测线程数是多少
- 平均延时问题
- 长尾延时问题
-
你使用的是哪一种存储介质?
- SSD
- HDD
- RAID-…(0,1,10…)
- ramfs/tmpfs
- HDFS 或者 其他的远端存储
2. DB配置 和 DB状态 情况
-
rocksdb启动情况:rocksdb实例的数量,多个还是单db? 每一个DB的大小?每一个DB实例使用了多少CF?
-
使用的rocksdb 版本?
-
编译选项?如果使用的是make,可以直接将 make之后的 make_config.mk分享出来。如果无法提供全量的make_config.mk信息,则按照如下问题做一个回复:
a. 哪一个平台 ? Linux, Windows, OS X, etc…/
b. 使用的是哪一种分配器? jemalloc, tcmalloc, glibc malloc …?如果是 jemalloc, 可以在make_config.mk中看到JEMALLOC=1
的选项。如果是tcmalloc
,可以在PLATFORM_LDFLAGS 中找到-ltcmalloc
的编译选项。
c. 是否打开了 SSE指令支持的crc校验?如果有的话,这条信息会在rocksdb的LOG中打印,类似Fast CRC32 supported: 1
d. 是否支持 并打开了linux的 预分配选项fallocate
可以通过查看PLATFORM_CXXFLAGS
或者PLATFORM_CCFLAGS
选项 中是否包含DROCKSDB_FALLOCATE_PRESENT
配置 -
你使用的rocksdb 配置。如果能够提供rocksdb的options file是最好的,一般这个文件会在你运行rocksdb相关应用的db目录中,以
OPTIONS-xxx
命名。或者 也能够将rocksdb LOG文件中的头部 拷贝出来。如果无法提供全量的配置文件,可以回复以下的关键配置即可(未设置,即是默认的配置):
a.
write_buffer_size
– memtable的大小,默认64M
b.level0_file_num_compaction_trigger
– L0触发compaction的sst文件个数,默认4个
c.target_file_size_base
– sst文件大小,默认64M
d.compression
– 压缩算法,默认snappy
e.compaction_style
– compaction策略,默认 leveled
f. 如果配置了leveled compaction 策略:-
max_bytes_for_level_base
– L1 的最大容量,默认256M -
max_bytes_for_level_multiplier
– 每一层大小的倍数,比如size(Ln) =size(Ln-1) * max_bytes_for_level_multiplier, 默认是10 -
level_compaction_synamic_level_bytes
是否开启动态调整每一层大小的配置
g. 如果配置了 universal compaction策略:
size_ratio
max_size_amplification_percent
h. block_cache_size block_cache 的大小
i. Bloomfilter 相关的配置
j. 其他并不 通用的配置,如果你更改了,也请贴上来。 -
-
LSM-tree 结构情况。
一般可以通过应用程序中加入代码, DB::GetProperty(“rocksdb.stats”)。
另一种方式 是可以通过命令ldb --manifest_dump
指定db目录下的MANIFEST-xxx
文件 -
当发生性能问题时 磁盘的IO情况。这里可以根据个人习惯进行io情况的统计, 一般使用
iostat -xdt 1
-
workload情况:
a. key + value size
b. 读/写 百分比
c. 如何删除数据
d. 。。。 -
如果方便的话,分享一下对应的LOG文件,LOG文件一般在db目录之下,以
LOG
或者LOG.old.xxx
-
硬件指标。如果没有办法给出精确的硬件数据,那么给出基本的内存 以及 CPU核数 的使用情况会比较方便,也很有用。
-
如果能够提供 复现问题的方法/代码 以及复现步骤,对社区精确解决性能问题会很有帮助。