Golang boltdb 与 leveldb 的读写性能比较

By at • 864次点击
youbbs

boltdb 与 leveldb 都是较早,比较成熟的项目,在用Go 重写youBBS 时也用心比较、选择,后来选择了 boltdb ,读的性能比较好。

刚开始测试比较好,写的速度也挺快:

10万用户、1万分类,100万帖子 费时 time 33m37.106093961s 数据插入逻辑跟生产环境相同,平均 520贴/秒

但别人测试时很慢(参见 https://www.youbbs.org/t/2133 45 5楼和9楼),后来我用同样的程序去测试,也很慢,这情况一直记着,但没有时间去找原因……最近全国上下都建议不出门,就趁这时间用 leveldb 作底层,来实现与 youdb 相同接口的库,来作性能对比。用相同的代码测试,写速度相差太大了,也懒得去找boltdb 变慢的原因:

用户、分类、文章 各1万
boltdb 用时 33m39.436991412s
leveldb 用时 1.486186802s
  • boltdb cpu 占用很少 7% 左右
  • leveldb cpu 占用很大 90%~100% (已限制单核)

除了写机制不同外,leveldb 使用压缩加成(snappy),消耗了CPU,这可以减少硬盘IO,也减少数据库空间。而boltdb 存储的是原文镜像,测试的例子产生的数据库大小

  • boltdb 25MB
  • leveldb 5MB

由于测试的例子使用的随机内容重复率很大,会影响压缩比,上面的空间对比可能与生产环境不同,但对文本的压缩还是很见效。如果考虑到空间的问题,可以使用 leveldb。另外与空间有关的现象是,boltdb 的空间只会增大,不会减小(可以使用备份的方式整理空间以减少浪费),leveldb 的空间是会变大、变小、又变大、变小,不断循环着,是leveldb 压缩、处理数据历史版本的结果,正是因为这样,当leveldb的数据量很大时,如果数据还不断 修改、删除 则占用的资源会更多,也会使整体性能下降,多大呢?我没亲测,以前调研时看到别人测试,c++ 版是100G 后性能剧降。而 boltdb 的作者表示,在高负载的生产环境 boltdb 在 1TB 时还很稳。

对于boltdb 与 leveldb 的区别,boltdb 的作者是这么看的:

对于小站长来说, boltdb 占用的VPS资源很少,曾经生成 10万用户、1万分类,100万帖子 的youBBS数据(近1GB的数据),丢在内存 128MB 的VPS 里都跑得飞快。 参见 https://www.youbbs.org/t/2087 160

TODO

  • 有空可让 youbbs 支持leveldb

参考


Golang, boltdb, leveldb, 读写, 性能


意思时说leveldb靠牺牲CPU资源为代价??

waiducom at 2020-02-07 18:56
1

@waiducom 高速写状态下,压缩确实是占用很多CPU,写得快还跟它的写机制有关。

youbbs at 2020-02-07 22:58
2
登录 后发表评论