问题描述:libevent 接收到客户端连接后,evutil_make_socket_noblocking(sock_fd); struct event *ev = event_new(base, sock_fd, EV_READ|EV_PERSIST, read_cb, NULL); event_add(ev, NULL); 之后偶现某个套接字接收到数据后,一直缓存在系统底层,netstat 能看到很多数据待接收,抓包也是正常的,就是read_cb一次也没被回调到。
环境:双千兆网卡聚合标准服务器,k8s 使用主机网络模式的pod。
问题解决:网上查询无果(好心人查到希望能留言),之后在event_add中设置超时,struct timeval tv(1,0); event_add(ev, &tv); 这样即使没有收到系统读信号触发回调函数,1秒后也有超时信号触发,出现异常时成了定时器读了,可以检测event&EV_TIMEOUT确认是超时回调的。没有根治,怀疑是系统层软中断的原因,但也只是怀疑。