1 Star 0 Fork 0

OceanBase / tutorials-doc

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
13.4-12-how-to-analyze-and-optimize-the-performance-of-oceanbase.md 5.20 KB
一键复制 编辑 原始数据 按行查看 历史
obdev 提交于 2023-08-07 12:38 . PullRequest: 39 常用词扫描

4.12 如何对 OceanBase 迁移性能进行简单分析和调优

DataX 的调优建议

DataX 本质上是个数据交换平台,将源端的数据读出,写入到目标端。其数据迁移性能取决于下面几个因素:

  • 源端的读性能。可以加并发,制约条件是对源库的影响、源库的性能瓶颈等。

  • DataX 自身的性能。DataX 是个 Java 程序,其能起的线程数有限,受限于所在主机的 CPU 和内存大小。

  • 网络传输性能。并发高的时候,网络传输要留意吞吐量是否达到网卡瓶颈。现在万兆网卡的吞吐量 10000Mb,很难达到。不过占用网络带宽对其他业务可能也会有影响。

  • 目标端的写入性能。也可以加并发,制约条件就是目标库写入性能瓶颈、对目标库的影响等。如果目标端是 OceanBase 数据库,需要针对 OceanBase 数据库调优。

  • 涉及到文件数据源时,关注文件所在磁盘 IO 性能。如 iops、吞吐量等。

所以 DataX 的调优就是调节 readerwriter 的各个并行参数,尽可能的把源数据库和目标端数据库资源能力都利用上,这样整体 DataX 的迁移效率才能达到最好。

此外,如果主机内存够大,datax.py 能使用的 JVM 内存也可以调大。您可编辑脚本,调大 -Xms-Xmx 参数。

vim bin/datax.py

30 DEFAULT_JVM = "-Xms16g -Xmx16g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%s/log" % (DATAX_HOME)

读写并行度

DataX 的配置文件中首先有 speed 的设置,其中 channel 是总的并发数。OceanBase 的 oceanbasev10writer 还进一步支持多线程,通过参数 "writerThreadCount":10 指定每个 channel 从源端读取的数据,再分几个并发线程写入。所以 OceanBase 数据库总的写入并发数是 channel * writerThreadCount

每个 writer 里还有个 batchsize,这是一个事务的记录数数量。通常建议 200-10000 都可以,尽量不要超过 1 万。在 OceanBase 数据库里事务太大太长,可能会到达事务超时时间(默认 120 秒)。

这里有趣的是,OceanBase 的 oceanbasev10writer 会把 batch insert 合并为一个 insert 多个 values 子句。所以 batchSize 也不要太大,否则 insert sql 文本太长, 高并发时也可能会报错(内存不足方面的错误)。当列非常多的时候(比如 100 列)或者值的内容有大文本时,建议 batchSize 控制在几百左右。

源端数据库读优化

当源端是数据库时,如果表有单列主键,并且主键列类型为数值型(如 number、bigint、integer、decimal 等),可以在源端 reader 里增加配置 "splitPk": "id"。这个时候,DataX 能先对主键进行切片,然后多个 channel 同时并发分段去读取源数据。如果没有该配置,源端就只能单并发读取数据。

OceanBase 写入的内存调优

OceanBase 数据库的数据读写模型比较特殊,增量都在内存里。当 OceanBase 机器已经是 SSD 盘时,IO 不会先成为 OceanBase 数据库的性能瓶颈,内存和 CPU 更有可能先成为瓶颈。大量数据写入时,增量对 MemTable 内存的消耗会很快。OceanBase 数据库设置不当的情况下,可能会出现内存耗尽的情况,进而写入报错。其他业务写入也会跟着报错。

OceanBase 数据库的内存优化过程比较复杂。这里先给出一个初始的设置,能降低内存写入报错的概率。

alter system set merge_thread_count = 32;  #  增大合并的线程数。
alter system set minor_merge_concurrency = 16;  #  增大转储的线程数,期望提高转储的速度。
alter system set _mini_merge_concurrency = 8;  #  增大 mini_merge 的线程数,期望提高 mini_merge 的速度(默认值为 3)。调大为 8 以后,发现会导致压测中 CPU 使用率有时飙升至 90%,对性能有影响。
alter system set memory_limit_percentage = 90;    #  OceanBase 占系统总内存的比例,提高 OceanBase 可用的内存量。
alter system set memstore_limit_percentage = 55;  #  MemStore 占租户的内存比,尽量增大 MemStore 的空间(但是可能对读操作有负面影响)。
alter system set freeze_trigger_percentage = 40;  #  启动 major/minor freeze 的时机,让转储(minor freeze)尽早启动,MemStore 内存尽早释放。
alter system set minor_freeze_times = 100;        #  minor freeze 的次数,尽量不在测试期间触发 major freeze。
alter system set minor_warm_up_duration_time = 0;  #  加快 minor freeze

OceanBase 数据库的 oceanbasev10writer 插件也提供参数(memstoreThreshold)监测增量内存的利用率,如果到达这个阈值,DataX 会自动降速。

OceanBase 数据库的增量内存使用也可以监控,关键 SQL 如下:

SELECT tenant_id, ip, round(active/1024/1024/1024) active_gb, round(total/1024/1024/1024) total_gb, round(freeze_trigger/1024/1024/1024) freeze_trg_gb, round(mem_limit/1024/1024/1024) mem_limit_gb
    , freeze_cnt , round((active/freeze_trigger),2) freeze_pct, round(total/mem_limit, 2) mem_usage
FROM `gv$memstore`
WHERE tenant_id =1001
ORDER BY tenant_id, ip;

OceanBase 数据库的监控产品也能监控增量内存的变化。

1
https://gitee.com/oceanbase/tutorials-doc.git
git@gitee.com:oceanbase/tutorials-doc.git
oceanbase
tutorials-doc
tutorials-doc
V1.0.0

搜索帮助