本文摘要
本文分析并复现了 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-

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

被折叠的 条评论
为什么被折叠?



