C语言 100% CPU usage with libev



我有一个将libev用作事件循环的TCP服务器;对于新的接受插座我设置:

 ev_io_init(&conn->io, tcp_conn_on_event_cb, conn->fd, EV_READ | EV_WRITE);

当新连接开始时,我的服务器会全部消耗CPU周期,我的CPU使用率为100%。我的程序一直呼叫回调 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
                           ....

请问这个问题是否有解决方案?

我找到了一个解决方案,对于那些对这个问题感兴趣的人:

接受新套接字时,请勿 call ev_io_init 使用 ev_write ,仅使用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 */
}

最新更新