服务端socket开发之多线程和gevent框架并发测试[python语言]

时间:2022-02-10 22:24:47

请多关注下我的个人博客,blog.xiaorui.cc


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

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


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

服务端socket开发之多线程和gevent框架并发测试[python语言]


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



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

#!/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

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 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requestsServer Software:Server Hostname:        127.0.0.1Server Port:            4444Document Path:          /Document Length:        0 bytesConcurrency Level:      500Time taken for tests:   11.123 secondsComplete requests:      10000Failed requests:        0Write errors:           0Total transferred:      470000 bytesHTML transferred:       0 bytesRequests 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] receivedConnection Times (ms)              min  mean[+/-sd] median   maxConnect:        0   33 177.0      0    1000Processing:   500  508  33.9    501    1132Waiting:      500  508  33.9    501    1132Total:        500  541 201.8    501    2132Percentage 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.145suser    0m0.210ssys     0m0.961s



服务端socket开发之多线程和gevent框架并发测试[python语言]

加到800的时候~

服务端socket开发之多线程和gevent框架并发测试[python语言]


gevent:

#xiaorui.ccimport sysimport socketimport timeimport geventfrom gevent import socketdef 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的时候!


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 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requestsServer Software:Server Hostname:        127.0.0.1Server Port:            7777Document Path:          /Document Length:        0 bytesConcurrency Level:      500Time taken for tests:   11.312 secondsComplete requests:      10000Failed requests:        0Write errors:           0Total transferred:      20000 bytesHTML transferred:       0 bytesRequests 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] receivedConnection Times (ms)              min  mean[+/-sd] median   maxConnect:        0   44 202.7      0    1001Processing:   500  513  10.1    511     707Waiting:      500  513  10.1    511     707Total:        500  557 204.1    512    1525Percentage 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.334suser    0m0.159ssys     0m0.730s

服务端socket开发之多线程和gevent框架并发测试[python语言]

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


服务端socket开发之多线程和gevent框架并发测试[python语言]


并发是1000的时候:

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 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requestsServer Software:Server Hostname:        127.0.0.1Server Port:            7777Document Path:          /Document Length:        0 bytesConcurrency Level:      1000Time taken for tests:   7.406 secondsComplete requests:      10000Failed requests:        0Write errors:           0Total transferred:      20000 bytesHTML transferred:       0 bytesRequests 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] receivedConnection Times (ms)              min  mean[+/-sd] median   maxConnect:        0  175 491.7      0    3000Processing:   500  520  17.7    515     707Waiting:      500  520  17.7    515     707Total:        500  695 492.5    517    3521Percentage 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.428suser    0m0.208ssys     0m0.741s


当并发到1500的时候:

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 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requestsServer Software:Server Hostname:        127.0.0.1Server Port:            7777Document Path:          /Document Length:        0 bytesConcurrency Level:      1500Time taken for tests:   5.290 secondsComplete requests:      10000Failed requests:        0Write errors:           0Total transferred:      20000 bytesHTML transferred:       0 bytesRequests 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] receivedConnection Times (ms)              min  mean[+/-sd] median   maxConnect:        0  214 404.9      1    1003Processing:   500  522  23.0    514     716Waiting:      500  522  23.0    514     716Total:        500  736 406.7    520    1712Percentage 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.313suser    0m0.275ssys     0m0.763s



出现了少量的报错:

服务端socket开发之多线程和gevent框架并发测试[python语言]


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

from gevent.pool import Poolpool = Pool(N)




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


本文出自 “峰云,就她了。” 博客,谢绝转载!