问题描述
OceanBase 数据库 observer.log 报错 (OCP 也会告警) 信息如下。
ERROR [SQL.ENG] interrupt_qc (ob_px_interruption.cpp:184) [xxxxx][xxxxx][xxxxx-xxxxx] [lt=9] [dc=0] fail send interrupt signal to qc(addr="xxx.xxx.xxx.xxx:xxxx", int_code={code:-4080, info:{msg:"tid:xxxxx,from:"xxx.xxx.xxx.xxx:xxxx",TASK ABORT QC"}}, orig_int_code={code:-4080, info:{msg:"tid:xxxxx,from:"xxx.xxx.xxx.xxxx:xxxx",TASK ABORT QC"}}, ret=-4080) BACKTRACE:0xa1ff028 0xa1e34d9 0x2c2f3c1 0x2c51685 0x2ce73a4 0x890934e 0x890bab2 0x897fec9 0x89807a3 0x8977d3b 0x892d1a9 0x892e520 0x8933ebb 0x891b4a4 0x891cb75 0x2909506 0x2907313 0x2902524 0x748e2ea 0x32649a7 0xa010676 0xa00d95f 0xa008f8e
WARN [RPC.FRAME] easy_session_create_respect_memory_limit (ob_req_transport.cpp:165) [xxxxx][xxxxx][xxxxx-xxxxx] [lt=11] [dc=0] easy exceed memory limit, dest server has too many pending request, maybe dest server slow or unreachable(dest="xxx.xxx.xxx.xxx:xxxx", stat->size=5795287552, stat->count=5, easy_server_memory_limit=4294967296)
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
问题原因
OceanBase 数据库在进行批量导数据的业务, 此时并发请求数量达到上万, 平均每个请求 rpc 包大小为几百兆, 批量导数据时请求数据大小超过了 OBServer 的 rpc packet 网络传输内存上限参数 __easy_memory_limit 默认值 4G 的限制, 导致目标服务器有太多待处理请求,可能目标服务器速度慢或无法访问。
解决方法
业务上采用分批导数据的方式来减少并发请求数量,每批数据大小不超过 OBServer 的
rpc packet网络传输内存上限参数__easy_memory_limit的一半,以保证每个请求的大小不超过限制。根据具体请求数据大小调整 OBServer 的
rpc packet网络传输内存上限参数__easy_memory_limit的值,参考如下命令。[admin@hostname oceanbase]$./bin/observer -i eth0 -p 2881 -P 2882 -n test2 -z zone1 -d /home/admin/oceanbase/store/test2 -l info -o'rootservice_list=xx.xx.xx.xx:2882:2881,\ config_additional_dir=/data/1/test2/etc2,/data/1/test2/etc3,cluster_id=11,stack_size=1M,__easy_memory_limit=6G,\ cpu_count=16,\ workers_per_cpu_quota=10'使用负载均衡器来分摊请求,避免过多的请求压力集中在单个服务器上。
调整目标服务器的配置,增加内存、调整网络带宽等,以提升目标服务器的处理能力。