前面学习了一下rocksdb,这个db是对leveldb的一个改进,是基于leveldb1.5的版本上的改进,而且leveldb1.5以后也在不断的优化,下面从写入性能对两者进行对比。

前言

比较的leveldb的版本是1.18,rocksdb的版本是3.10.1.

在比较的时候需要将leveldb和rocksdb的参数调成一样的,本文的参数为,

memtable 4M,最多2个memtable

level0_slowdown_writes_trigger=8,level0_stop_writes_trigger=12,level0_file_num_compaction_trigger=4,

flush和compaction共用一个进程

leveldb和rocksdb在后台进程管理的默认配置也是不一样的,leveldb默认只能有一个后台进程用于flush和compaction,而rocksdb flush和compaction都会有一个进程,本文特殊没有说明的rocksdb就是和leveldb一样的,flush和compaction共用一个进程

场景1

每个key 8byte,没有value

这个场景在关系链系统里面非常常见,因为关系链系统是key-list,使用leveldb类似系统实现的时候,需要将list中的id提到key里面

得到的测试结果如下:

  leveldb rocksdb
请求数 10000000 10000000
数据量 80M 80M
耗时s 56 73
吞吐量(Mps) 1.428571429 1.095890411
qps 178571.4286 136986.3014
是否发生stall

结论是leveldb比rocksdb要略胜一筹,由于value为空,整个的吞吐量和磁盘的吞吐量(100Mps到150Mps)还相差比较远,所以并没有发生写stall的情况。因为没有发生stall,所以性能对比完全是内存操作的性能的对比。

这个场景比的主要是内存的写操作速度,可以看出leveldb要好一些。

因为主要是内存操作,内存操作没有log,(加上log会严重影响性能),猜测的原因可能是:

  1. leveldb的skiplist的原子指针用的是memory barrier实现的,而rocksdb使用的atomic实现的。
  2. rocksdb采用了很多虚函数的地方,性能有可能比leveldb要差一些。

场景2

每个key 8byte,value 1000byte。

  leveldb rocksdb(flush和compaction共用线程) rocksdb(flush和compaction分开线程)
请求数 1000000 1000000 1000000
数据量 1G 1G 1G
耗时s 70 138 125
吞吐量(Mps) 14.62857143 7.420289855 8.192
qps 14285.71429 7246.376812 8000
是否发生stall

结论仍然是leveldb要更好一些,具体查看LOG文件,可以看出端倪,rocksdb的最后的level分布是:[6 359 148 0 0 0 0],level1文件严重超出范围,这样level0的文件并到level1上的时候就需要读入非常多的文件。咋

其中一次8个level0的319个level1的文件进行一次compaction,花费的时间可想而知。

那么为什么会这样呢?因为rocksdb在挑选compaction的时候,如果level0的文件数目超出level0_slowdown_writes_trigger的时候得分异常高,所以会一直发生level0向level1转移的情况,没有机会level1向level2转移。在这种情况下rocksdb就走向了深渊。。。。leveldb挑选compaction的时候,level0的分值是文件数目除以kL0_CompactionTrigger,其他level的分值是该level的总文件大小除以这个level的最大byte

当rocksdb的flush和compaction分为两个进程的时候时间稍有减少,可以看出效果很不明显。这个原因是磁盘是瓶颈,分为两个进程并不能提高磁盘的吞吐量。

结论

从这个比较中可以看出,在写量非常大的时候,leveldb的性能还是要优于rocksdb的

rocksdb和leveldb性能比较——写性能的更多相关文章

  1. 提高HBase写性能

    以下为使用hbase一段时间的三个思考,由于在内存充足的情况下hbase能提供比较满意的读性能,因此写性能是思考的重点.希望读者提出不同意见讨论 1 autoflush=false的影响 无论是官方还 ...

  2. HBase最佳实践-写性能优化策略

    本篇文章来说道说道如何诊断HBase写数据的异常问题以及优化写性能.和读相比,HBase写数据流程倒是显得很简单:数据先顺序写入HLog,再写入对应的缓存Memstore,当Memstore中数据大小 ...

  3. cassandra mongodb选择——cassandra:分布式扩展好,写性能强,以及可以预料的查询;mongodb:非事务,支持复杂查询,但是不适合报表

    Of course, like any technology MongoDB has its strengths and weaknesses. MongoDB is designed for OLT ...

  4. mongodb官网文档阅读笔记:与写性能相关的几个因素

    Indexes 和全部db一样,索引肯定都会引起写性能的下降,mongodb也没啥特别的,相对索引对读性能的提示,这些消耗通常是能够接受的,所以该加入的索引还是要加入.当然须要慎重一些.扯点远的,以前 ...

  5. 漫谈linux之文件IO篇(SSD写性能和机械硬盘差不多,读是4到10倍)

    前同事的文章,觉得写得很清晰,收藏了. http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术 ...

  6. 存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?

    ​引言 随着大数据技术架构的演进,存储与计算分离的架构能更好的满足用户对降低数据存储成本,按需调度计算资源的诉求,正在成为越来越多人的选择.相较 HDFS,数据存储在对象存储上可以节约存储成本,但与此 ...

  7. 提高 web 应用性能之 CSS 性能调优

    简介 Web 开发中经常会遇到性能的问题,尤其是 Web 2.0 的应用.CSS 代码是控制页面显示样式与效果的最直接“工具”,但是在性能调优时他们通常被 Web 开发工程师所忽略,而事实上不规范的 ...

  8. ELK 性能(1) — Logstash 性能及其替代方案

    ELK 性能(1) - Logstash 性能及其替代方案 介绍 当谈及集中日志到 Elasticsearch 时,首先想到的日志传输(log shipper)就是 Logstash.开发者听说过它, ...

  9. Java程序性能优化之性能概述

    性能的基本概念 一).什么叫程序的性能? 程序运行所需的内存和时间. 二).性能的表现形式: 1).执行速度: 程序的反应是否迅速,响应时间是否足够短. 2).启动时间:程序从运行到可以处理正常业务所 ...

随机推荐

  1. opencv-python图像处理基础(一)

    #一.读取图像数据 import cv2 img=cv2.imread("d:/image0.JPG") #读取图片数据 print(img) cv2.imshow('image' ...

  2. bay——linux6.5-PV-LV-VG扩容.txt

    [root@rac2 cdrom]# export LANG=en_US[root@rac2 cdrom]# lsblk[root@rac2 cdrom]# lvscan --- 查看系统PV LV ...

  3. Delphi 任务栏中不显示窗口

    目的: 1. 窗口不在任务栏显示. 2. 窗口不显示在Alt+Tab的切换列表中. 3. 在任务管理器的应用程序列表中不显示. 示例: type TAppWndBrowser = class( TFo ...

  4. GNS3 2.18 + ASA(IOU)

    使用软件及版本 地址:https://www.gns3.com/ gns3: 2.1.18 ASA:asa842-initrd asa842-vmlinuz 一.gns3 vm安装 1.安装 注意:启 ...

  5. 14.web4

    右键查看源代码 先进行URL解码 解码之后可以得到一串 js 代码, 具体逻辑大概就是 var p1 = "67d709b2b"var p2 = "aa648cf6e87 ...

  6. 使用docker运行springboot项目

    本文主要讲的是使用docker运行springboot项目 获取一个springboot项目 这里我没有重新构建,用的之前写的一个项目,直接从github上下载下来,地址:https://github ...

  7. C#开发BIMFACE系列26 服务端API之获取模型数据11:获取单个面积分区信息

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列25 服务端API之获取模型数据9:获取楼层对应面积分区列表>一文中介绍了如何获取单个模型中单个楼层包 ...

  8. IT兄弟连 Java语法教程 流程控制语句 控制循环结构2

    使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...

  9. javascript刷新当前页面的几种方式

    这里总结一下JavaScript刷新当前页面的几种方式. 1.history对象. history.go(0); 2.location对象. location.reload(); location = ...

  10. java 类内部定义接口

    java类内部可以定义接口,作用可以看作是对类功能的进一步补充,类里面包含两部分:一部分是自己的固定的,一部分是可以变化的,而这可变的部分就编程了一个接口. 另一个作用是避免命名冲突. 示例 类Fru ...