zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    $.extend用法详解(一)
    JQuery中$.each 和$(selector).each()的区别详解
    span元素和div元素的浮动效果
    $.ajax中contentType: “application/json” 的用法
    JS中获取URL的参数的方法
    移动端的touch事件(一)
    JS运算的优先级
    关于更新发布CSS和JS文件的缓存问题
    small标签
    DP:三角形的最小路径和
  • 原文地址:https://www.cnblogs.com/reach296/p/3914900.html
Copyright © 2011-2022 走看看