我有一个tcp服务器,它使用libev作为事件循环;对于新接受的套接字 我设置:
ev_io_init(&conn->io, tcp_conn_on_event_cb, conn->fd, EV_READ | EV_WRITE);
当新连接出现时,我的服务器消耗整个CPU周期,我有100%的CPU使用率。我的程序一直调用回调 tcp_conn_on_event_cb ,并将revents设置为EV_WRITE
static void tcp_conn_on_event_cb(ev_loop_t *loop, ev_io *ev, int revents)
当我做
strace mybinary
我是这样的:
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
....
请问这个问题的解决方案吗?
答案 0 :(得分:4)
我找到了解决方案,对于那些对这个问题感兴趣的人:
接受新套接字时,请使用 EV_WRITE 调用ev_io_init ,仅使用EV_READ调用它。
ev_io_init(&conn->io, tcp_conn_on_event_cb, conn->fd, EV_READ);
回调中的,如果你要写一个数据(到套接字),你可以使用 ev_feed_fd_event
static void tcp_conn_on_event_cb(ev_loop_t *loop, ev_io *ev, int revents)
{
....
if (revents | EV_WRITE) {
/* write your data here */
}
if (data_is_ready()) {
ev_feed_fd_event(loop, conn->fd, EV_WRITE | revents);
return;
}
/* do other job */
}