适用版本
ODP 所有版本。
问题描述
应用程序端反馈在进行大数据量导入时 应用日志报错 Connection is closed & Connection reset:

与此同时,ODC 白屏界面的 SQL 窗口也遇到报错:SQL执行异常,导致连接断开。

问题原因
因为应用程序和 ODC 相对于数据库服务器来说是两个不相干的客户端,而它们二者几乎同时间断连,且二者直接连接的 <IP 地址:端口> 相同,初步猜测是 obproxy 或 observer 发生了异常,进而导致两个不相干的客户端同时断连了。 为验证该猜测,需要进一步分析链路上的 obproxy 和 observer 在问题发生时间点附近的相关日志。
首先从最接近应用程序 /ODC 的 obproxy 日志入手,搜索问题时间点附近的 ERROR 级别的日志,可以发现:
[2023-08-22 15:55:59.601562] ERROR [PROXY] do_monitor_mem (ob_proxy_main.cpp:959) [69579][Y0-FFFF66742D70] [lt=66] [dc=0] obproxy's memroy is out of limit's 90% !!!(mem_limited=2147483648, OTHER_MEMORY_SIZE=73400320, is_out_of_error_mem_limit=true, cur_pos=6) BACKTRACE:0xb31a28 0xb0c364 0xab9b50 0xac6254 0x1577e18 0x15b28d0 0xce10f4 0xffff7aba878c 0xffff7aa2508c
[2023-08-22 15:56:01.602124] ERROR [PROXY] do_monitor_mem (ob_proxy_main.cpp:934) [69579][Y0-FFFF66742D70] [lt=67] [dc=0] obproxy's memroy is out of limit, will be going to commit suicide(mem_limited=2147483648, OTHER_MEMORY_SIZE=73400320, is_out_of_mem_limit=true, cur_pos=7) BACKTRACE:0xb31a28 0xb0c364 0xab9b50 0xac6158 0x1577e18 0x15b28d0 0xce10f4 0xffff7aba878c 0xffff7aa2508c
[2023-08-22 15:56:01.603388] ERROR [PROXY] do_monitor_mem (ob_proxy_main.cpp:952) [69579][Y0-FFFF66742D70] [lt=64] [dc=0] obproxy will kill itself in seconds(seconds=2, g_proxy_fatal_errcode=-4080) BACKTRACE:0xb31a28 0xb0c364 0xaba4bc 0xac61b8 0x1577e18 0x15b28d0 0xce10f4 0xffff7aba878c 0xffff7aa2508c
...
[2023-08-22 15:56:03.639316] INFO [PROXY] ob_proxy_main.cpp:545 [777294][Y0-0] [lt=0] [dc=0] succ to init logger(max_log_file_size=268435456, async_tid=281460886427600)
...
[2023-08-22 15:56:03.642955] INFO [SHARE] ob_common_config.cpp:96 [777294][Y0-0] [lt=5] [dc=0] Load config succ(name="proxy_mem_limited", value="2G")
[2023-08-22 15:56:03.683900] INFO [PROXY] ob_proxy_config.cpp:39 [777294][Y0-0] [lt=3] [dc=0] | proxy_mem_limited = 2G
说明
OBProxy 中的 proxy_mem_limited 参数用于修改 OBProxy 的内存限制,该参数为 obproxy 进程占用系统内存最大上限,超过则进程主动退出,取值范围为 [100MB,100GB],修改后无需重启直接生效。
obclient [oceanbase]> show proxyconfig like 'proxy_mem_limited';
返回结果如下:
+-------------------+-------+-------------------------------------+-------------+---------------+
| name | value | info | need_reboot | visible_level |
+-------------------+-------+-------------------------------------+-------------+---------------+
| proxy_mem_limited | 2G | proxy memory limited, [100MB, 100G] | false | USER |
+-------------------+-------+-------------------------------------+-------------+---------------+
1 row in set (0.00 sec)
解决方法
调大 proxy_mem_limited 参数值。
如果 OBProxy 所在服务器内存充裕的话,建议将该参数值调大为 8G,无需重启立刻生效:
$ obclient -hxxx.xxx.xxx.xxx -P2883 -uroot@sys#obcluster -pxxx
obclient [oceanbase]> alter proxyconfig set proxy_mem_limited='8G';
Query OK, 0 rows affected (0.01 sec)
obclient [oceanbase]> show proxyconfig like 'proxy_mem_limited';
返回结果如下:
+-------------------+-------+-------------------------------------+-------------+---------------+
| name | value | info | need_reboot | visible_level |
+-------------------+-------+-------------------------------------+-------------+---------------+
| proxy_mem_limited | 8G | proxy memory limited, [100MB, 100G] | false | USER |
+-------------------+-------+-------------------------------------+-------------+---------------+
1 row in set (0.00 sec)