leveldb性能调优

原创 2015年07月09日 15:57:39
许多的nosql都使用leveldb或者类似leveldb的系统作为存储引擎,例如tair,hbase,canssandra,因此理解并调优存储引擎可以大大的提高系统的性能。


前一篇大致介绍了原理,这一篇接下来讲解调优相关的内容。


leveldb中的写放大


一条记录写到leveldb,则会写一次到log,写一次到level 0,随着后面更多数据的写入,level n里面的记录会与level n+1的记录合并排序,按照level n+1的数据量是level n的10倍,预计每提升一级,需要11个写,因此如果是7级的话,大约为68个写,即写放大为68。leveldb存放在内存中的数据大小write_buffer_size默认为4M,level 1的大小默认为10M。因此一个1TB的数据库会有7层。通过加大内存中的数据以及level 1的大小,例如设置write_buffer_size=1G,level1大小为4G,那么总共的层级只有5级,写放大大约为46,性能可以提升大约30%


leveldb中的读放大


前一篇提到一次记录的读取需要多次文件读取,通过bloomfilter可以讲实际读取数据降到到接近1。我们来看看bloomfilter降低读取的原理。假设filter的bits为10,一个文件有1000个key,那么filter一共有1w个bit,对每个key计算hash值,把hash值模1w后对应的bit置为1,多计算几种hash值,都设置相应的bit为1。获取一个指定的key1时,按照前面的算法计算hash值检查bit值,如果这些bit值不是全1,那么可以肯定这个key1不在文件中。这样就可以通过不读取文件就判断key1是否在文件中。当然可能会出现全1但是key1又不在文件中,这样的情况就相当于是hash冲突了。通过查阅bloomfilter的资料,可以看到hash冲突的概率的情况为:
10 bits     0.0081
15 bits     0.0007
19 bits      0.0001
假设每次读取需要查找10个文件,那么10bits的hash冲突导致的多余读取为10 * 0.0081 = 0.081大约是8%
我在实际使用tair中,当写入较多时,导致level0的数据可能达到32,这种情况下10bits的多余夺取为35 * 0.0081 = 0.2835大约是28%,此时应当增加bits,例如15bits则额外读为2.45%


这两点是是实际使用中碰到的,可以提升实际的应用性能

leveldb使用时遇到的性能问题

我用leveldb+thrift做了个存储服务,实现了跨进程的数据读写。但随着数据量的增大,我发现数据更新越来越慢。经过排查发现为leveldb使用问题,有问题的逻辑是:服务端每收到一条更新操作,都先...
  • hbuxiaoshe
  • hbuxiaoshe
  • 2015年07月21日 10:43
  • 2177

caffe的Leveldb格式数据三(性能)

Leveldb是一个google实现的非常高效的kv数据库,目前的版本1.2能够支持billion级别的数据量了。 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计。特别是LSM算法。 ...
  • langb2014
  • langb2014
  • 2015年12月25日 22:40
  • 1040

每天进步一点点——关于SSD写入放大问题

SSD与传统磁盘相比有了很大的性能优势,以及较多的优点,但是事物总是有两面性的,其也自身也存在一些问题,比如写入放大问题,本文简单讲解了写入放大问题以及相关解决方法……...
  • cywosp
  • cywosp
  • 2014年06月10日 10:57
  • 17752

LEVELDB(SSDB)关于读操作两种CACHE的作用和配置

SSDB及LEVELDB的用来优化查找Cache分为两种,分别是table_cache和block_cache。      table_cache用来缓存的是sstable的索引数据,也可以理解为m...
  • mumumuwudi
  • mumumuwudi
  • 2015年07月24日 01:40
  • 2575

Leveldb/lmdb/comdb 各种存储引擎的个人见解

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • wuhuaiyu
  • wuhuaiyu
  • 2015年06月27日 19:38
  • 3216

LevelDB的一些简单总结

LevelDB特点 key value记录,记录可压缩 支持高写入的场合 具有插入Put,删除Delete,以及读取Get记录三种基本操作。不包含更新操作,可以直接插入新的value表示更新。支持批量...
  • lipeng08
  • lipeng08
  • 2016年10月15日 22:03
  • 3522

十亿级别规模KV型数据持久性存储引擎:Leveldb实现原理

LevelDb日知录之一:LevelDb 101   说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff...
  • ColZer
  • ColZer
  • 2012年11月02日 10:14
  • 7346

[转]LevelDB性能分析和表现

【LevelDB介绍】 LevelDB是一个Google开发的速度飞快的数据库键值存储引擎,可按照字符串键值顺序映射。2011年7月30日Google宣布按照BSD许可开源LevelDB。 ...
  • heiyeshuwu
  • heiyeshuwu
  • 2011年12月19日 20:21
  • 4443

LevelDB性能测试

最近工作需要找一个能使用磁盘存储数据,对写要求比较苛刻,需要每秒达100000TPS,读的时候需要能10000TPS左右,不能占用太多内存。单节点满足这个要求的常见有Redis、Memcached等,...
  • joeyon
  • joeyon
  • 2014年08月24日 12:41
  • 1740

每天进步一点点——leveldb项目实践

leveldb是Google公司开源的高性能Key-Value数据库,在很多开源的项目中就有使用,例如:Chromium,淘宝的Tair,SSDB等。leveldb对于小数据在写入百万个之后读写性能依...
  • cywosp
  • cywosp
  • 2014年03月08日 00:48
  • 18723
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leveldb性能调优
举报原因:
原因补充:

(最多只允许输入30个字)