---
title: "性能调优 | OceanBase 文档中心"
description: "性能调优 obbinlog 自 V4.2.0 开始引入了并发版本的日志转换，整体逻辑如下: 如图所示，obbinlog 在 Binlog 实例中引入了 Disruptor-cpp ，利用其提供的环形缓冲区 RingBuffer，实现了 Binlog 日志转换、序列化和释放三个阶段的并发执行，相关的配置项参见 元数据信…"
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*qvvxQ5-hqEoAAAAAAAAAAAAADiGDAQ/original) OceanBase Binlog 服务V 4.2.0 社区版

# 性能调优

更新时间：2026-05-01 08:38:42

[编辑](https://github.com/oceanbase/oblogproxy-doc/edit/V4.2.0/zh-CN/800.manual/300.performance-tuning.md)  

obbinlog 自 V4.2.0 开始引入了并发版本的日志转换，整体逻辑如下:

![Binlog RingBuffer](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/oblogproxy/V4.2.0/zh-CN/obbinlog-ringbuffer.png)

如图所示，obbinlog 在 Binlog 实例中引入了 [Disruptor-cpp](https://github.com/Abc-Arbitrage/Disruptor-cpp)，利用其提供的环形缓冲区 RingBuffer，实现了 Binlog 日志转换、序列化和释放三个阶段的并发执行，相关的配置项参见 [元数据信息](https://www.oceanbase.com/docs/community-oblogproxy-doc-1000000001999441) 中的 **集群配置参数**。

## 配置模版

目前，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 实例的性能状态。日志信息如下所示：

```text
[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`。

```SQL
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`。示例如下：

```SQL
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`。示例如下：

```SQL
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` 进行排查。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
