大家好,我有一个问题,到目前为止,一直找不到原因,请大家多多指教。
以下是我用libevent编写的UDP(非阻塞)一个接收端程序,只接收发送端发来的数据,不作其它处理。
我用写的发送端程序每秒向接收端发送10000个消息时(消息长度不超过1024),接收端CPU会达到15%左右。libevent的底层
实现是用epool实现的,所以不太明白,这个cpu为什么会占用这么高?怎么样降低cpu百分比,请指教.
  
  1 #include <stdio.h>
  2 #include <stdint.h>
  3 #include <string.h>
  4 #include <fcntl.h>
  5 #include "net.h"
  6 #include <sys/socket.h>
  7 #include <netinet/in.h>
  8 #include <arpa/inet.h>
  9 
 10 
 11 int udp_sock;
 12 uint16_t port = 1512;
 13 struct event udp_ev;
 14 struct event_base *main_base = NULL;
 15 int cnt = 0;
 16 
 17 char write_buf_[2][1024*10][1000];
 18 int pkt_len_[2][1024*10];
 19 int wlen_[2] = {0,0};
 20 uint32_t old_jpg_id_ = 0,cur_jpg_id_ = 0;
 21 int wrt_index_ = 1,cur_index_ = 0;
 22 
 23 void udp_recv(int fd,short event,void *arg){
 24     struct sockaddr_in client;
 25     size_t len = sizeof(client);
 26     char buf[2048];
 27     int ret = 0;
 28     ret = recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr *)&client,&len);
 29     printf("count = %d\n",cnt++);
 30     //process_msg(buf,ret);
 31 }
 32 
 33 int new_socket(int family,int socktype,int protocol){
 34     int sfd;
 35     int flags;
 36     if((sfd = socket(family,socktype,protocol)) ==  -1){
 37         return -1;
 38     }
 39     return sfd;
 40 }
 41 
 42 int net_init(){
 43     main_base = event_init();
 44     udp_sock = new_socket(AF_INET,SOCK_DGRAM,0);
 45     if(udp_sock == -1){
 46         return -1;
 47     }
 48     struct sockaddr_in addr;
 49     memset(&addr,0,sizeof(addr));
 50     addr.sin_family = AF_INET;
 51     addr.sin_port = htons(port);
 52     addr.sin_addr.s_addr = inet_addr("0.0.0.0");
 53     while(bind(udp_sock,(const struct sockaddr *)&addr,sizeof(addr)) != 0){
 54         ++port;
 55         addr.sin_port = htons(port);
 56     }
 57     event_set(&udp_ev,udp_sock,EV_READ | EV_PERSIST,udp_recv,NULL);
 58     if(main_base != NULL){
 59         event_base_set(main_base,&udp_ev);
 60     }
 61     event_add(&udp_ev,NULL);
 62     event_base_dispatch(main_base);
 63     event_base_free(main_base);
 64     return 0;
 65 }
 66 
 67 int main(){
 68     net_init();
 69     //write_file(1000,"1111",4);
 70     return 0;
 71 }