用python做自动化测试--实现高性能测试工具(3)-- 优化系统架构
2013-12-25 22:32
603 查看
在上一篇(http://blog.csdn.net/powerccna/article/details/17524951)中对代码进行了优化,离需求进了一步,但还是很大距离,代码进一步优化我也不知道怎么办了,不会高深的算法。只能从改进系统架构考虑。
方案3: 改变系统架构
在开始多进程之前,先简单说明一下python GIL, 之前自己对他也有些误解。因为python GIL的机制存在,同时运行的线程只有一个,但这个线程在不同时刻可以运行在不同的核上,这个调度是由操作系统完成的,如果你写个死循环,开的线程足够多,是可以把整个系统的CPU消耗干净的,此时你在Linux下通过top可以看到,us 占用的CPU不大,但sy占用的CPU会很大,CPU主要消耗在系统调度上了。下面是测试代码,大家可以试试。
既然因为GIL的存在,同时只能运行一个线程,那多线程可以提高效率,当然可以!开个3-4个线程可以明显的提高性能,大概能提高个2-3倍左右吧,但继续增加线程就是副作用了。
系统多线程的系统架构:
发送和接受都不存在瓶颈,主要瓶颈在在红线部分,decode和 encode部分。多线程改成多进程比较简单,工作量不大,只要把需要多进程共享的信息,由Queue改成multiprocessing.Queue()就可以了,把继承的DiameterMsgParser(threading.Thread)改成DiameterMsgParser(multiprocessing.Process),有个比较麻烦的是log的输出,python自带的logging模块在多进程下写同一个文件会引起混乱。这个在后面单独说明。
多线程改成多进程后,在sunfire 4170 (16 core , 2.4G ) 上能支持到5000 meesages (双向), CPU占有率 30-40%,用的是标准的python2.7,因为在solaris上没安装成功pypy,所以在此机器上,我没有测试pypy对性能影响多大。但我在一个2核的linux机器上测试python和 pypy,在多进程的情况下的效率,pypy对效率的提升没有达到倍数的级别,没找到什么原因, 后面有CPU核数比较多的机器再测试下。
方案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核数比较多的机器再测试下。
相关文章推荐
- 用python做自动化测试--实现高性能测试工具(4) --系统架构
- 用python做自动化测试--实现高性能测试工具(2)--优化代码
- 用python做自动化测试--实现高性能测试工具(5) --多进程写log
- 用python做自动化测试--实现高性能测试工具(1)--序
- Android自动化测试从入门到精通(Robotium自动化测试工具、架构设计、云测试应用)
- 测试效率优化案例----多国语言自动化校验工具(python)
- 高性能网站性能优化与系统架构
- 自动化工具 C/S 架构系统自动化测试入门 ---AutoIT
- Python实现的测试用例管理工具
- 高性能网站性能优化与系统架构(ZT)
- 【Python】实现性能测试工具方法
- 自动化工具 C/S 架构系统自动化测试入门 ---AutoIT
- 【Python】基于kNN算法的手写识别系统的实现与分类器测试
- Linux 各个子系统以及监控、测试、优化这些子系统所用到的工具
- 应用基础架构虚拟化实现公安系统服务优化
- 高性能网站性能优化与系统架构
- 20、Selenium + Python 实现 UI 自动化测试-AutoIT工具
- 高性能网站性能优化与系统架构(ZT)
- OS X 系统下实现python脚本工具在任意目录下直接使用
- 使用python实现一个通用协议测试工具