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)

    原文发表于http://www.cnblogs.com/reach296/

  • 相关阅读:
    Fix Installing .NET Framework 3.5 failed Error Code 0x800F0954 on Windows 10
    RHEL8安装五笔输入法
    Enable EPEL and Local Repository on RHEL8
    Why is Yum Replaced by DNF?
    检查Linux服务器是否被攻击的常用命令及方法
    IDEA 主题
    IDEA 如何显示一个类中所有的方法
    Appium 安装以及安装过程中遇到的问题
    Maven 如何发布 jar 包到 Nexus 私库
    java泛型的基本使用
  • 原文地址:https://www.cnblogs.com/clarke/p/5965756.html
Copyright © 2011-2022 走看看