首批通过分布式安全可靠测评,为关键业务系统打造
core 之后 easy 频繁刷的情况
更新时间:2024-04-11 06:06
问题描述
core 了之后,OBServer 会立即关闭所有的 socket fd,但是这个时候 easy 线程还在继续执行,所以会报 Bad file descriptor 的错误信息,大概日志如下。
ERROR easy_connection_update_ack_bytes_and_time (easy_connection.c:2155) [121276][0][Y0-0000
000000000000-0-0] [lt=11] Failed to do TIOCOUTQ ioctl on connection(0.0.0.0_xxx.xxx.xxx.xxx:xxx_xxx_0xfffbd46102c0 tp=0 t
=1650605978022081-1650605978022284 s=0 r=0 io=268/235 sq=235), errno(9), strerror(Bad file descriptor). BACKTRACE:0xe85f9
87 0xe6f4efb 0xe6f4efb 0xe6dedd7 0xe6e0887 0xea08ddb 0xa57c5d7 0xa57c5d7
为什么要立即关闭所有的 fd?
一台 OBServer 在 core 的过程中,RPC 不能处理,也不能回包,其他发 RPC 的机器就感知不到,这些 RPC 就可能长时间 hang 住,占住工作线程,现象上会出现租户队列积压,集群长时间 QPS 跌零等。
遗留问题:二次 core
OBServer 发生第一次 core 并关闭了所有 fd 后,可能导致 easy 线程再次 core。这个问题的根因应该是 easy 代码中的 bug,目前还不清楚,也没有找到规避的办法。这种情况 coredump 记录的第一个线程是 easy 线程,并不是第一次触发 core 的线程,所以需要遍历所有线程栈,根据 ob_signal_handler 或 coredump_cb 这些关键字找到 core 的第一现场。
适用版本
OceanBase 数据库所有版本。