使用unordered_write调优RocksDB写性能

news2025/3/14 9:38:41

在使用rocksdb存储的服务中,我们发现QPS在4w/s就怎么调整都上不去了,写性能受到了某种限制。为什么呢?下图描述了rocksdb写入的流程。我们发现 unordered_write = true可以提高写入吞吐量。

image-20220510132626787.png

  1. rocksdb的数据正常写入流程是,多个线程形成一个queue(也叫write_group),不在这个queue线程的或者后面来的线程就等待,等待上一个queue所有所有数据写入完成了后,后面的线程也会组织成一个新的queue接着写入
  2. 一个queue的写入分二步,写wal和写mem,默认都统一由当时queue的lead 线程来完成,并且这二步是串行的。因为非当前queue的其它写入线程要一直等待当前queue的全部写入完成才开始执行,导致吞吐量上不去。
  3. unordered_write= true 的优化思路是当前queue的leader写入wal完成后,不用接着写mem而是首先通知当前queue的其它线程让它们自行写入mem,然后通知非当前queue的其它线程,这样其它线程会立马形成新的queue继续写入,新的queue就节省了等待上一个queue写mem的时间!这里做的好处当然可以大大提高吞吐量,但坏处是以前数据的一致性试图就无法保证。因为当前queue的返回了,这个时候mem才开始写,并没有写入完成,这个时候来读就可能读到老的数据。 简单地将unordered_write改为true,我们发现很QPS迅速飙升到10w/s+。这给了我们很大的惊喜。

unordered_write改为true为什么有效

我们对比两个参数的堆栈来看看到底有什么魔法:下图是我在相关函数加入跟踪代码,不同参数下的堆栈:

image-20220510140745695.png

我们发现在unordered_write改为true后,write_thread.cc:636 ::ExitAsBatchGroupLeader被及早地调用,此时写memtable是其他线程都可以去写,注意,此时rocksdb的memtable是并发skiplist,在unordered_write改为true后调用的自选CAS版本的skiplist,效果显著。 我们进一步使用pref来看看调用CPU耗损:

unordered_write为false

image-20220510191607750.png

unordered_write为true

image-20220510170629090.png

我们看到基于提早释放,write_thread.cc:636 ::ExitAsBatchGroupLeader的效果:unordered_write = true的CPU耗损,对比下一张图,CPU占比减少了1倍之多,而还获取了4倍的写入性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九月 NFT 行业解读:熊市情绪仍占上风

作者: stellafootprint.network 9 月,著名主流媒体《滚石》(Rolling Stone)发表了一篇题为《你的 NFT 实际上——终于——完全不值钱了》(Your NFTs Are Actually — Finally — Totally Worthless)的文章&#xff0c…

【网络编程】从网络编程、TCP/IP开始到BIO、NIO入门知识(未完待续...)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

NumPy基础及取值操作

目录 第1关:ndarray对象 相关知识 怎样安装NumPy 什么是ndarray对象 如何实例化ndarray对象 使用array函数实例化ndarray对象 使用zeros,ones,empty函数实例化ndarray对象 代码文件 第2关:形状操作 相关知识 怎样改变n…

液压自动化成套设备比例阀放大器

液压电气成套设备的比例阀放大器是一种电子控制设备,用于控制液压动力系统中的液压比例阀1。 比例阀放大器通常采用电子信号进行控制,以控制比例阀的开度和流量,以实现液压系统的可靠控制。比例阀放大器主要由以下组成部分: 驱动…

tomcat 服务器

tomcat 服务器 tomcat: 是一个开源的web应用服务器。区别nginx,nginx主要处理静态页面,那么动态请求(连接数据库,动态页面)并不是nginx的长处,动态的请求会交给tomcat进行处理。 nginx-----转发动态请求-…

Golang学习:基础知识篇(三)—— Map(集合)

Golang学习:基础知识篇(三)—— Map集合 前言什么是Golang?Map集合定义 Map综合实例补充 前言 很久之前就想学Go语言了,但是一直有其他东西要学,因为我学的是Java嘛,所以后面学的东西一直是跟J…

Element-UI 日期选择器--禁用未来日期

在做项目的时候经常会遇到一些报表需要填写日期,一般是填写当日及当日以前,这时候我们的日期选择器就需要进行一些限制,比如: 这样之后,就不会误填写到明天啦,下面让我们看一下代码实现 html页面代码 这里…

Unity ECS最新DOTS环境搭建教程

最近DOTS终于发布了正式的版本, 今天我们来基于Unity 2023.1.6来搭建DOTS 1.0.16的开发环境与注意事项。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。 1…

Liunx C运算符

一、运算符 &#xff08;一&#xff09;算数运算符 1、float和double不能进行取余操作。 &#xff08;二&#xff09;关系运算符 1、逻辑非 2、逻辑与 例子&#xff1a; if(&#xff08;a-1&#xff09;<b&&b) 如果为真则自增&#xff0c;为假不自增 3、逻辑或 …

leaflet 绘制显示半圆形,扇形示例 (134)

第134个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中绘制显示半圆形,扇形 。这里引用了一个插件,非常方便的绘制扇形和半圆形等。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共77行)安装插件相…

虚拟内存技术的基本概念(局部性原理,特征,实现)

1.传统存储管理方式的特征、缺点 很多暂时用不到的数据也会长期占用内存&#xff0c;导致内存利用率不高。 1.一次性: 作业必须一次性全部装入内存后才能开始运行。 这会造成两个问题: ①作业很大时&#xff0c;不能全部装入内存&#xff0c;导致大作业无法运行; ②当大量作…

node多版本管理器nvm

node多版本管理器nvm 1、为何要使用node版本管理器2、nvm安装步骤2-1、卸载系统中的node2-2、下载nvm2-3、安装 3、维护node版本3-1、安装指定版本node3-2、查看本机已安装的所有node版本3-3、切换本机node版本 1、为何要使用node版本管理器 在日常开发中&#xff0c;难免会遇…

apache log4j漏洞复现

log4j是开源的java存储日志的框架&#xff0c;一般都是大企业用&#xff0c;小企业自带的日志功能足够使用&#xff0c;Log4j2是默认支持解析ldap/rmi协议的&#xff0c;打印的日志中包括ldap/rmi协议都行。 具体介绍参考以下文章&#xff1a; log4j2---基于vulhub的log4j2漏…

Triple协议的隐式参数传递过程

前言 Dubbo 框架的 RPC 调用除了可以传递正常的接口参数外&#xff0c;还支持隐式参数传递。 隐式参数的传递依赖 RpcContext 对象&#xff0c;它持有一个 Map 对象&#xff0c;消费者往 Map 里写入数据&#xff0c;客户端在发起 RPC 调用前会构建 RpcInvocation&#xff0c;然…

linux中如何配置静态ip模式?

对于Linux系统来说&#xff0c;静态IP模式是一种常见的网络配置方式。相比动态IP模式&#xff0c;静态IP模式可以提供更加稳定的网络连接和更好的网络性能。本文将介绍在Linux中如何配置静态IP模式。 一、准备工作 在开始配置之前&#xff0c;需要先做好以下准备工作&#xff1…

Python爬虫基础之Selenium详解

目录 1. Selenium简介2. 为什么使用Selenium&#xff1f;3. Selenium的安装4. Selenium的使用5. Selenium的元素定位6. Selenium的交互7. Chrome handless参考文献 原文地址&#xff1a;https://program-park.top/2023/10/16/reptile_3/ 本文章中所有内容仅供学习交流使用&…

k8s集群授权prometheus(集群外部署)

一、前言 在集群外部prometheus想要调用k8s集群的apiserver获取监控数据需要通过token和ca验证&#xff0c;在集群内部部署的prometheus就不会有这个情况&#xff0c;因为集群内部部署prometheus pod的时候就已经注入了访问集群的token和ca文件&#xff0c;所以以下就针对k8s集…

吴恩达深度学习笔记

B站看的视频&#xff0c;课太长了&#xff0c;180多节&#xff0c;但搬运的没有作业练习&#xff0c;最好找个能练习的 1&#xff0c;假设模型时&#xff0c;以前(2011版机器学习)用西塔代表参数组成的向量&#xff0c;现在用w代表参数组成的向量&#xff0c;b代表西塔0&#x…

Django REST Framework完整教程-RESTful规范-序列化和反序列数据-数据视图

文章目录 1.简介及安装2.案例模型2.1.创建模型2.2.安装mysql必要组件2.3.管理后台转中文2.4.启动后台 3.数据序列化4.RESTful规范4.1.协议、域名和版本4.2.uri(统一资源标识符)4.3.查增删改4.4.过滤信息&#xff08;Filtering&#xff09;4.5.状态码&#xff08;Status Codes&a…

Prometheus-Grafana

Grafana可对Prometheus实现可视化操作。prometheus-grafana提供了一个可运行的环境用于对测试网络进行实时监控。prometheus-grafana下有一个docker-compose.yaml文件用于控制prometheus和grafana的启动&#xff0c;和监控网络的指标。 配置需求&#xff1a; 推荐使用linux系统…