故障分析 | OceanBase 频繁更新数据后读性能下降的排查

文章分析了OceanBase在数据更新后读性能下降的现象,发现原因是多版本数据行处理导致的资源消耗增加。通过火焰图和SQL执行过程分析,确认查询时实际读取行数大于实际行数。性能改善建议包括手动触发大合并和利用索引来优化执行计划。此外,提到OceanBase的bufferminormerge设计和Queuing表模式在特定场景下的优化作用。

本文摘要

本文分析并复现了 OceanBase 频繁更新数据后读性能下降现象的原因,并给出了性能改善建议。

背景

测试在做 OceanBase 纯读性能压测的时候,发现对数据做过更新操作后,读性能会有较为明显的下降。具体复现步骤如下。

复现方式

环境预备

部署OB

使用 OBD 部署单节点 OB。

版本 IP
OceanBase 4.0.0.0 CE 10.186.16.122

参数均为默认值,其中内存以及转储合并等和本次实验相关的重要参数值具体如下:

参数名 含义 默认值
memstore_limit_percentage 设置租户使用 memstore 的内存占其总可用内存的百分比。 50
freeze_trigger_percentage 触发全局冻结的租户使用内存阈值。 20
major_compact_trigger 设置多少次小合并触发一次全局合并。 0
minor_compact_trigger 控制分层转储触发向下一层下压的阈值。当该层的 Mini SSTable 总数达到设定的阈值时,所有 SSTable 都会被下压到下一层,组成新的 Minor SSTable。 2

创建 sysbench 租户

create resource unit sysbench_unit max_cpu 26, memory_size '21g';
create resource pool sysbench_pool unit = 'sysbench_unit', unit_num = 1, zone_list=('zone1');
create tenant sysbench_tenant resource_pool_list=('sysbench_pool'), charset=utf8mb4, zone_list=('zone1'), primary_zone=RANDOM set variables ob_compatibility_mode='mysql', ob_tcp_invited_nodes='%';

数据预备

创建 30 张 100 万行数据的表。

sysbench ./oltp_read_only.lua --mysql-host=10.186.16.122 --mysql-port=12881 --mysql-db=sysbenchdb --mysql-user="sysbench@sysbench_tenant"  --mysql-password=sysbench --tables=30 --table_size=1000000 --threads=256 --time=60 --report-interval=10 --db-driver=mysql --db-ps-mode=disable --skip-trx=on --mysql-ignore-errors=6002,6004,4012,2013,4016,1062 prepare

环境调优

手动触发大合并

ALTER SYSTEM MAJOR FREEZE TENANT=ALL;

# 查看合并进度
SELECT * FROM oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION\G

数据更新前的纯读 QPS

sysbench ./oltp_read_only.lua --mysql-host=10.186.16.122 --mysql-port=12881 --mysql-db=sysbenchdb --mysql-user="sysbench@sysbench_tenant"  --mysql-password=sysbench --tables=30 --table_size=1000000 --threads=256 --time=60 --report-interval=10 --db-driver=mysql --db-ps-mode=disable --skip-trx=on --mysql-ignore-errors=6002,6004,4012,2013,4016,1062 run

read_only 的 QPS 表现如下:

第一次 第二次 第三次 第四次 第五次
344727.36 325128.58 353141.76 330873.54 340936.48

数据更新后的纯读 QPS

执行三次 write_only 脚本,其中包括了 update/delete/insert 操作,命令如下:

sysbench ./oltp_write_only.lua --mysql-host=10.186.16.122 --mysql-port=12881 --mysql-db=sysbenchdb --mysql-user="sysbench@sysbench_tenant"  --mysql-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值