本文为您介绍 OBHighWatermarkMonitor 因目标端 OceanBase 数据库内存或 CPU 不足导致写入阻塞的解决方法。
适用版本
适用于 OceanBase 迁移服务(OceanBase Migration Service,OMS)V4.1.0 及之后版本。
问题描述
数据写入 OceanBase 数据库时,出现 OBHighWatermarkMonitor 相关 WARN 日志,RPS 跌至 0。
问题原因
因目标端 OceanBase 数据库内存或 CPU 不足导致写入数据阻塞,OBHighWatermarkMonitor 相关 WARN 日志 如下。
| 报错 | 描述 |
|---|---|
| [OBHighWatermarkMonitor]Detect free cpu percent [{}] < [{}(config)] | 表示 CPU 超过预期值。 |
| [OBHighWatermarkMonitor]Detect free memory percent [{}] < [{}(config)] | 表示内存超过预期值。 |
| [OBHighWatermarkMonitor] pausing for the minimum free memory limitations, sleep {} mill | 表示写入正在被阻塞。 |
| [OBHighWatermarkMonitor]Meet SQLException code: {} | 表示可能是由于 SQL 执行异常导致阻塞(权限异常及查询表异常不会阻塞)。 |
| [OBHighWatermarkMonitor]Failed to check ob status. | 表示可能是由于程序内部原因阻塞。 |
首先需要确定 OceanBase 数据库是否处于高负载状态。如果关闭 OceanBase 数据库防导爆功能,可能会导致用户使用该目标端租户或者集群出现问题。如果处于一直转储的状态,对于写入性能也不能有所提高。
解决方法
如果确认目前报错阻塞写入不合理(例如,因为程序问题导致阻塞或目标端 OceanBase 数据库比较空闲等),您可以通过更改配置项来修改阻塞阈值或关闭阻塞能力。需要修改的配置项如下:
sink.obFreeMemoryMin:表示运行时允许的最小空闲内存,默认值为 20,表示当 OceanBase 数据库内存的使用率达到 80% 以上时开始阻塞。运行调整值 0 - 100,如果调整为 0,则表示不限制。sink.obFreeCpuMin:表示运行时允许的最小空闲 CPU,默认值为 0。202307 之前的版本中默认值为 10,表示当 OceanBase 数据库的 CPU 使用率达到 90% 以上时开始阻塞。运行调整值 0 - 100,如果调整为 0,则表示不限制。202307 之后发布的版本中新增
sink.highWatermarkQueryIntervalSec,表示查询 CPU 和内存的间隔,单位为秒,默认值为 1 秒(旧版本的默认值为 5 秒)。
下表为相关 Metrics 信息。
| 参数 | 描述 |
|---|---|
| ob_free_memory | 目前目标端 OceanBase 数据库的内存空闲率。 |
| ob_free_cpu | 目前目标端 OceanBase 数据库的 CPU 空闲率。 |
| paused_time_ms | 每秒因为水位限制停止多少毫秒。 |
| paused_total_time_ms | 从项目运行开始至当前时间,因为水位限制停止多少毫秒。 |
| ob_watermark_detect_times | 水位检测总次数,重启项目会置为 0。 |
| ob_exceed_mem_high_watermark_times | 水位检测时,内存超出水位总次数,重启项目会置为 0。 |
| ob_exceed_cpu_high_watermark_times | 水位检测时,CPU 超出水位总次数,重启项目会置为 0。 |