2016-12-07 151 views
3

我有一个使用libev作为事件循环的tcp服务器;新接受的套接字 我设置:使用libev的100%CPU使用率

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

当一个新的连接正在添加,我的服务器消耗整个CPU周期,我有100%的CPU使用率。我的程序调用所有的时间回调tcp_conn_on_event_cb设置为EV_WRITE

static void tcp_conn_on_event_cb(ev_loop_t *loop, ev_io *ev, int revents) 

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

有FO的解决方案请问这个问题?

回答

4

我已经找到了解决办法,对于那些谁在这个问题感兴趣:

接受一个新的socket时

,不要呼叫ev_io_initEV_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 */ 
} 
+0

感谢。这帮助了我。我支持计时器造成高CPU。但是这解决了我的问题。我为新套接字设置了EV_READ和EV_WRITE。 – sunil

+0

嗨;你的欢迎 –