测试下多线程和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,如需转载请自行联系原作者