大家好,我有一个问题,到目前为止,一直找不到原因,请大家多多指教。
以下是我用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 }
以下是我用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 }
对了,我发送的消息大部分长度都在64字节以内。
TCP协议栈消耗是比较大的,根本不适合处理这么高的速度。