在《02-leveldb入门》中,我们介绍了leveldb的参数,本节就主要讲如何通过调整leveldb的参数来进行性能优化。
levedb支持配置的参数如下:
const Comparator* comparator;比较函数,主要用于key的大小比较。如果传入NULL则使用默认字节序进行比较。
bool create_if_missing = false;如果数据库不存在,则创建。
bool error_if_exists = false;如果数据库存在,返回错误。
bool paranoid_checks = false;如果开启,则在读取数据时进行严格的检查,若发现数据损坏,则立即结束。
Env* env;用户定义环境,用于文件读写、后台线程等,默认Env::Default()。
Logger* info_log;日志对象指针,如果传入为空,则使用默认定义的日志对象。
size_t write_buffer_size = 4 * 1024 * 1024;写缓冲区的大小,对应于memtable的空间大小,会影响并发写入性能,原理部分会进行详细说明。
int max_open_files = 1000;最大打开文件数,也会关系到tablecache的大小.
Cache* block_cache = nullptr;data block缓存,如果为nullptr则数据块不进行缓存。
size_t block_size = 4 * 1024;数据块的大小,默认为4k,一般不需修改。
int block_restart_interval = 16;重启点的间隔,即每16个key进行前缀压缩。
size_t max_file_size = 2 * 1024 * 1024;文件最大大小,根据存储数据大小进行调整。
CompressionType compression = kSnappyCompression;是否对数进行压缩。
const FilterPolicy* filter_policy = nullptr;布隆过滤器,使用布隆过滤器有利于提高查询效率。
结合应用场景,通过调整上述参数来达到性能优化的目的:
01、数据校验paranoid_checks
在leveldb中,数据文件的每个block对应一个4字节的crc校验位。校验位的目的是在读取的时候对数据进行校验,检查其完整性,防止磁盘损坏等原因导致读取的块错误。crc校验的具体方法就是对block内的所有数据计算crc,并进行保存。读取的时候,同样对读出来的数据再次计算crc,比较与写入时候的crc是否一致。
当将paranoid_checks设置为true的时候,代表每次读取都需要对块进行crc校验,如果校验出错则及时抛出错误,不再进行后续的解析块的流程。如果开启了块校验,则会额外消耗CPU运算时间。但在大多数正常的环境下,读取出来的块都是符合校验的,因此也可以不开启校验。但面临的风险就是,万一有数据块损坏,而后续的解析又没有出错,导致读取出来的数据与原始写入的数据不一致。
在leveldb中,如果开启块校验,如果校验出错,则整个块被丢弃。但实际情况是,可能这个块只是损坏了某个数据的几个字节,对大部分数据其实是没有影响的。因此如果开启则会丢弃整个块的数据,而如果不开启校验,则直接进行块解析,对于这种情况,未损坏的数据还是可以解析出来,只会丢弃真正损坏的尽可能少的数据。
因此,paranoid_checks设置为false可以减少读取时的校验流程,从而提升读取性能。但是在数据完整性要求比较严格的情况下,建议开启这个参数。
02、写缓冲区大小write_buffer_size
03、最大打开文件数max_open_files
04、块缓存block_cache
05、块大小block_size
06、文件大小max_file_size
07、数据压缩compression
leveldb中支持将数据进行Snappy压缩,Snappy算法的优势是性能高,但压缩比并不一定是最优秀的。由于其性能高,因此比较适用于数据库的压缩。数据以block为单位进行压缩。
对于写磁盘来说,由于数据压缩,同样的数据量会占用更小的磁盘IO,同时也减少了磁盘空间的占用。对于查询来说,读取同样的数据需要更少的IO,但是读取后需要进行解压缩,才能得到最终的数据。这个是典型的用CPU时间换磁盘空间。
因此,对于数据量很大,对存储成本比较敏感的情况,建议开启压缩。而数据量较小,对存储成本不敏感的情况下,建议不采用压缩。
08、过滤器filter_policy
leveldb中提供了布隆过滤器。布隆过滤器用于快速识别一个块中不存在待查询数据的情况,以减少不必要的磁盘读取,提升查询效率。详细见《07-leveldb性能优化(一)》。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/129661.html