热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么使用了select之后,能支持并发不升反降呢?

相比之前这个最简单的版本http://segmentfault.com/q/1010000003986172我在本地压测结果

相比之前这个最简单的版本 http://segmentfault.com/q/1010000003986172
我在本地压测结果



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# ab -n30000 -c3000 http://127.0.0.1:8031/

 

Server Software:        mengkang

Server Hostname:        127.0.0.1

Server Port:            8031

 

Document Path:          /

Document Length:        12 bytes

 

Concurrency Level:      3000

Time taken for tests:   1.635 seconds

Complete requests:      30000

Failed requests:        0

Write errors:           0

Total transferred:      2792697 bytes

HTML transferred:       360348 bytes

Requests per second:    18349.03 [#/sec] (mean)

Time per request:       163.496 [ms] (mean)

然后使用

1
select

的方式,为什么完全不具备并发能力了呢。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#define SERV_PORT         8031

#define MAXDATASIZE       1024

#define FD_SET_SIZE        128





 

int main(void)

{

    int fd_ready_num;               // select返回的准备好的描述符个数    

    int listenfd, connectfd, maxfd, scokfd;  

    struct sockaddr_in serv_addr;

    fd_set read_set, allset;



    int client[FD_SETSIZE];

    int i;

    int maxi = -1;

   

    int sin_size;               //地址信息结构体大小

   

    char recvbuf[MAXDATASIZE];

    int len;





    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)  

    {                          

        perror("套接字描述符创建失败");  

        exit(1);  

    }



    printf("listenfd :%d\n", listenfd);



    int opt = 1;

    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

   

    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;

    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    serv_addr.sin_port = htons(SERV_PORT);

     

    if(bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)

    {

        perror("绑定失败");

        exit(1);

    }

     

    if(listen(listenfd, FD_SET_SIZE) == -1)

    {

        perror("监听失败");

        exit(1);

    }



    maxfd = listenfd + 1;



    for (i = 0; i
    {

        client[i] = -1;

    }



    FD_ZERO(&allset);

    FD_SET(listenfd,&allset);

 

    while(1){

        struct sockaddr_in addr;  

        read_set = allset;

        fd_ready_num = select(maxfd, &read_set, NULL, NULL, NULL);

        // printf("有 %d 个文件描述符准备好了\n", fd_ready_num);



        if (FD_ISSET(listenfd,&read_set))

        {

            sin_size = sizeof(addr);

            if ((cOnnectfd= accept(listenfd, (struct sockaddr *)&addr, &sin_size)) == -1)

            {

                perror("接收错误\n");

                continue;

            }



            for (i = 0; i
            {

                if (client[i] <0)

                {

                    client[i] = connectfd;

                    printf("接收client[%d]一个请求来自于: %s:%d\n", i, inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));  

                    break;

                }

            }



            if (i == FD_SETSIZE)

            {

                printf("连接数过多\n");

            }



            FD_SET(connectfd,&allset);



            maxfd = (connectfd > maxfd) ? (connectfd + 1) : maxfd;

            maxi  = (i > maxi) ? i : maxi;



            if (--fd_ready_num <= 0)

            {

                continue;

            }

        }



        for (i = 0; i
        {

            if ((scokfd = client[i]) <0)

            {

                continue;

            }



            if (FD_ISSET(scokfd,&read_set))

            {

                if((len = recv(scokfd,recvbuf,MAXDATASIZE,0)) == 0)

                {

                    close(scokfd);

                    printf("clinet[%d] 连接关闭\n", i);

                    FD_CLR(scokfd, &read_set);

                    client[i] = -1;

                }

                else

                {

                    char web_result[] = "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\nContent-Length: 11\r\nServer: mengkang\r\n\r\nhello world";

                    write(scokfd,web_result,sizeof(web_result));

                }



                if (--fd_ready_num <= 0)

                {

                    break;

                }

            }

        }

    }

 

    close(listenfd);

     

    return 0;

}

访问能正常访问,但是不知道为什么用ab压测结果就很差了

1
2
3
4
5
6
[zhoumengkang@localhost ~]$ ab -n100 -c10 http://localhost:8031/

This is ApacheBench, Version 2.3 <$Revision: 655654 $>

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/



Benchmarking localhost (be patient)...apr_poll: The timeout specified has expired (70007)



   



推荐阅读
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍如何通过更改软件源来提前体验Ubuntu 8.10,包括详细的配置步骤和相关注意事项。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
author-avatar
手机用户2502858281
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有