使用libev时CPU使用率达到100%

3

我有一个使用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

i've this:

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
                           ....

有没有解决这个问题的方案?
1个回答

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 */
}

1
谢谢。这对我很有帮助。我之前遇到了定时器导致CPU占用率过高的问题。但是这个解决了我的问题。我之前为新套接字设置了EV_READ和EV_WRITE两个事件。 - sunil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接