结合代码 src/rpc/obmysql/ob_sql_nio.cpp,可以知道,在 write data 的过程中,当 EAGAIN == errno || EWOULDBLOCK == errno 的时候,系统会每隔 1s(1000 * 1000), 打印日志 write cond wakeup。 其中 EAGAIN 表示 Try again,EWOULDBLOCK 表示 Operation would block。 当日志中持续打印 write cond wakeup,通常意味着 OBServer 尝试写回包,但是 socket 一直不可写(等待着客户端处理),因此每隔一秒钟都会重试,且打印输出日志 write cond wakeup。如果持续打印的时间比较久,那么需要关注这个问题。

从 print_session_info 可以找到这个 socket 的这个文件的(fd:794),然后通过 ls -alh /proc/pid/fd/ 可以查到对应的 Inode。 再通过执行 netstat -aen |grep Inode,定位到对应的 socket 连接的端口号,这时观察 socket 的 Send-Q 和 Recv-Q ,如果是 Send-Q 的 buff size 一直没有变化,就可以确认这个 socket 一直不可写。此时,通常需要进一步排查客户端和 OBServer 端是否存在网络问题。
适用版本
OceanBase 数据库 V3.x、V4.x 版本。