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



   



推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
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社区 版权所有