热门标签 | 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)



   



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
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社区 版权所有