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



   



推荐阅读
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
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社区 版权所有