博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务端socket开发之多线程和gevent框架并发测试[python语言]
阅读量:5823 次
发布时间:2019-06-18

本文共 8248 字,大约阅读时间需要 27 分钟。

测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,

有点属于自娱自乐,要是有问题之处,请大家喷之 !


每个连接都特意堵塞了0.5秒钟 !

在大批量tcp测试下,threading的开销越来越大,所以造成了在并发数加大的情况下,出现threading崩溃的情况 !  gevent是 libevent和协程的融合,一个线程里面都可以跑超多的协程! 利用libevent做io堵塞的调度 ,gevent体系下,同一时间只有一个任务在运行 !    


先来测试下多线程:   我们就不加线程池了

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
#!/usr/bin/env python
# -*- coding: utf-
8 
-*-
#xiaorui.cc
import 
sys
import 
socket
import 
time
import 
threading
#xiaorui.cc
def threads(port):
    
s = socket.socket()
    
s.bind((
'0.0.0.0'
, port))
    
s.listen(
500
)
    
while 
True:
        
cli, addr = s.accept()
        
t = threading.Thread(target=handle_request, args=(cli, time.sleep))
        
t.daemon = True
        
t.start()
def handle_request(s, sleep):
    
try
:
        
s.recv(
1024
)
        
sleep(
0.5
)                                                                                                           
        
s.send(
''
'http/
1.0 
200 
OK
                  
Hello World! 
''
')
        
s.shutdown(socket.SHUT_WR)
        
print 
'.'
,
    
except Exception, ex:
        
print ex
    
finally
:
        
sys.stdout.flush()
        
s.close()
if 
__name__ == 
'__main__'
:
    
threads(
4444
)

用threading跑socket,每个连接堵塞的时间是0.5

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
time ab -n 
10000 
-c 
500 
http:
//127.0.0.1:4444/
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 
127.0
.
0.1 
(be patient)
Completed 
1000 
requests
Completed 
2000 
requests
Completed 
3000 
requests
Completed 
4000 
requests
Completed 
5000 
requests
Completed 
6000 
requests
Completed 
7000 
requests
Completed 
8000 
requests
Completed 
9000 
requests
Completed 
10000 
requests
Finished 
10000 
requests
Server Software:
Server Hostname:        
127.0
.
0.1
Server Port:            
4444
Document Path:          /
Document Length:        
0 
bytes
Concurrency Level:      
500
Time taken 
for 
tests:   
11.123 
seconds
Complete requests:      
10000
Failed requests:        
0
Write errors:           
0
Total transferred:      
470000 
bytes
HTML transferred:       
0 
bytes
Requests per second:    
899.01 
[#/sec] (mean)
Time per request:       
556.166 
[ms] (mean)
Time per request:       
1.112 
[ms] (mean, across all concurrent requests)
Transfer rate:          
41.26 
[Kbytes/sec] received
Connection Times (ms)
              
min  mean[+/-sd] median   max
Connect:        
0   
33 
177.0      
0    
1000
Processing:   
500  
508  
33.9    
501    
1132
Waiting:      
500  
508  
33.9    
501    
1132
Total:        
500  
541 
201.8    
501    
2132
Percentage of the requests served within a certain time (ms)
  
50
%    
501
  
66
%    
501
  
75
%    
502
  
80
%    
505
  
90
%    
522
  
95
%    
532
  
98
%   
1534
  
99
%   
1722
 
100
%   
2132 
(longest request)
real    0m11.145s
user    0m0.210s
sys     0m0.961s

加到800的时候~

gevent:

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
#xiaorui.cc
import 
sys
import 
socket
import 
time
import 
gevent
from gevent 
import 
socket
def server(port):
    
s = socket.socket()
    
s.bind((
'0.0.0.0'
, port))
    
s.listen(
500
)
    
while 
True:
        
cli, addr = s.accept()
        
gevent.spawn(handle_request, cli, gevent.sleep)
def handle_request(s, sleep):
    
try
:
        
data=s.recv(
1024
)
        
sleep(
0.5
)
        
s.send(
''
'http/
1.0 
200 
OK
                  
Hello World! 
this 
is 
xiaorui.cc !!!
''
')
        
print data
        
request_string = 
"GET %s HTTP/1.1\r\nHost: %s\r\n\r\nServer: xiaorui.cc\n" 
%(
'index.html'
'127.0.0.1'
)             
        
s.send(request_string)
        
s.shutdown(socket.SHUT_WR)
        
print 
'.'
,‘be killed’
    
except Exception, ex:
        
print ex
    
finally
:
                                                                                                                                                                                                                                                                                                                                                                                   
        
s.close()
if 
__name__ == 
'__main__'
:
    
server(
7777
)


gevent跑socket服务:

并发数值是500的时候!

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
time ab -n 
10000 
-c 
500 
http:
//127.0.0.1:7777/
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 
127.0
.
0.1 
(be patient)
Completed 
1000 
requests
Completed 
2000 
requests
Completed 
3000 
requests
Completed 
4000 
requests
Completed 
5000 
requests
Completed 
6000 
requests
Completed 
7000 
requests
Completed 
8000 
requests
Completed 
9000 
requests
Completed 
10000 
requests
Finished 
10000 
requests
Server Software:
Server Hostname:        
127.0
.
0.1
Server Port:            
7777
Document Path:          /
Document Length:        
0 
bytes
Concurrency Level:      
500
Time taken 
for 
tests:   
11.312 
seconds
Complete requests:      
10000
Failed requests:        
0
Write errors:           
0
Total transferred:      
20000 
bytes
HTML transferred:       
0 
bytes
Requests per second:    
884.04 
[#/sec] (mean)
Time per request:       
565.584 
[ms] (mean)
Time per request:       
1.131 
[ms] (mean, across all concurrent requests)
Transfer rate:          
1.73 
[Kbytes/sec] received
Connection Times (ms)
              
min  mean[+/-sd] median   max
Connect:        
0   
44 
202.7      
0    
1001
Processing:   
500  
513  
10.1    
511     
707
Waiting:      
500  
513  
10.1    
511     
707
Total:        
500  
557 
204.1    
512    
1525
Percentage of the requests served within a certain time (ms)
  
50
%    
512
  
66
%    
515
  
75
%    
517
  
80
%    
519
  
90
%    
531
  
95
%    
552
  
98
%   
1521
  
99
%   
1523
 
100
%   
1525 
(longest request)
real    0m11.334s
user    0m0.159s
sys     0m0.730s

服务端看到的信息都是正常的!

并发是1000的时候:

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
time ab -n 
10000 
-c 
1000 
http:
//127.0.0.1:7777/
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 
127.0
.
0.1 
(be patient)
Completed 
1000 
requests
Completed 
2000 
requests
Completed 
3000 
requests
Completed 
4000 
requests
Completed 
5000 
requests
Completed 
6000 
requests
Completed 
7000 
requests
Completed 
8000 
requests
Completed 
9000 
requests
Completed 
10000 
requests
Finished 
10000 
requests
Server Software:
Server Hostname:        
127.0
.
0.1
Server Port:            
7777
Document Path:          /
Document Length:        
0 
bytes
Concurrency Level:      
1000
Time taken 
for 
tests:   
7.406 
seconds
Complete requests:      
10000
Failed requests:        
0
Write errors:           
0
Total transferred:      
20000 
bytes
HTML transferred:       
0 
bytes
Requests per second:    
1350.22 
[#/sec] (mean)
Time per request:       
740.623 
[ms] (mean)
Time per request:       
0.741 
[ms] (mean, across all concurrent requests)
Transfer rate:          
2.64 
[Kbytes/sec] received
Connection Times (ms)
              
min  mean[+/-sd] median   max
Connect:        
0  
175 
491.7      
0    
3000
Processing:   
500  
520  
17.7    
515     
707
Waiting:      
500  
520  
17.7    
515     
707
Total:        
500  
695 
492.5    
517    
3521
Percentage of the requests served within a certain time (ms)
  
50
%    
517
  
66
%    
523
  
75
%    
538
  
80
%    
569
  
90
%   
1515
  
95
%   
1530
  
98
%   
1539
  
99
%   
3514
 
100
%   
3521 
(longest request)
real    0m7.428s
user    0m0.208s
sys     0m0.741s

当并发到1500的时候:

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
time ab -n 
10000 
-c 
1500 
http:
//127.0.0.1:7777/
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 
127.0
.
0.1 
(be patient)
Completed 
1000 
requests
Completed 
2000 
requests
Completed 
3000 
requests
Completed 
4000 
requests
Completed 
5000 
requests
Completed 
6000 
requests
Completed 
7000 
requests
Completed 
8000 
requests
Completed 
9000 
requests
Completed 
10000 
requests
Finished 
10000 
requests
Server Software:
Server Hostname:        
127.0
.
0.1
Server Port:            
7777
Document Path:          /
Document Length:        
0 
bytes
Concurrency Level:      
1500
Time taken 
for 
tests:   
5.290 
seconds
Complete requests:      
10000
Failed requests:        
0
Write errors:           
0
Total transferred:      
20000 
bytes
HTML transferred:       
0 
bytes
Requests per second:    
1890.27 
[#/sec] (mean)
Time per request:       
793.536 
[ms] (mean)
Time per request:       
0.529 
[ms] (mean, across all concurrent requests)
Transfer rate:          
3.69 
[Kbytes/sec] received
Connection Times (ms)
              
min  mean[+/-sd] median   max
Connect:        
0  
214 
404.9      
1    
1003
Processing:   
500  
522  
23.0    
514     
716
Waiting:      
500  
522  
23.0    
514     
716
Total:        
500  
736 
406.7    
520    
1712
Percentage of the requests served within a certain time (ms)
  
50
%    
520
  
66
%    
558
  
75
%    
602
  
80
%   
1506
  
90
%   
1526
  
95
%   
1531
  
98
%   
1535
  
99
%   
1548
 
100
%   
1712 
(longest request)
real    0m5.313s
user    0m0.275s
sys     0m0.763s


出现了少量的报错:


gevent 可以加个队列,来限制协程的数目,但是数目限制了,虽然稳定了,但是并发数上不去。

1
2
from gevent.pool 
import 
Pool
pool = Pool(N)

这里测试有点简单,虽然已经安排了连接的堵塞,但是毕竟不符合业务。 有时间把后端的任务改成才mongodb取数据 !

 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1342536,如需转载请自行联系原作者

你可能感兴趣的文章
华为OJ 名字美丽度
查看>>
微信公众号与APP微信第三方登录账号打通
查看>>
onchange()事件的应用
查看>>
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
python 异常
查看>>
百度账号注销
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
BIEE Demo(RPD创建 + 分析 +仪表盘 )
查看>>
Cocos2dx 3.0开发环境的搭建--Eclipse建立在Android工程
查看>>
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
UIImagePickerController拍照与摄像
查看>>