python 對mongodb進行壓力測試


最近對mongoDB數據庫進行性能分析,需要對數據庫進行加壓。

加壓時,最初采用threading模塊寫了個多線程程序,測試的效果不理想。

單機讀數據庫每秒請求數只能達到1000次/s.而開發的java程序請求數能達到6000-7000次/s。

證明受限於GIL,python的多線程表現確實不理想。

后來,采用了multiprocessing模塊,采用多進程的方式進行加壓。

經過測試證明,multiprocessing的性能還是不錯,和開發java程序的性能相當。

腳本如下:

#!/usr/bin/env python

from pymongo import Connection,MongoClient,MongoReplicaSetClient
import multiprocessing
import time


#connection = MongoClient('mongodb://10.120.11.212:27017/')
#connection = Connection(['10.120.11.122','10.120.11.221','10.120.11.212'], 27017)
'''數據庫采用了讀寫分離設置,連接mongoDB的模式要配對'''
connection=MongoReplicaSetClient(
        '10.120.11.122:27017,10.120.11.221:27017,10.120.11.212:27017',
        replicaSet='rs0',
        read_preference=3
#        read_preference=3
        )
db = connection['cms']
db.authenticate('cms', 'cms')

#計時器
def func_time(func):
        def _wrapper(*args,**kwargs):
                start = time.time()
                func(*args,**kwargs)
                print func.__name__,'run:',time.time()-start
        return _wrapper
#插入測試方法
def insert(num):
        posts = db.userinfo
        for x in range(num):
                post = {"_id" : str(x),
                        "author": str(x),
                        "text": "My first blog post!"
                        }
             posts.insert(post)
#查詢測試方法
def query(num):
    get=db.device
    for i in xrange(num):
         get.find_one({"scanid":"010000138101010000009aaaaa"})


@func_time
def main(process_num,num):
    pool = multiprocessing.Pool(processes=process_num)
    for i in xrange(num):
        pool.apply_async(query, (num, ))
    pool.close()
    pool.join()
    print "Sub-process(es) done."

if __name__ == "__main__":
#    query(500,1)
        main(800,500)

原文發表於http://www.cnblogs.com/reach296/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM