bleve boltdb性能调研

背景
bleve是go实现的一个简单的文本索引系统。
boltdb是go实现的一个k-v数据库。
bleve使用boltdb作为其存储方式。

问题
在我们的项目中,使用bleve做文档索引,文档长度平均为1w个字节,发现每个文档调用bleve进行index要花费10ms以上。
当文档个数增加至40w,按照10ms的速度,对所有文档进行index需要 4000s 即 1h的时间。
而实际情况下,前面大概1w个文档,每个可以在10ms的时间完成index,而越往后,所需时间越长,直到最终达到40ms。
所以完成40w个文档的index,需要约 2.5 小时。

调研
这个时间无法接受,于是对bleve index耗时进行分析。
进行实验,对1000个长度为X的文档做index,计算平均时间。
当文档长度X在1000字节以内时,速度很快,每个文档的处理在2ms以内。而当文档长度逐渐增加至2w字节,每个文档处理时间就增至12ms。
于是查看bleve index的源码,最终锁定在bolt.Tx.write(),tx.db.ops.writeAt(buf, offset) 实际上是一次 pwrite 系统调用,是一次写磁盘操作。
注意这个调用处于一个循环中,所以有必要看一下循环次数。每次pwrite调用针对的是一个page,而系统的pagesize大多数情况下为4k,所以估算2w个字节需要 10个 page? wrong!
实验表明,文档长度为100字节以内时,pwrite调用次数为5,而当文档长度为2w,pwrite调用次数为 49,这就可以解释为什么随着文档长度增加,做index的耗时会成倍增加。
bleve存在数据库中的并不单单是文档内容本身,它有自己的一层结构,将文档内容放在结构中存入数据库,所以page个数并不是简单的 文档长度/pagesize 。

boltdb性能确实一般
在调研过程中,也看到了一些抱怨boltdb写数据性能的:
https://github.com/boltdb/bolt/issues/237
作者也曾想对此进行优化:
https://github.com/boltdb/bolt/issues/238

TODO
调研别的k-v数据库是如何实现写操作的,是否会比bolt快很多?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,898评论 18 399
  • 在前面文章中,我们介绍说Bitcoin网络通过PoW共识以及选择最长链为主链来逐步达到共识,使得网络中各节点本地的...
    oceanken阅读 12,520评论 7 26
  • 一. Java基础部分.................................................
    wy_sure阅读 9,232评论 0 11
  • 牯岭镇 · 庐山的中心,三面环山,一面临谷,海拔1164M; 牯岭原名牯牛岭,因形似一头牛而得名。 路线: 隧道口...
    浸泡一种心情阅读 1,241评论 2 2
  • 我喜欢天空的颜色 白天的,夜晚的,都喜欢 手中一抹白, 空里琴声和。 若问何处出, 望时...
    山茶柚子皮阅读 994评论 0 1