2016-12-07 122 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

嗨;你的歡迎 –