背景我用apache的abtest在公司的兩臺(tái)虛擬機(jī)上面測(cè)試,發(fā)現(xiàn)用pymongo的速度最快,asyncmongo其次,最后才是motor庫(kù).囧機(jī)器配置server端ubuntu12.04Intel(R)Core(TM)2DuoCPUE7500@2.93GHz內(nèi)存500M基本的server配置全部打開?(比如maxsoconn設(shè)到很大)client端freebsd(機(jī)子在公司,暫時(shí)空缺=.=)測(cè)試工具abtest測(cè)試用例我這里只貼了asyncmongo的用例,其他兩個(gè)的代碼結(jié)構(gòu)類似,但跟其他業(yè)務(wù)結(jié)合得比較緊,所以就不貼了.大概的用例描述:客戶端發(fā)起一個(gè)json格式的post請(qǐng)求,tornado這邊根據(jù)player_id跟mongo要數(shù)據(jù),只是讀請(qǐng)求,不存在鎖的問題.刪了一些敏感的信息.#!/usr/bin/envpython#encoding:utf-8importasyncmongoimporttornado.webfromtornadoimportwebimporttornado.ioloopfromtornado.ioloopimportIOLoopfromtornado.httpserverimportHTTPServerclassRankHandler(tornado.web.RequestHandler):def__init__(self,application,request,**kwargs):super(RankHandler,self).__init__(application,request,**kwargs)self.set_header('Content-Type','application/json')@propertydefdb(self):returnself.application.db@tornado.web.asynchronousdefpost(self):r={}##decodemsgbodytry:d=tornado.escape.json_decode(self.request.body)exceptValueError,e:self.log.error('decodetrackdataerror.e=%s'%e)r['status_code']=500r['status_txt']='decodejsonerror'self.write(tornado.escape.json_encode(r))self.finish()returnevent=d.get('event')ifnotevent:self.log.error('trackargsmissingargevent.')r['status_code']=500r['status_txt']='missing_arg_event'self.write(tornado.escape.json_encode(r))self.finish()returnevent_data=d.get('data')ifevent_dataandnotisinstance(event_data,dict):self.log.error('trackargsbadargdata.')r['status_code']=500r['status_txt']='bad_arg_data'self.write(tornado.escape.json_encode(r))self.finish()returnif(event=="u_add"):passelif(event=="u_group"):passelif(event=="u_update"):passelif(event=="u_get_point"):self.db.ranking_list.find_one({"_id":event_data["player_id"]},callback=self._on_response)def_on_response(self,response,error):r={}iferror:raisetornado.web.HTTPError(500)result={"data":{"_id":response['_id'],"rank_point":response["rank_point"]}}r.update(result)ifnotr.get('status_code',None):r['status_code']=200r['status_txt']='OK'self.write(tornado.escape.json_encode(r))self.finish()returnclassApplication(web.Application):def__init__(self):""""""handlers=[(r"/api/xxx",RankHandler),]settings=dict(debug=True,autoescape=None,)super(Application,self).__init__(handlers,**settings)self.db=asyncmongo.Client(pool_id='mydb',host='0.0.0.0',port=27017,maxcached=10,maxconnections=20000,dbname='xxx')defmain():http_server=HTTPServer(Application(),xheaders=True)http_server.bind(8880,'127.0.0.1')http_server.start()IOLoop.instance().start()if__name__=="__main__":main()測(cè)試結(jié)果同步mongo庫(kù)?testgit:(master)?ab-n10000-c3000-pdata-get-user-rank_point.xml-T'application/json''http://192.168.0.201:8880/api/xxx'ThisisApacheBench,Version2.3Copyright1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/LicensedtoTheApacheSoftwareFoundation,http://www.apache.org/Benchmarking192.168.0.201(bepatient)Completed1000requestsCompleted2000requestsCompleted3000requestsCompleted4000requestsCompleted5000requestsCompleted6000requestsCompleted7000requestsCompleted8000requestsCompleted9000requestsCompleted10000requestsFinished10000requestsServerSoftware:TornadoServer/3.1.1ServerHostname:192.168.0.201ServerPort:8880DocumentPath:/api/xxxDocumentLength:80bytesConcurrencyLevel:3000Timetakenfortests:23.551secondsCompleterequests:10000Failedrequests:0Writeerrors:0Totaltransferred:2170000bytesTotalbodysent:1990000HTMLtransferred:800000bytesRequestspersecond:424.61[#/sec](mean)Timeperrequest:7065.317[ms](mean)Timeperrequest:2.355[ms](mean,acrossallconcurrentrequests)Transferrate:89.98[Kbytes/sec]received82.52kb/ssent172.50kb/stotalConnectionTimes(ms)minmean[+/-sd]medianmaxConnect:118062222.9106110825Processing:26511302042.653920975Waiting:25510402018.951520972Total:28229362824.0293020976Percentageoftherequestsservedwithinacertaintime(ms)50%293066%340275%352680%359290%667095%682398%996199%15001100%20976(longestrequest)異步mongo庫(kù)(q2_rank)?testgit:(master)?ab-n10000-c3000-pdata-get-user-rank_point.xml-T'application/json''http://192.168.0.201:8880/api/xxx'ThisisApacheBench,Version2.3Copyright1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/LicensedtoTheApacheSoftwareFoundation,http://www.apache.org/Benchmarking192.168.0.201(bepatient)Completed1000requestsCompleted2000requestsCompleted3000requestsCompleted4000requestsCompleted5000requestsCompleted6000requestsCompleted7000requestsCompleted8000requestsCompleted9000requestsCompleted10000requestsFinished10000requestsServerSoftware:TornadoServer/3.1.1ServerHostname:192.168.0.201ServerPort:8880DocumentPath:/api/xxxDocumentLength:80bytesConcurrencyLevel:3000Timetakenfortests:24.629secondsCompleterequests:10000Failedrequests:0Writeerrors:0Totaltransferred:2170000bytesTotalbodysent:1990000HTMLtransferred:800000bytesRequestspersecond:406.02[#/sec](mean)Timeperrequest:7388.749[ms](mean)Timeperrequest:2.463[ms](mean,acrossallconcurrentrequests)Transferrate:86.04[Kbytes/sec]received78.90kb/ssent164.95kb/stotalConnectionTimes(ms)minmean[+/-sd]medianmaxConnect:0412794.5176205Processing:102462861793.2708810475Waiting:83662561843.9708310468Total:103266981894.1719914014Percentageoftherequestsservedwithinacertaintime(ms)50%719966%770075%782580%787590%824495%916198%1036699%10763100%14014(longestrequest)98%6677結(jié)果分析理論上來說,異步的mongo應(yīng)該可以處理更多的併發(fā)連接,但實(shí)際測(cè)試來看,併發(fā)連接數(shù)相差不大.我想到的原因:-測(cè)試機(jī)子太挫-測(cè)試的數(shù)據(jù)量不夠大,如果增大返回的數(shù)據(jù)大小,或者延長(zhǎng)查詢的時(shí)間,這樣理論上motor性能會(huì)更好看點(diǎn)-我查看了mongod的日志,發(fā)現(xiàn)異步的驅(qū)動(dòng),每次都會(huì)跟mongo新生成一個(gè)連接,頻繁的連接建立與刪除,造成了性能上的損耗?而pymongo則從頭到尾都是一個(gè)連接.最后有沒童鞋做過這方面的性能測(cè)試呢,可否把測(cè)試結(jié)果分享下=.=?然后,大家能否推薦下一些比較好的結(jié)合方式?比如我在知乎上面看到過有人問類似的問題.
tornado的mongo驅(qū)動(dòng)選擇,pymongo,motor,asyncmongo還是其他?
炎炎設(shè)計(jì)
2019-04-09 20:23:54