免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 8155 | 回复: 30
打印 上一主题 下一主题

谁有空帮我用linux测试一下这段代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-22 13:50 |只看该作者 |倒序浏览
本帖最后由 redor 于 2011-07-23 23:23 编辑

用epoll_wait 然后accept, 发现accept速度奇慢。。。。 代码基本都检查了, 测试了好久 没发现问题所在 不过根据之前得经验可能是内存越界。。。。。。
有谁遇到过类似问题?
谁有空帮我测试一下这代码,我机器上用ab压总是超时, 我本地的机器上没问题, 可是放服务器上就出这鸟状况。
测试方法 :gcc -o sysepoll epoll.c && ./sysepoll 0 1980 65536 1
然后用ab 从本机或者任何其他机器上压力测试 ab -c5000 -n100000 http://127.0.0.1:1980/

  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <errno.h>
  7. #include <sys/types.h>
  8. #include <fcntl.h>
  9. #include <sys/stat.h>
  10. #include <sys/time.h>
  11. #include <sys/resource.h>
  12. #include <sys/socket.h>
  13. #include <sys/epoll.h>
  14. #include <netinet/in.h>
  15. #include <arpa/inet.h>
  16. #include <netdb.h>
  17. #define CONN_MAX 65536
  18. #define EV_BUF_SIZE 1024
  19. #define E_READ      0x01
  20. #define E_WRITE     0x02
  21. static int epollfd = 0;
  22. static int max_connections = 0;
  23. static int lfd = 0;
  24. static struct sockaddr_in sa = {0};       
  25. static socklen_t sa_len = sizeof(struct sockaddr_in);
  26. static int ev_sock_type = 0;
  27. static int ev_sock_list[] = {SOCK_STREAM, SOCK_DGRAM};
  28. static int ev_sock_count = 2;
  29. static in_addr_t multicast_addr = INADDR_NONE;
  30. typedef struct _CONN
  31. {
  32.     int fd;
  33.     int x;
  34.     int nout;
  35.     int n;
  36.     int keepalive;
  37.     char out[EV_BUF_SIZE];
  38.     char buffer[EV_BUF_SIZE];
  39. }CONN;
  40. static CONN *conns = NULL;
  41. static char *out_block = "daffffffffdsafhklsdfjlasfjl;adjfl;ajdsfl;ajdlf;jadl;fjl;sdmflsdmfl;asmfl;mdslfmadsl;fmad;lfmad;sffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm";
  42. static char out_data[EV_BUF_SIZE];
  43. static int out_data_len = 0;
  44. static char kout_data[EV_BUF_SIZE];
  45. static int kout_data_len = 0;
  46. /* set rlimit */
  47. int setrlimiter(char *name, int rlimit, int nset)
  48. {
  49.     int ret = -1;
  50.     struct rlimit rlim;
  51.     if(name)
  52.     {
  53.         if(getrlimit(rlimit, &rlim) == -1)
  54.             return -1;
  55.         else
  56.         {
  57.             fprintf(stdout, "getrlimit %s cur[%ld] max[%ld]\n",
  58.                     name, (long)rlim.rlim_cur, (long)rlim.rlim_max);
  59.         }
  60.         if(rlim.rlim_cur > nset && rlim.rlim_max > nset)
  61.             return 0;
  62.         rlim.rlim_cur = nset;
  63.         rlim.rlim_max = nset;
  64.         if((ret = setrlimit(rlimit, &rlim)) == 0)
  65.         {
  66.             fprintf(stdout, "setrlimit %s cur[%ld] max[%ld]\n",
  67.                     name, (long)rlim.rlim_cur, (long)rlim.rlim_max);
  68.             return 0;
  69.         }
  70.         else
  71.         {
  72.             fprintf(stderr, "setrlimit %s cur[%ld] max[%ld] failed, %s\n",
  73.                     name, (long)rlim.rlim_cur, (long)rlim.rlim_max, strerror(errno));
  74.         }
  75.     }
  76.     return ret;
  77. }

  78. void ev_handler(int fd, int ev_flags, void *arg)
  79. {
  80.     int rfd = 0, n = 0, out_len = 0;
  81.     struct         sockaddr_in rsa;
  82.     socklen_t rsa_len = sizeof(struct sockaddr_in);
  83.     struct epoll_event evp;
  84.     char *out = NULL;

  85.     if(fd == lfd )
  86.     {
  87.         if((ev_flags & E_READ))
  88.         {
  89.             while((rfd = accept(fd, (struct sockaddr *)&rsa, &rsa_len)) > 0)
  90.             {
  91.                 conns[rfd].fd = rfd;
  92.                 /* set FD NON-BLOCK */
  93.                 conns[rfd].n = 0;
  94.                 fcntl(rfd, F_SETFL, fcntl(rfd, F_GETFL, 0)|O_NONBLOCK);
  95.                 memset(&evp, 0, sizeof(struct epoll_event));
  96.                 evp.data.fd = rfd;
  97.                 evp.events = EPOLLIN;
  98.                 epoll_ctl(epollfd, EPOLL_CTL_ADD, evp.data.fd, &evp);
  99.             }
  100.             return ;
  101.         }
  102.     }
  103.     else
  104.     {
  105.         if(ev_flags & E_READ)
  106.         {

  107.             n = read(fd, conns[fd].buffer+conns[fd].n, EV_BUF_SIZE - conns[fd].n);
  108.             if(n > 0)
  109.             {
  110.                 conns[fd].n += n;
  111.                 conns[fd].buffer[conns[fd].n] = 0;
  112.                 if(strstr(conns[fd].buffer, "\r\n\r\n"))
  113.                 {
  114.                     if(strcasestr(conns[fd].buffer, "Keep-Alive")) conns[fd].keepalive = 1;
  115.                     conns[fd].x = 0;
  116.                     conns[fd].n = 0;
  117.                     memset(&evp, 0, sizeof(struct epoll_event));
  118.                     evp.data.fd = fd;
  119.                     evp.events = EPOLLOUT;
  120.                     epoll_ctl(epollfd, EPOLL_CTL_MOD, evp.data.fd, &evp);
  121.                 }
  122.             }               
  123.             else
  124.             {
  125.                 goto err;
  126.             }
  127.         }
  128.         if(ev_flags & E_WRITE)
  129.         {
  130.             if(conns[fd].keepalive){out = kout_data;out_len = kout_data_len;}
  131.             else {out = out_data; out_len = out_data_len;}
  132.             n = write(fd, out + conns[fd].x, out_len - conns[fd].x);
  133.             if(n > 0 )
  134.             {
  135.                 conns[fd].x += n;
  136.                 if(conns[fd].x < out_len) return ;
  137.                 if(conns[fd].x  == out_len)
  138.                 {
  139.                     conns[fd].x = 0;
  140.                     conns[fd].n = 0;
  141.                     if(conns[fd].keepalive == 0) goto err;
  142.                     conns[fd].keepalive = 0;
  143.                 }
  144.             }
  145.             else
  146.             {
  147.                 goto err;
  148.             }
  149.             memset(&evp, 0, sizeof(struct epoll_event));
  150.             evp.data.fd = fd;
  151.             evp.events = EPOLLIN;
  152.             epoll_ctl(epollfd, EPOLL_CTL_MOD, evp.data.fd, &evp);
  153.         }
  154.         return ;
  155. err:
  156.         {
  157.             memset(&evp, 0, sizeof(struct epoll_event));
  158.             evp.data.fd = fd;
  159.             epoll_ctl(epollfd, EPOLL_CTL_DEL, evp.data.fd, &evp);
  160.             memset(&(conns[fd]), 0, sizeof(CONN));
  161.             shutdown(fd, SHUT_RDWR);
  162.             close(fd);
  163.         }
  164.         return ;
  165.     }
  166. }

  167. int main(int argc, char **argv)
  168. {
  169.     int port = 0, connection_limit = 0, fd = 0, opt = 1, i = 0, nprocess = 0;
  170.     char *multicast_ip = NULL;

  171.     if(argc < 5)
  172.     {
  173.         fprintf(stderr, "Usage:%s sock_type(0/TCP|1/UDP) port "
  174.                 "connection_limit process_limit multicast_ip(only for UDP)\n", argv[0]);       
  175.         _exit(-1);
  176.     }       
  177.     ev_sock_type = atoi(argv[1]);
  178.     if(ev_sock_type < 0 || ev_sock_type > ev_sock_count)
  179.     {
  180.         fprintf(stderr, "sock_type must be 0/TCP OR 1/UDP\n");
  181.         _exit(-1);
  182.     }
  183.     port = atoi(argv[2]);
  184.     connection_limit = atoi(argv[3]);
  185.     nprocess = atoi(argv[4]);
  186.     if(argc > 5) multicast_ip = argv[5];
  187.     max_connections = (connection_limit > 0) ? connection_limit : CONN_MAX;
  188.     /* Set resource limit */
  189.     setrlimiter("RLIMIT_NOFILE", RLIMIT_NOFILE, CONN_MAX);       
  190.     out_data_len = sprintf(out_data, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\n\r\n%s", (int)strlen(out_block), out_block);
  191.     kout_data_len = sprintf(kout_data, "HTTP/1.0 200 OK\r\nConnection: Keep-Alive\r\nContent-Length: %d\r\n\r\n%s", (int)strlen(out_block), out_block);


  192.     /* Initialize global vars */
  193.     if((conns = (CONN *)calloc(CONN_MAX, sizeof(CONN))))
  194.     {
  195.         memset(&sa, 0, sizeof(struct sockaddr_in));       
  196.         sa.sin_family = AF_INET;
  197.         sa.sin_addr.s_addr = INADDR_ANY;
  198.         sa.sin_port = htons(port);
  199.         sa_len = sizeof(struct sockaddr_in );
  200.         /* Initialize inet */
  201.         lfd = socket(AF_INET, ev_sock_list[ev_sock_type], 0);
  202.         if(setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR,
  203.                     (char *)&opt, (socklen_t) sizeof(opt)) != 0
  204. #ifdef SO_REUSEPORT
  205.                 || setsockopt(lfd, SOL_SOCKET, SO_REUSEPORT,
  206.                     (char *)&opt, (socklen_t) sizeof(opt)) != 0
  207. #endif
  208.           )
  209.         {
  210.             fprintf(stderr, "setsockopt[SO_REUSEADDR] on fd[%d] failed, %s", fd, strerror(errno));
  211.             _exit(-1);
  212.         }
  213.         /* Bind */
  214.         if(bind(lfd, (struct sockaddr *)&sa, sa_len) != 0 )
  215.         {
  216.             //SHOW_LOG("Binding failed, %s", strerror(errno));
  217.             return -1;
  218.         }
  219.         /* set FD NON-BLOCK */
  220.         if(fcntl(lfd, F_SETFL, fcntl(lfd, F_GETFL, 0)|O_NONBLOCK) != 0 )
  221.         {
  222.             //SHOW_LOG("Setting NON-BLOCK failed, %s", strerror(errno));
  223.             return -1;
  224.         }
  225.         /* Listen */
  226.         if(ev_sock_list[ev_sock_type] == SOCK_STREAM)
  227.         {
  228.             if(listen(lfd, CONN_MAX) != 0 )
  229.             {
  230.                 //SHOW_LOG("Listening  failed, %s", strerror(errno));
  231.                 return -1;
  232.             }
  233.         }
  234.         /* set multicast */
  235.         if(ev_sock_list[ev_sock_type] == SOCK_DGRAM && multicast_ip)
  236.         {
  237.             struct ip_mreq mreq;
  238.             memset(&mreq, 0, sizeof(struct ip_mreq));
  239.             mreq.imr_multiaddr.s_addr = multicast_addr = inet_addr(multicast_ip);
  240.             mreq.imr_interface.s_addr = INADDR_ANY;
  241.             if(setsockopt(lfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char*)&mreq, sizeof(mreq)) != 0)
  242.             {
  243.                 //SHOW_LOG("Setsockopt(MULTICAST) failed, %s", strerror(errno));
  244.                 return -1;
  245.             }
  246.         }
  247.         //SHOW_LOG("Initialize evbase ");
  248.         struct epoll_event evp, events[CONN_MAX];
  249.         int flag = 0, n = 0;
  250.         if((epollfd = epoll_create(CONN_MAX)) > 0)
  251.         {
  252.             memset(&evp, 0, sizeof(struct epoll_event));
  253.             evp.data.fd = lfd;
  254.             evp.events = EPOLLIN|EPOLLET;
  255.             epoll_ctl(epollfd, EPOLL_CTL_ADD, lfd, &evp);
  256.             do
  257.             {
  258.                 n = epoll_wait(epollfd, events, CONN_MAX, -1);
  259.                 for(i = 0; i < n; i++)
  260.                 {
  261.                     flag = 0;
  262.                     if(events[i].events & (EPOLLERR|EPOLLHUP))
  263.                         flag = E_READ|E_WRITE;
  264.                     else
  265.                     {
  266.                         if(events[i].events & EPOLLIN) flag |= E_READ;
  267.                         if(events[i].events & EPOLLOUT) flag |= E_WRITE;
  268.                     }
  269.                     ev_handler(events[i].data.fd, flag, NULL);
  270.                 }
  271.             }while(1);
  272.             for(i = 0; i < CONN_MAX; i++)
  273.             {
  274.                 shutdown(conns[i].fd, SHUT_RDWR);
  275.                 close(conns[i].fd);
  276.             }
  277.         }
  278.         free(conns);
  279.     }
  280.     return 0;
  281. }
  282. //gcc -o sysepoll epoll.c && ./sysepoll 0 1980 65536 1
复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2011-07-22 14:05 |只看该作者
用epoll_wait 然后accept, 发现accept速度奇慢。。。。 代码基本都检查了, 测试了好久 没发现问题所在 不 ...
redor 发表于 2011-07-22 13:50


accept 不用epoll处理:
    http://bbs.chinaunix.net/thread-3568296-2-1.html

论坛徽章:
0
3 [报告]
发表于 2011-07-22 14:37 |只看该作者
不是我得意思是 epoll_wait响应很慢。。。。 最后导致accept很慢。。。。。 。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
4 [报告]
发表于 2011-07-22 16:26 |只看该作者
不是我得意思是 epoll_wait响应很慢。。。。 最后导致accept很慢。。。。。 。
redor 发表于 2011-07-22 14:37



    我测试epoll_wait响应不慢,微妙级以下。代码就是那个贴。

论坛徽章:
0
5 [报告]
发表于 2011-07-23 23:21 |只看该作者
谁有空帮我测试一下这代码,我机器上用ab压总是超时, 我本地的机器上没问题, 可是放服务器上就出这鸟状况。
测试方法 :gcc -o sysepoll epoll.c && ./sysepoll 0 1980 65536 1
然后用ab 从本机或者任何其他机器上压力测试 ab -c5000 -n100000 http://127.0.0.1:1980/

  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <errno.h>
  7. #include <sys/types.h>
  8. #include <fcntl.h>
  9. #include <sys/stat.h>
  10. #include <sys/time.h>
  11. #include <sys/resource.h>
  12. #include <sys/socket.h>
  13. #include <sys/epoll.h>
  14. #include <netinet/in.h>
  15. #include <arpa/inet.h>
  16. #include <netdb.h>
  17. #define CONN_MAX 65536
  18. #define EV_BUF_SIZE 1024
  19. #define E_READ      0x01
  20. #define E_WRITE     0x02
  21. static int epollfd = 0;
  22. static int max_connections = 0;
  23. static int lfd = 0;
  24. static struct sockaddr_in sa = {0};       
  25. static socklen_t sa_len = sizeof(struct sockaddr_in);
  26. static int ev_sock_type = 0;
  27. static int ev_sock_list[] = {SOCK_STREAM, SOCK_DGRAM};
  28. static int ev_sock_count = 2;
  29. static in_addr_t multicast_addr = INADDR_NONE;
  30. typedef struct _CONN
  31. {
  32.     int fd;
  33.     int x;
  34.     int nout;
  35.     int n;
  36.     int keepalive;
  37.     char out[EV_BUF_SIZE];
  38.     char buffer[EV_BUF_SIZE];
  39. }CONN;
  40. static CONN *conns = NULL;
  41. static char *out_block = "daffffffffdsafhklsdfjlasfjl;adjfl;ajdsfl;ajdlf;jadl;fjl;sdmflsdmfl;asmfl;mdslfmadsl;fmad;lfmad;sffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm";
  42. static char out_data[EV_BUF_SIZE];
  43. static int out_data_len = 0;
  44. static char kout_data[EV_BUF_SIZE];
  45. static int kout_data_len = 0;
  46. /* set rlimit */
  47. int setrlimiter(char *name, int rlimit, int nset)
  48. {
  49.     int ret = -1;
  50.     struct rlimit rlim;
  51.     if(name)
  52.     {
  53.         if(getrlimit(rlimit, &rlim) == -1)
  54.             return -1;
  55.         else
  56.         {
  57.             fprintf(stdout, "getrlimit %s cur[%ld] max[%ld]\n",
  58.                     name, (long)rlim.rlim_cur, (long)rlim.rlim_max);
  59.         }
  60.         if(rlim.rlim_cur > nset && rlim.rlim_max > nset)
  61.             return 0;
  62.         rlim.rlim_cur = nset;
  63.         rlim.rlim_max = nset;
  64.         if((ret = setrlimit(rlimit, &rlim)) == 0)
  65.         {
  66.             fprintf(stdout, "setrlimit %s cur[%ld] max[%ld]\n",
  67.                     name, (long)rlim.rlim_cur, (long)rlim.rlim_max);
  68.             return 0;
  69.         }
  70.         else
  71.         {
  72.             fprintf(stderr, "setrlimit %s cur[%ld] max[%ld] failed, %s\n",
  73.                     name, (long)rlim.rlim_cur, (long)rlim.rlim_max, strerror(errno));
  74.         }
  75.     }
  76.     return ret;
  77. }

  78. void ev_handler(int fd, int ev_flags, void *arg)
  79. {
  80.     int rfd = 0, n = 0, out_len = 0;
  81.     struct         sockaddr_in rsa;
  82.     socklen_t rsa_len = sizeof(struct sockaddr_in);
  83.     struct epoll_event evp;
  84.     char *out = NULL;

  85.     if(fd == lfd )
  86.     {
  87.         if((ev_flags & E_READ))
  88.         {
  89.             while((rfd = accept(fd, (struct sockaddr *)&rsa, &rsa_len)) > 0)
  90.             {
  91.                 conns[rfd].fd = rfd;
  92.                 /* set FD NON-BLOCK */
  93.                 conns[rfd].n = 0;
  94.                 fcntl(rfd, F_SETFL, fcntl(rfd, F_GETFL, 0)|O_NONBLOCK);
  95.                 memset(&evp, 0, sizeof(struct epoll_event));
  96.                 evp.data.fd = rfd;
  97.                 evp.events = EPOLLIN;
  98.                 epoll_ctl(epollfd, EPOLL_CTL_ADD, evp.data.fd, &evp);
  99.             }
  100.             return ;
  101.         }
  102.     }
  103.     else
  104.     {
  105.         if(ev_flags & E_READ)
  106.         {

  107.             n = read(fd, conns[fd].buffer+conns[fd].n, EV_BUF_SIZE - conns[fd].n);
  108.             if(n > 0)
  109.             {
  110.                 conns[fd].n += n;
  111.                 conns[fd].buffer[conns[fd].n] = 0;
  112.                 if(strstr(conns[fd].buffer, "\r\n\r\n"))
  113.                 {
  114.                     if(strcasestr(conns[fd].buffer, "Keep-Alive")) conns[fd].keepalive = 1;
  115.                     conns[fd].x = 0;
  116.                     conns[fd].n = 0;
  117.                     memset(&evp, 0, sizeof(struct epoll_event));
  118.                     evp.data.fd = fd;
  119.                     evp.events = EPOLLOUT;
  120.                     epoll_ctl(epollfd, EPOLL_CTL_MOD, evp.data.fd, &evp);
  121.                 }
  122.             }               
  123.             else
  124.             {
  125.                 goto err;
  126.             }
  127.         }
  128.         if(ev_flags & E_WRITE)
  129.         {
  130.             if(conns[fd].keepalive){out = kout_data;out_len = kout_data_len;}
  131.             else {out = out_data; out_len = out_data_len;}
  132.             n = write(fd, out + conns[fd].x, out_len - conns[fd].x);
  133.             if(n > 0 )
  134.             {
  135.                 conns[fd].x += n;
  136.                 if(conns[fd].x < out_len) return ;
  137.                 if(conns[fd].x  == out_len)
  138.                 {
  139.                     conns[fd].x = 0;
  140.                     conns[fd].n = 0;
  141.                     if(conns[fd].keepalive == 0) goto err;
  142.                     conns[fd].keepalive = 0;
  143.                 }
  144.             }
  145.             else
  146.             {
  147.                 goto err;
  148.             }
  149.             memset(&evp, 0, sizeof(struct epoll_event));
  150.             evp.data.fd = fd;
  151.             evp.events = EPOLLIN;
  152.             epoll_ctl(epollfd, EPOLL_CTL_MOD, evp.data.fd, &evp);
  153.         }
  154.         return ;
  155. err:
  156.         {
  157.             memset(&evp, 0, sizeof(struct epoll_event));
  158.             evp.data.fd = fd;
  159.             epoll_ctl(epollfd, EPOLL_CTL_DEL, evp.data.fd, &evp);
  160.             memset(&(conns[fd]), 0, sizeof(CONN));
  161.             shutdown(fd, SHUT_RDWR);
  162.             close(fd);
  163.         }
  164.         return ;
  165.     }
  166. }

  167. int main(int argc, char **argv)
  168. {
  169.     int port = 0, connection_limit = 0, fd = 0, opt = 1, i = 0, nprocess = 0;
  170.     char *multicast_ip = NULL;

  171.     if(argc < 5)
  172.     {
  173.         fprintf(stderr, "Usage:%s sock_type(0/TCP|1/UDP) port "
  174.                 "connection_limit process_limit multicast_ip(only for UDP)\n", argv[0]);       
  175.         _exit(-1);
  176.     }       
  177.     ev_sock_type = atoi(argv[1]);
  178.     if(ev_sock_type < 0 || ev_sock_type > ev_sock_count)
  179.     {
  180.         fprintf(stderr, "sock_type must be 0/TCP OR 1/UDP\n");
  181.         _exit(-1);
  182.     }
  183.     port = atoi(argv[2]);
  184.     connection_limit = atoi(argv[3]);
  185.     nprocess = atoi(argv[4]);
  186.     if(argc > 5) multicast_ip = argv[5];
  187.     max_connections = (connection_limit > 0) ? connection_limit : CONN_MAX;
  188.     /* Set resource limit */
  189.     setrlimiter("RLIMIT_NOFILE", RLIMIT_NOFILE, CONN_MAX);       
  190.     out_data_len = sprintf(out_data, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\n\r\n%s", (int)strlen(out_block), out_block);
  191.     kout_data_len = sprintf(kout_data, "HTTP/1.0 200 OK\r\nConnection: Keep-Alive\r\nContent-Length: %d\r\n\r\n%s", (int)strlen(out_block), out_block);


  192.     /* Initialize global vars */
  193.     if((conns = (CONN *)calloc(CONN_MAX, sizeof(CONN))))
  194.     {
  195.         memset(&sa, 0, sizeof(struct sockaddr_in));       
  196.         sa.sin_family = AF_INET;
  197.         sa.sin_addr.s_addr = INADDR_ANY;
  198.         sa.sin_port = htons(port);
  199.         sa_len = sizeof(struct sockaddr_in );
  200.         /* Initialize inet */
  201.         lfd = socket(AF_INET, ev_sock_list[ev_sock_type], 0);
  202.         if(setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR,
  203.                     (char *)&opt, (socklen_t) sizeof(opt)) != 0
  204. #ifdef SO_REUSEPORT
  205.                 || setsockopt(lfd, SOL_SOCKET, SO_REUSEPORT,
  206.                     (char *)&opt, (socklen_t) sizeof(opt)) != 0
  207. #endif
  208.           )
  209.         {
  210.             fprintf(stderr, "setsockopt[SO_REUSEADDR] on fd[%d] failed, %s", fd, strerror(errno));
  211.             _exit(-1);
  212.         }
  213.         /* Bind */
  214.         if(bind(lfd, (struct sockaddr *)&sa, sa_len) != 0 )
  215.         {
  216.             //SHOW_LOG("Binding failed, %s", strerror(errno));
  217.             return -1;
  218.         }
  219.         /* set FD NON-BLOCK */
  220.         if(fcntl(lfd, F_SETFL, fcntl(lfd, F_GETFL, 0)|O_NONBLOCK) != 0 )
  221.         {
  222.             //SHOW_LOG("Setting NON-BLOCK failed, %s", strerror(errno));
  223.             return -1;
  224.         }
  225.         /* Listen */
  226.         if(ev_sock_list[ev_sock_type] == SOCK_STREAM)
  227.         {
  228.             if(listen(lfd, CONN_MAX) != 0 )
  229.             {
  230.                 //SHOW_LOG("Listening  failed, %s", strerror(errno));
  231.                 return -1;
  232.             }
  233.         }
  234.         /* set multicast */
  235.         if(ev_sock_list[ev_sock_type] == SOCK_DGRAM && multicast_ip)
  236.         {
  237.             struct ip_mreq mreq;
  238.             memset(&mreq, 0, sizeof(struct ip_mreq));
  239.             mreq.imr_multiaddr.s_addr = multicast_addr = inet_addr(multicast_ip);
  240.             mreq.imr_interface.s_addr = INADDR_ANY;
  241.             if(setsockopt(lfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char*)&mreq, sizeof(mreq)) != 0)
  242.             {
  243.                 //SHOW_LOG("Setsockopt(MULTICAST) failed, %s", strerror(errno));
  244.                 return -1;
  245.             }
  246.         }
  247.         //SHOW_LOG("Initialize evbase ");
  248.         struct epoll_event evp, events[CONN_MAX];
  249.         int flag = 0, n = 0;
  250.         if((epollfd = epoll_create(CONN_MAX)) > 0)
  251.         {
  252.             memset(&evp, 0, sizeof(struct epoll_event));
  253.             evp.data.fd = lfd;
  254.             evp.events = EPOLLIN|EPOLLET;
  255.             epoll_ctl(epollfd, EPOLL_CTL_ADD, lfd, &evp);
  256.             do
  257.             {
  258.                 n = epoll_wait(epollfd, events, CONN_MAX, -1);
  259.                 for(i = 0; i < n; i++)
  260.                 {
  261.                     flag = 0;
  262.                     if(events[i].events & (EPOLLERR|EPOLLHUP))
  263.                         flag = E_READ|E_WRITE;
  264.                     else
  265.                     {
  266.                         if(events[i].events & EPOLLIN) flag |= E_READ;
  267.                         if(events[i].events & EPOLLOUT) flag |= E_WRITE;
  268.                     }
  269.                     ev_handler(events[i].data.fd, flag, NULL);
  270.                 }
  271.             }while(1);
  272.             for(i = 0; i < CONN_MAX; i++)
  273.             {
  274.                 shutdown(conns[i].fd, SHUT_RDWR);
  275.                 close(conns[i].fd);
  276.             }
  277.         }
  278.         free(conns);
  279.     }
  280.     return 0;
  281. }
  282. //gcc -o sysepoll epoll.c && ./sysepoll 0 1980 65536 1

复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2011-07-25 17:35 |只看该作者
谁有空帮我测试一下这代码,我机器上用ab压总是超时, 我本地的机器上没问题, 可是放服务器上就出这鸟状况 ...
redor 发表于 2011-07-23 23:21



    没有采用多线程!!!
就一个线程处理,都是排着队来,当然慢了。

论坛徽章:
0
7 [报告]
发表于 2011-07-25 17:42 |只看该作者
原因不在这里 好像。。。。 我有的机器上测试性能很好, 有的机器上测试很糟糕 我主要是找找为啥不行的原因。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2011-07-25 17:56 |只看该作者
原因不在这里 好像。。。。 我有的机器上测试性能很好, 有的机器上测试很糟糕 我主要是找找为啥不行的原因 ...
redor 发表于 2011-07-25 17:42



    客户端的压力测试程序呢?

论坛徽章:
0
9 [报告]
发表于 2011-07-27 10:59 |只看该作者
回复 8# yulihua49


    直接用ab来压力测试 最上面有ab的用法。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
10 [报告]
发表于 2011-07-27 11:17 |只看该作者
通过网络读写占用了时间,调用accept的机会少了。本机的时候读写快,体现不出来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP