2016-12-07 1 views
3

Ich habe einen TCP-Server, der Libev als Ereignisschleife verwendet; für neue akzeptierte Steckdosen i gesetzt:100% CPU-Auslastung mit libev

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

wenn eine neue Verbindung steht vor der Tür, verbraucht mein Server die CPU-Zyklen insgesamt i 100% CPU-Auslastung haben. mein Programm ruft die ganze Zeit der Rückruf tcp_conn_on_event_cb mit revents gesetzt als EV_WRITE

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

wenn ich

strace mybinary 

machen ich habe dies:

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

gibt es eine Lösung fo Dieses Problem bitte?

Antwort

4

ich eine Lösung gefunden haben, für diejenigen, die in dieser Frage interessiert sind:

wenn eine neue Fassung zu akzeptieren, nicht Anruf ev_io_init mit EV_WRITE, nennen Sie es nur mit EV_READ.

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

im Rückruf, wenn Sie ein Datum zu schreiben (in den Buchse) haben, können Sie 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

Dank verwenden. Das hat mir geholfen. Ich war hinter Timern, die hohe CPU verursachen. Aber das hat mein Problem gelöst. Ich habe sowohl EV_READ als auch EV_WRITE für den neuen Socket eingestellt. – sunil

+0

Hallo; Sie sind willkommen –