python多核心利用测试

对于很多企业来说,随着时间的推移,用户量或者企业建点扩张,使用erp就会出现应用访问越来越慢的情况,其实这种情况不但限于erp,只要是有数据量增长的互联网业务必然会遇到的,因为一开始的是就没有做好大数据量的访问情况。

odoo erp是python开发的,python相对c、c++、java等在性能方面确实是低了很多,归根到底就是本来python就是c跟c++开发出来的语言,另外python让人诟病的全局解释器锁(GIL,Global Interpreter Lock),想要更加了解GIL的话可以访问http://cenalulu.github.io/python/gil-in-python/?utm_source=tuicool&utm_medium=referral

有一段时间在公司,openerp已经开发好了,并且让个别企业在使用了,当然这个过程有某些企业已经反映运行慢了,这期间也做了很多测试,发现确实openerp在运行过程中发挥不了多核心的情况,基本上都是cpu一个核心100%的情况就卡死了,但是还有起码好多个核心的资源没有用到啊?难道就这样废了吗?后面也尝试用nginx做转发,还是发现一个核心100%的情况。

后面自己也尝试用java写了个多线程网络通信的程序,用了循环不断拉去服务端的线程,再去观察一下cpu的情况,惊喜发现cpu真心可以多核利用到了啊,难道说后面要用java开发新的业务程序吗?

尽管只是java比python在性能上面确实要快,但是还是抱着了解的心态开始了python的多进程、多线程的测试:

python多进程(用了一个死循环来测试):

#!/bin/python

from multiprocessing import Process

def MulProcess():

while 1:

pass

if __name__ == ‘__main__‘:

t1 = Process(target=MulProcess)

t2 = Process(target=MulProcess)

t3 = Process(target=MulProcess)

t4 = Process(target=MulProcess)

t1.start()

t2.start()

t3.start()

t4.start()

t1.join()

t2.join()

t3.join()

t4.join()

代码建立了4个进程,然后一直循环,上图看到的4个cpu都利用到了,其实说白了python其实是可以用到多核心的

python多线程:

#!/bin/python

from threading import Thread

def ThreadProcess():

while True:

pass

if __name__ == ‘__main__‘:

t1 = Thread(target=ThreadProcess)

t1.start()

t2 = Thread(target=ThreadProcess)

t2.start()

t3 = Thread(target=ThreadProcess)

t3.start()

t4 = Thread(target=ThreadProcess)

t4.start()

t5 = Thread(target=ThreadProcess)

t5.start()

t6 = Thread(target=ThreadProcess)

t6.start()

t1.join()

t2.join()

t3.join()

t4.join()

t5.join()

t6.join()

多线程的代码建立6个线程,其实超过了4核心了,但是这样没问题,总共4核心超过了照样跑,上图的cpu显示基本都用到了4核心了,但是建议不要用多线程,为什么?1.多线程不同多进程,多线程的数据在不同线程中都是可以共享的,cpu的资源分享可不想你想的那样,在多线程跑的时候是那个空闲跑哪个,很容易出现数据乱的情况( 如果有修改数据的情况下),2.当然多线程还是可以保证数据的统一的,只是要加上一个threading.Lock(),那就是要加上锁,想运行的时候必须先获取lock锁,请问这本质不是把多线程的快速处理性能降低了吗?真是然并卵啊。关于进程,不多说,如果不是变态的业务程序需要到进程间数据访问的话,基本上进程都是独立运行的,但是系统在建立一个进程跟建立一个线程的资源耗费是不同的,明显进程相对线程大得多。果然这个世界上什么鱼与熊掌不可兼得的事情还是少之又少啊。

好了,到此为止,基本上对python的多线程、多进程的情况有了个比较客观了解了。下面还是要测试一下openerp在多核心利用情况。

其实新版的odoo8、9都是支持gevent、multiprocess、threading的运行方式,测试只是用了gevent跟multiprocess的情况,至于threading就不要去测试了,除非用的是单核心的cpu。笔者用的是openerp 7跟odoo 8去做测试,这里主要说odoo 8,odoo 8 的环境是centos7,直接用odoo rep文件,yum install的,我比较懒,当然可以用source的方式,这就不详细介绍,不懂看官网去。yum安装的好处是基本上缺少什么依赖都给你安装好了。

一、先测试multiprocess的事况测试之前直接修改配置文件/etc/odoo/openerp-server.conf,设置workers = 4(我是4核心的虚拟机),这里说一下设置workers的情况,如果设置workers = 0的话就只有一个odoo的进程,如果workers =1就立刻变成了4个进程,还有出现一个openerp-gevent进程,这个最要是用odoo聊天客户而用的,有安装了gevent的情况下面就会出现,当然可以在openerp-server.conf配置文件里面去掉,所以除掉这个进程理论上是workers =1的时候拉起了3个进程,然后workers =2 就是5个进程以此类推推算 ,启动systemctl start odoo.service,首先用最原始的方式,打开url按住F5不停刷新,一边观察,后面还用了./webbench -c 1000 -t 10 http://192.168.1.125/ 去测试

果然都用到4核心了,也验证了python多进程的多核心利用

二、接下来测试gevent,gevent是python个一个异步并发框架,跟tornado有点相识,但是用是的协程的概念,如果有时间找gevent源码看看,不过我这里主要是模仿多进程的,想法:4核心的虚拟机,开启4个openerp-gevent的进程,通过不同的端口来访问,但是我了统一80端口访问,就用了nginx来作为前端转发,同时也测试一下nginx的多核心使用情况,当然nginx本身也是异步的,后面测试完了不得不承认加了nginx在访问上面真心比没加好很多,这里贴上nginx的部分配置:

XXXXXXXXXXXXXXX     # 很多没有贴出来

worker_processes 4;

worker_cpu_affinity 0001 0010 0100 1000;

events {

use epoll;

worker_connections 65563;

}

XXXXXXXXXXXXXXX     # 很多没有贴出来

server {

listen       80 default_server;

listen       [::]:80 default_server;

server_name  _;

root         /usr/share/nginx/html

location / {

proxy_pass http://openerp;

}

XXXXXXXXXXXXXXX

upstream openerp{

server 192.168.1.125:8072;

server 192.168.1.125:8073;

server 192.168.1.125:8074;

server 192.168.1.125:8075;

}

XXXXXXXXXXXXXXXXX

启动四个/usr/bin/openerp-gevent -c openerp-server.conf

/usr/bin/openerp-gevent -c openerp-server8073.conf

/usr/bin/openerp-gevent -c openerp-server8074.conf

/usr/bin/openerp-gevent -c openerp-server8075.conf

启动nginx : systemctl start nginx.serivce

查看端口:

ok,测试:./webbench -c 1000 -t 30 http://192.168.1.125/

1000并发 ,持续30秒

结论:python可以利用多进程的情况实现多核心利用,java在性能方面确实比python要好,但是python开发速度相对快,odoo其实也可以实现多核心利用情况,估计性能会上一个台阶,另外nginx的多核心利用只能支持到8核心(网上说的,懒得去测试)。

时间: 2024-08-06 22:19:07

python多核心利用测试的相关文章

Python 单元测试 & 文档测试

1.1   单元测试 1.1.1   单元测试编写 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 编写一个Dict类,这个类的行为和dict一致,但是通过属性来访问. >>> d = Dict(a=1, b=2) >>> d['a'] 1 >>> d.a 1 class dict编写如下: [[email protected] python]# cat mydict.py #!/usr/bin/python # -*- co

【汇总】Python 编程核心知识体系

[汇总]Python 编程核心知识体系 大神著作,源自:https://woaielf.github.io/2017/06/13/python3-all/ 本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章). 首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典,集合),条件&循环,文件对象,错误&异常,函数,模块,面向对象编程: 接着,结合这些思维导图主要参考的资料,分享一下我的学习体验,一方面

python学习笔记03:python的核心数据类型

从根本上讲,Python是一种面向对象的语言.它的类模块支持多态,操作符重载和多重继承等高级概念,并且以Python特有的简洁的语法和类型,OOP十分易于使用.Python的语法简单,容易上手. Python程序可以分解成模块.语句.表达式以及对象.1.程序由模块构成.2.模块包含语句.3.语句包含表达式.4.表达式建立并处理对象. Python的核心数据类型如下: 对象类型                   例子 常量/创建                     数字 1234, 3.14

基于python的性能负载测试Locust-1 简介

官网: http://locust.io/GitHub: https://github.com/locustio/locust 简介 Locust 是一个开源负载测试工具.使用 Python 代码定义用户行为,也可以仿真百万个用户.Locust 是非常简单易用,分布式,用户负载测试工具.Locust 主要为网站或者其他系统进行负载测试,能测试出一个系统可以并发处理多少用户.Locust 是完全基于时间的,因此单个机器支持几千个并发用户.相比其他许多事件驱动的应用,Locust 不使用回调,而是使

Python 语言搭建SELENIUM测试环境,搭建过程记录。

第一步,安装Python: 第二步,安装SetupTools: 第三步,安装Pip: 第四步,安装selenium(for python) 第五步,新建第一个基于Firefox的测试用例 上述 只是步骤,具体内容,明天补充,睡觉 咯--- Python 语言搭建SELENIUM测试环境,搭建过程记录.

使用python+pychram进行API测试(接口测试)初级STEP 1

花了一天时间安装了解了下最基本的python+pychram进行API测试,下面这个可以指导自己以后入门:基本的开发级别还需要学习 1.python下载地址:https://www.python.org/about/当前下载版本:python 2.7.12 2.下载完成进行环境变量配置配置python环境变量:E:\Python27\python\;E:\Python27\python\Scripts (根据你自己安装地址) 3.使用pipcmd进入E:\Python27\python\Scri

【tool】利用测试概念进行代码设计时的七条基本原则

跟其它编码原则一样,这些原则也不是不容置疑或不可改变的教条.有时候打破这些规则也是必要的.因此,理解每条原则背后的动机和判断何时这些动机不适用(或应让位给更关心的问题)的能力是很重要的. 原则 1. 到 GUI 视图的外面去 尽可能把代码移到 GUI 视图的外面.然后各种 GUI 动作就能成了模型上的简单方法调用.为什么您需要这样做呢? 对 GUI 测试者来说,通过方法调用测试功能比间接地测试功能容易的多. 另一个好处是它使修改程序功能而不影响视图变的更容易. 当然,视图中也可能存在错误.在理想

python 函数编写与测试

新建文件如:test.py 用文档编辑器打开文件,函数代码如下 #coding=utf-8def my_abs(y): if y > 0:  return y else:  return -yprint my_abs(-10) 其中#coding=utf-8为文档编码的定义,文档格式保存为utf-8 输入命令 python test.py 即可测试

用Python写Robot Framework测试

Robot Framework 框架是基于 Python 语言开发的,所以,它本质上是 Python 的一个库. 百度搜索实例 创建 py_robot.py 文件,代码如下: from robot.api import TestSuite from robot.api import ResultWriter from robot.model import Keyword # 百度搜索测试 class BaiduSearchTest: def __init__(self, name, librar