首批通过分布式安全可靠测评,为关键业务系统打造
性能调优
更新时间:2026-05-01 08:38:42
obbinlog 自 V4.2.0 开始引入了并发版本的日志转换,整体逻辑如下:

如图所示,obbinlog 在 Binlog 实例中引入了 Disruptor-cpp,利用其提供的环形缓冲区 RingBuffer,实现了 Binlog 日志转换、序列化和释放三个阶段的并发执行,相关的配置项参见 元数据信息 中的 集群配置参数。
配置模版
目前,Binlog 服务的资源使用主要分为以下两部分:
obcdc 拉取日志:内存使用主要由
binlog_memory_limit进行限制。同时,当binlog_working_mode为memory时,obcdc 会将待消费的数据存储在内存中,因而会占用更多的内存空间,而binlog_working_mode为storage时,相关数据主要存储在磁盘,因此会使用更多的磁盘空间。日志格式转换和客户端订阅:转换完成的日志文件将存储在磁盘上,因此占用的磁盘空间会随着时间的推移而增大。内存和 CPU 的使用情况主要受环形缓冲区大小、预分配内存空间以及线程池大小的影响。
在保持 obcdc 处理队列大小和 binlog 预分配空间大小使用默认值的情况下,针对不同的硬件配置,有以下几套配置供参考。
模版 1:2C 8G
预计占用资源:
- 内存:4GB + 4GB + 32MB
- CPU:2C
预估性能在 5-6 万 RPS。
配置参数:
| 参数 | 取值 |
|---|---|
| binlog_convert_ring_buffer_size | 16 |
| binlog_convert_thread_size | 2 |
| binlog_convert_number_of_concurrences | 1 |
| binlog_serialize_ring_buffer_size | 16 |
| binlog_serialize_thread_size | 3 |
| binlog_serialize_parallel_size | 1 |
| binlog_release_ring_buffer_size | 1024 |
| binlog_release_thread_size | 4 |
| binlog_release_parallel_size | 2 |
模版 2:4C 8G
预计占用资源:
- 内存:4GB + 4GB + 64MB
- CPU:4C
预估性能在 8-10 万 RPS。
配置参数:
| 参数 | 取值 |
|---|---|
| binlog_convert_ring_buffer_size | 1024 |
| binlog_convert_thread_size | 4 |
| binlog_convert_number_of_concurrences | 3 |
| binlog_serialize_ring_buffer_size | 32 |
| binlog_serialize_thread_size | 4 |
| binlog_serialize_parallel_size | 2 |
| binlog_release_ring_buffer_size | 1024 |
| binlog_release_thread_size | 4 |
| binlog_release_parallel_size | 2 |
模版 3:8C 9G
预计占用资源:
- 内存:4GB + 4GB + 1GB
- CPU:8C
预估性能在 10-15 万 RPS。
配置参数:
| 参数 | 取值 |
|---|---|
| binlog_convert_ring_buffer_size | 1024 |
| binlog_convert_thread_size | 6 |
| binlog_convert_number_of_concurrences | 4 |
| binlog_serialize_ring_buffer_size | 512 |
| binlog_serialize_thread_size | 6 |
| binlog_serialize_parallel_size | 4 |
| binlog_release_ring_buffer_size | 1024 |
| binlog_release_thread_size | 4 |
| binlog_release_parallel_size | 2 |
模版 4:12C 9G
预计占用资源:
- 内存:4GB + 4GB + 1GB
- CPU:12C
预估性能在 15-20 万 RPS。
配置参数:
| 参数 | 取值 |
|---|---|
| binlog_convert_ring_buffer_size | 512 |
| binlog_convert_thread_size | 8 |
| binlog_convert_number_of_concurrences | 6 |
| binlog_serialize_ring_buffer_size | 512 |
| binlog_serialize_thread_size | 8 |
| binlog_serialize_parallel_size | 6 |
| binlog_release_ring_buffer_size | 1024 |
| binlog_release_thread_size | 4 |
| binlog_release_parallel_size | 2 |
模版 5:16C 10G
预计占用资源:
- 内存:4GB + 4GB + 2GB
- CPU:16C
预估性能在 20-25 万 RPS。
配置参数:
| 参数 | 取值 |
|---|---|
| binlog_convert_ring_buffer_size | 1024 |
| binlog_convert_thread_size | 13 |
| binlog_convert_number_of_concurrences | 12 |
| binlog_serialize_ring_buffer_size | 1024 |
| binlog_serialize_thread_size | 10 |
| binlog_serialize_parallel_size | 6 |
| binlog_release_ring_buffer_size | 1024 |
| binlog_release_thread_size | 4 |
| binlog_release_parallel_size | 2 |
性能调优
由于 Binlog 服务格式转换部分属于计算密集型,因此在设置性能参数时,线程数量建议不要超过 CPU 核心数,具体原则如下:
- 线程数 ≈ CPU 核心数:对于完全计算密集型的任务,通常建议线程数等于或略少于可用的 CPU 核心数。这样可以充分利用 CPU 资源,而不会因为过多的线程导致上下文切换开销增加。
- 考虑超线程(Hyper-Threading):如果 CPU 支持超线程技术,每个物理核心可以模拟两个逻辑核心。在这种情况下,线程数可以设置为物理核心数的两倍。例如,如果有 8 个物理核心,并且启用了超线程,那么你可以设置 16 个线程。
- 避免过度并行化:过多的线程会导致频繁的上下文切换,反而降低性能。因此,尽量保持线程数与 CPU 核心数相匹配。
如果出现了内核态 CPU 使用占比较高的情况,大概率是上下文切换频繁导致,此时可以降低并发数。
从 obbinlog V4.2.0 开始,Binlog 实例会在运行日志中打印如下指标,用户可以根据相应的指标数值判断一个 Binlog 实例的性能状态。日志信息如下所示:
[2024-12-23 20:44:02.897710] [info] counter.cpp(69): Counter:[Span:2000ms][Delay:123190330,123460630][RCNT:574119][RRPS:287059][RIOS:0][WCNT:2489781][WRPS:1244890][WIOS:93568488,AVG:75][XWIOS:0,AVG:0][RFETCH:1412113][ROFFER:266127][SPOLL:0][SENCODE:0][SSEND:0][ConvertRingBufferQ:1024][NDUMPER:0][NEventQ:49518][RecordQueueSize:44771][ReleaseRingBufferQ:38][SerializeRingBufferQ:8]
指标信息:
| 指标 | 说明 |
|---|---|
| ConvertRingBufferQ | 转换队列 RingBuffer 实际大小 |
| NEventQ | 转换后等待序列化落盘的 Binlog Event 队列 |
| RecordQueueSize | 从 OceanBase 数据库读取记录的队列 |
| ReleaseRingBufferQ | 释放队列 RingBuffer 实际大小 |
| SerializeRingBufferQ | Binlog Event 序列化落盘的 RingBuffer 队列大小 |
调优场景
注意
下述场景中修改的都是实例级别的参数,如需修改整个租户任务级别的参数,可使用 ALTER BINLOG <cluster_name>.<tenant_name> SET 命令,如:ALTER BINLOG `obcluster`.`test` SET binlog_convert_number_of_concurrences = '16';。
场景一:ConvertRingBufferQ 出现堆积,但 SerializeRingBufferQ 和 NEventQ 都未出现堆积
这种情况一般是转换出现了瓶颈,需调高 binlog_convert_thread_size 和 binlog_convert_number_of_concurrences,同时建议配置 binlog_convert_ring_buffer_size 值不小于 binlog_convert_number_of_concurrences 值。如果 record 记录较大,建议调小元数据库中的配置项 read_wait_num 及 storage_wait_num。
ALTER BINLOG INSTANCE `eq56dl14x5` SET binlog_convert_thread_size = '8';
ALTER BINLOG INSTANCE `eq56dl14x5` SET binlog_convert_number_of_concurrences = '4';
ALTER BINLOG INSTANCE `eq56dl14x5` SET binlog_convert_ring_buffer_size = '16';
场景二:ConvertRingBufferQ 出现堆积,且 SerializeRingBufferQ 和 NEventQ 都出现大量堆积
出现该场景说明序列化速度较慢,建议调高 binlog_serialize_thread_size 及 binlog_serialize_parallel_size。示例如下:
ALTER BINLOG INSTANCE `eq56dl14x5` SET binlog_serialize_thread_size = '8';
ALTER BINLOG INSTANCE `eq56dl14x5` SET binlog_serialize_parallel_size = '4';
场景三:SerializeRingBufferQ 出现堆积且 ReleaseRingBufferQ 出现大量堆积
出现该场景说明异步释放性能存在问题,此时需要调大 binlog_release_thread_size 及 binlog_release_parallel_size。示例如下:
ALTER BINLOG INSTANCE `eq56dl14x5` SET binlog_release_thread_size = '8';
ALTER BINLOG INSTANCE `eq56dl14x5` SET binlog_release_parallel_size = '4';
场景四:ConvertRingBufferQ 未出现堆积,且 RecordQueueSize 未出现大量堆积
出现该场景说明 obcdc 获取数据可能出现瓶颈,需要结合 libobcdc.log 进行排查。