技术分享 | 调整 max-write-buffer-size 优化 pika 性能10倍的案例

【中间件】pika安装及性能测试 安装机器 环境参数:4cpu 内存8G 磁盘大小250G 10.19.157.140 主 10.19.157.141 从 磁盘类型判断:rota为1则表示磁盘可旋转,那么就是HDD;如果返回0,则表示磁盘不可以旋转,那么就有可能是SSD。 lsblk -d -o name,rota 执行结果如下:sda为SSD fd0和sr0为HDD name rota fd0 1 ... 阅读详情

作者:任坤

现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


1、背景

某业务写多读少,上线前预估TPS最高可达4w且可能会随时增长,去年上线时采用了mongo 4分片集群架构。

现在业务趋于稳定,日常TPS只有最高值的1/10不到,项目组出于成本考虑想要将其迁移到内存KV数据库,但是 redis纯内存模式机器成本有点高,经过调研后决定尝试360开源的pika。

我们采用的是3.3.6版本,机器A配置为8c8G200G,压测出现大量超时ERROR: redis: connection pool timeout,qps只有3k左右,且磁盘的%util 一直接近100,处于“饱和”状态。

同样版本的pika,在机器B上测试,qps能达到40K且没有1个超时错误,这台机器配置24c48G1.5T。 从多家云厂商那里获悉相同型号的云主机,硬盘容量越大IO吞吐会越高,因此一开始怀疑是硬件问题。

针对两台云主机进行FIO测试,配置更高的机器读写吞吐是会高一些(大概提升20%左右),但并没有pika qps指标相 差10倍这么夸张。

将机器B的pika配置文件复制到机器A上,重启pika再测进行压测,这次机器A的qps也能达到40K,说明pika配置 参数导致的性能差异。

2、诊断

两个配置文件参数相差的有点多,只能逐个修改并压测。

测试过程略过,最后确认是max-write-buffer-size设置不合理导致的,该参数默认值14045392(13M),调大为 4294967296(4G)后pika qps就从3k提升到了40K。

以下是对应测试案例的iostat截图

– max-write-buffer-size 14045392(13M)

– max-write-buffer-size 4294967296

两者最大的差异是w/s和avgrq-sz,其中avgrq-sz描述的是IO请求的平均大小,以扇区(512字节)为单位。

图1每秒磁盘写请求4700,每个请求平均大小为55 * 0.5 ~= 27.5K,出现了大量的小块写。

图2每秒磁盘写请求200左右,每个请求平均大小为800 * 0.5 ~= 400K,明显采用了批量落盘的策略。

再看%util 指标,这个不是我们通常理解的磁盘饱和度,而是磁盘使用率,其计算时只关注io请求数量,不理会每 个io请求的大小,即便达到了100,并不意味着磁盘吞吐已达上限。

假设某路段有1w辆私家车(每车只有1个人,avgrq-sz=1)同时通行,即便平均每秒放行10辆车(w/s=10),总体运 力也只有10人/s,若是改成50座大巴车(avgrq-sz=50),即便每秒只放行1辆车(w/s=1),总体运力也会提高到50 人/s。

在这个案例中,%util 记录的只是平均每秒通行的机动车数量,不关心每辆车坐了多少人,如果私家车的%util 是 100,那大巴车的%util只有10并且吞吐更高,跟上述截图描述的场景十分吻合。

关于max-write-buffer-size参数,pika官档原文如下:https://github.com/OpenAtomFoundation/pika/wiki/pika- %E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E

# Pika 底层单个rocksdb单个memtable的大小, 设置越大写入性能越好但会在buffer刷盘时带来更大的IO负载, 请 依据使用场景合理配置 
[RocksDb‐Tuning‐Guide](https://github.com/facebook/rocksdb/wiki/RocksDB‐Tuning‐Guide) 
write‐buffer‐size : 268435456 

# pika实例所拥有的rocksdb实例使用的memtable大小上限,如果rocksdb实际使用超过这个数值,下一次写入会造成 刷盘
[Rocksdb‐Basic‐Tuning](https://github.com/facebook/rocksdb/wiki/Setup‐Options‐and‐Basic‐Tuning) 
max‐write‐buffer‐size : 10737418240

RocksDB采用WAL + LSM架构,memtable可以看作是用户数据落盘的基本单位,memtable越大则落盘时越倾 向于批量写,更能有效利用磁盘IO吞吐。

最初的参数文件没有设置max-write-buffer-size,只有write-buffer-size,奇怪的是调大write-buffer-size并不会 将前者自动增大,两者不具备联动关系。

我在压测时尝试调大write-buffer-size到1G(max-write-buffer-size保持默认值),性能依然上不去,看来是max- write-buffer-size起到了决定性作用。

经过多次压测,最终我们的主要参数设置如下:

thread‐num : 8 #和cpu核数相同
thread‐pool‐size : 8
write‐buffer‐size : 268435456
max‐write‐buffer‐size : 4294967296
compression : snappy
max‐background‐flushes : 2
max‐background‐compactions : 2

3、结论

通过这个案例对iostat的输出指标有了更深一步的了解,以后再遇到%util达到100时先不要轻易作出磁盘IO已饱和 的结论,很可能是大量小IO请求导致的,可通过w/s和avgrq-sz进行辨别比较。

使用pika时,一定要设置max-write-buffer-size值,虽然和write-buffer-size参数名字很像,但两者没有联动关系 且max-write-buffer-size起到了决定性作用。

最后,我们的应用成功迁移到pika,相比之前的mongo集群节省了不少的机器资源开销,可见没有最好的DB,只有最适合的。

rocksdb写放大_谈谈 RocksDB 参数调优 背景RocksDB是由Fackbook公司开源的一款性能很高的Key Value存储引擎,有很多项目包括58存储团队的分布式KV存储产品WTable都使用它作为存储引擎。但是RocksDB参数调优也极其复杂,若希望RocksDB在不同机器、不同的应用场景发挥良好的性能,并不是一个简单的事情。绝大多数时候在一台机器或者一个集群中调整的参数,在另一个机器或集群中性能可能会不行。在RocksDB官网中,... 阅读详情

相关推荐

Pika vs Redis: 比较和新功能

Pika是一个基于Python的Redis协议客户端,旨在提供更好的性能和易用性。它支持Redis的大多数功能,并提供了额外的功能和优化。Pika旨在成为一个高性能、易于集成和可扩展的解决方案。Redis是一个开源的内存数据结构存储系统,也是一个高性能的键值对数据库。它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合,并提供了丰富的功能,如事务、发布/订阅和持久化。

DxJavascript的博客 1111

08-leveldb性能优化(二)

本文主要介绍leveldb写缓冲区大小、块缓存大小、块大小、文件大小等参数的原理,以及如何合理地设置这些参数以达到性能优化的目的。

错位竞争,单点突破。 2379

XC7K325T FPGA硬件设计实战:从板级原理图到高速接口优化

本文以XC7K325T FPGA为核心,详细阐述了从板级原理图设计到高速接口优化的完整硬件实战流程。内容涵盖芯片管脚与电源规划、时钟复位配置电路设计,并重点解析了DDR3内存子系统以及PCIe与光纤接口等高速电路的原理图与PCB设计要点,旨在帮助工程师构建稳定可靠的高性能硬件平台。

python9snake的博客 511

rocksdb-参数配置

一、关键参数 create_if_missing:创建缺失表 num_levels:层次数量,默认是7。如果L0大小有512MB,6层能容纳512M+512M+5G+50G+500G+5T,如果配置是7,在数据量少于前面计算的5T+的数据之前,最后一层是不会被使用的。如果num_levels配置为6,那么最下面一层数据量会大于5T max_background_flushes:memtable dump成sstable的并发线程数。默认是1,线程数小,当写入量大时,会导致无法写入。 max_backgrou

weixin_43763259的博客 4046

VS Code/TRAE集成Cppcheck并启用MISRA规则

本文探讨了嵌入式开发中Cppcheck工具集成与MISRA规则检查的必要性。详细介绍了安装配置步骤:安装VSCode/TRAE、Cppcheck软件、配置插件参数、安装Python环境,并重点说明了MISRA规则文件的设置方法。通过完整的配置流程,实现了嵌入式开发环境下静态检查与安全标准的落地。

SDFangFang2025的博客 1282

【Hadoop】开发插件安装

前言 Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。 Eclipse的插件机制是轻型软件组件化架构。在客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java...

weixin_44039347的博客 3207

mysql 大量写入 优化_优化了MYSQL大量写入问题,老板奖励了1000块给我

摘要:大家提到Mysql的性能优化都是注重于优化sql以及索引来提升查询性能,大多数产品或者网站面临的更多的高并发数据读取问题。然而在大量写入数据场景该如何优化呢?今天这里主要给大家介绍,在有大量写入的场景,进行优化的方案。总的来说MYSQL数据库写入性能主要受限于数据库自身的配置,以及操作系统的性能,磁盘IO的性能。主要的优化手段包括以下几点:1、调整数据库参数(1) innodb_flush_...

weixin_29023079的博客 931

逆概率加权法(Inverse Probability Weighting, IPW)的原理及R实现

逆概率加权(IPW)是一种用于解释由于非随机选择观测值或人群信息的非随机缺失而造成的缺失和选择偏差的方法。原理:这种方法可以通过对观察值的加权来修正分析,使其具有被选中的概率。IPW是基于这样一个假设,即整个研究人群都有可以预测纳入概率(非遗漏)的个体信息,因此,在考虑到这些信息后,我们可以仅从非遗漏的观察值开始对整个目标人群进行推断。计算的程序如下:首先,我们考虑整个研究人群,用逻辑回归模型计算非失访信息的概率,其中响应是非失访,协变量是其可能的预测因素。每个受试者的权重是由预测概率的倒数给出的。然后使用

Christina 5万+

RocksDB:memtable flush流程详解

本文介绍RocksDB memtable flush相关机制。

easonwx的博客 1952

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8263

华为OD机试双机位C卷-停车场收入统计 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 停车场收入统计,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 停车场收入统计。

qq_45776114的博客 2185

Rocksdb 的一些参数调优策略

通过本文,能够清楚 rocksdb的读写性能调优,compaction的核心调优,以及一些通用的优化配置。

天行健,地势坤 8980

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

阿飞2018 1385

AI视频生成调度图:原理、实战与画面闪烁解决方案

调度图是AI视频生成中的关键技术,通过时间轴参数映射实现对生成过程的精确控制。其核心原理是在不同时间点动态调整去噪强度、引导尺度和采样步数等参数,解决传统固定参数导致的画面闪烁和动作不连贯问题。在工程实践中,调度图能显著提升视频质量,特别适用于商业视频制作、游戏动画和影视特效等场景。本文基于Stable Video Diffusion框架,深入解析调度图在解决画面跳变和优化生成效果方面的应用,提供从环境配置到高级调度的完整实战方案。

weixin_34212762的博客 355

HyperLynx(十九)DDR(二)DDR的地址仿真

(5)设置水平标尺为2ns/div,垂直标尺为500mV/div,如果有必要,可以通过多次仿真,得到一个更加理想的结果。此外,还可以看到信号在高低电平切换时,反射波形基本趋于平缓,许多大的反射切换边缘已减小,这给了我们更大的定时裕量。如果这些DIMM是缓冲过的,则4个DIMM通道是可行的,但因为这是一个无缓冲DIMM,(20)在编辑传输线对话框中,选择“Values”选项卡,改变传输线长度为3in,具体设置如图所示,单击“确定”按钮。(17)为了增加电压摆幅,选择一个比原来的47Ω小的电阻。

小幽余生不加糖 4256

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

借助tmpfs内存盘,提高pika数据库性能

目前还在测试阶段,稍后会放入生产环境,届时更新文章。 测试服务器采用CODIS+pika分片模式搭建,2个机器,单台2核intel16G内存 先看redis-benchmark的测试 redis-benchmark -e -q -h test-codis-pika-2 -p 19000 -l -r 100000000 -d 10000 -P 100 set __rand_int__ __rand_int__ set __rand_int__ __rand_int__: 100603.62 requests

刘博平 439

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Rocksdb参数调优指南

高级用户可以配置自定义的memtable和表格式—— 定义memtable。SkipList —— 默认的memtableHashSkipList —— 只能与prefix_extractor工作。他把key放入基于key前缀的桶中。每个桶是一个skiplist。HashLinkedList —— 只能与prefix_extractor工作。他把key放入基于key前缀的桶中。每个桶是一个linked list。—— 定义表格式。基于块 —— 这是默认的表。适合于磁盘和闪盘上排序好的数据。

jingeche的博客 2493

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

RocksDB 的常用调优参数

RocksDB 的参数以其数据多和复杂著称,要全部弄懂也要费一番功夫,这里也仅仅会说一下我们使用的一些参数,还有很多我们也需要后面慢慢去研究。

大隐隐于野 1810

RocksDB参数调优

前言 RocksDB 是基于LSM的树存储引擎,可调参的有上百个,并且参数之间还有相互的影响,另外根据RUM猜想,读放大、写放大以及空间放大之间是制约关系,生产环境下需在三种放大因子之间进行权衡,这更增加了调优的难度。 架构图 RUM猜想 猜想指的是在 Read Overhead,Update Overhead 和 Memory (or Storage) Overhead 中,同时优化 2 项时需要以剩余的 1 项劣化作为代价 关键指标 调优需要关注的关键指标: 磁盘写带宽:Compaction的压力超

qq_42828391的博客 1426

What's new in PikiwiDB(Pika) v3.5.5

尊敬的社区朋友及 PikiwiDB(Pika) 用户们:非常高兴地宣布 — PikiwiDB(Pika)【下文简称 Pika】长期维护版本 v3.5的最新版本 — v3.5.5 今天正式发布。在这个版本中,除了修复所有已知的主从复制 bug 外,通过引入 RTC 特性其性能又有了大幅度提升,且主从 failover 机制兼...

weixin_41199365的博客 183

MySQL · RocksDB · Memtable flush分析

概述 首先我们知道在RocksDB中,最终数据的持久化都是保存在SST中,而SST则是由Memtable刷新到磁盘生成的,因此这次我们就主要来分析在RocksDB中何时以及如何来Flush内存数据(memtable)到SST. 简单来说在RocksDB中,每一个ColumnFamily都有自己的Memtable,当Memtable超过固定大小之后(或...

weixin_34326179的博客 1515

rocksdb写放大_Rocksdb

Apache Flink中的RocksDB状态后端 RocksDB 的 compaction 策略,并且提到了读放大、写放大和空间放大的概念,对 RocksDB 的调优本质上就是在这三个因子之间取得平衡。而在 Flink 作业这种注重实时性的场合,则要重点考虑读放大和写放大。Tuning MemTablememtable 作为 LSM Tree 体系里的读写缓存,对写性能有较大的影响。以下是一些值...

weixin_39545805的博客 1656

RocksDB的一些基本概念及简单应用(扫盲)

本文介绍RocksDB的一些基本概念和术语,及Java程序如何使用RocksDB。

大老龙的博客 2万+

pika配置文件说明

# Pika 端口 port : 9221 # pika进程数量,不建议超过核心数量,pika是多线程的 thread-num : 1 # Sync 线程数量 sync-thread-num : 6 # sync 处理线程的任务队列大小,一般没有必要修改 sync-buffer-size : 10 # Pika日志目录 log-path : ./log/ #...

weixin_30580943的博客 694

MySQL大量写入问题优化方案 MySQL参数调优

innodb_flush_log_at_trx_commit是数据库的事务提交设置参数,默认为1。设置为0时,数据写入是最快的,但有可能丢失上1秒的数据。 0:log buffer每隔1s进行刷盘。当机器出现宕机时,最多丢失1s的事务 1:事务提交后立即进行log buffer刷盘。 2:MySQL先将log buffer写入到os buffer,然后每隔1s将os buffer中的数据刷新到磁盘。...

xzh_blog 2514
上一篇: 分布式 | 数据库连接如何正确处理 TCP 连接三次握手失败
下一篇: 故障分析 | MySQL 中新建用户无法登陆的一种特殊场景
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值