频道栏目
首页 > 程序开发 > Web开发 > Python > 正文
用python做测试--实现高性能测试工具(3)
2013-12-26 11:37:11         来源:无法落地的技术、理论就是耍流氓--赢在实践  
收藏   我要投稿


方案3: 改变系统架构

在开始多进程之前,先简单说明一下python GIL, 之前自己对他也有些误解。因为python GIL的机制存在,同时运行的线程只有一个,但这个线程在不同时刻可以运行在不同的核上,这个调度是由操作系统完成的,如果你写个死循环,开的线程足够多,是可以把整个系统的CPU消耗干净的,此时你在Linux下通过top可以看到,us 占用的CPU不大,但sy占用的CPU会很大,CPU主要消耗在系统调度上了。下面是测试代码,大家可以试试。

 

import threading

class MultipleThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        while 1:
            print here


for i in xrange(100):
    multiple_thread=MultipleThread()
    multiple_thread.start()

multiple_thread.join()

 

既然因为GIL的存在,同时只能运行一个线程,那多线程可以提高效率,当然可以!开个3-4个线程可以明显的提高性能,大概能提高个2-3倍左右吧,但继续增加线程就是副作用了。


系统多线程的系统架构:

 

发送和接受都不存在瓶颈,主要瓶颈在在红线部分,decode和 encode部分。多线程改成多进程比较简单,工作量不大,只要把需要多进程共享的信息,由Queue改成multiprocessing.Queue()就可以了,把继承的DiameterMsgParser(threading.Thread)改成DiameterMsgParser(multiprocessing.Process),有个比较麻烦的是log的输出,python自带的logging模块在多进程下写同一个文件会引起混乱。这个在后面单独说明。

import multiprocessing
import logging

class Worker(multiprocessing.Process):
    def __init__(self,mp_name,input_queue):
        multiprocessing.Process.__init__(self,name=mp_name)
        self.input_queue=input_queue

    def run(self):
        for i in xrange(100):
            self.input_queue.put_nowait(i)
            logging.debug(test +str(i))

 

多线程改成多进程后,在sunfire 4170 (16 core , 2.4G ) 上能支持到5000 meesages (双向), CPU占有率 30-40%,用的是标准的python2.7,因为在solaris上没安装成功pypy,所以在此机器上,我没有测试pypy对性能影响多大。但我在一个2核的linux机器上测试python和 pypy,在多进程的情况下的效率,pypy对效率的提升没有达到倍数的级别,没找到什么原因, 后面有CPU核数比较多的机器再测试下。

点击复制链接 与好友分享!回本站首页
相关TAG标签 测试工具 高性能
上一篇:Python群发邮件
下一篇:用python做测试--实现高性能测试工具(1)
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站