2016-12-07 9 views
3

libev를 이벤트 루프로 사용하는 tcp 서버가 있습니다. 새 허용 소켓 을 위해 내가 설정 :libev에서 100 % CPU 사용량

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

을 새 연결이 오는 경우는, 내 서버 내가 100 %의 CPU 사용률이의 CPU 사이클을 전체 소비한다.

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이 : 내 프로그램은 내가이 한

strace mybinary 

을 EV_WRITE

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

로 설정 revents와 tcp_conn_on_event_cb 콜백 모든 시간을 호출 이 문제는 제발?

답변

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

감사를 사용할 수 있습니다. 이것은 나를 도왔다. 나는 높은 CPU를 일으키는 타이머 뒤에 있었다. 그러나 이것은 나의 문제를 해결했다. 새 소켓에 대해 EV_READ와 EV_WRITE를 모두 설정했습니다. – sunil

+0

안녕하세요; 괜찮습니다 –