odoo 8.0 多核启用

对于很多企业来说,随着时间的推移,用户量或者企业建点扩张,使用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核心
(网上说的,懒得去测试)。
odoo 8.0 多核启用的更多相关文章
- 配置ubuntu 14.04.3 LTS odoo 9.0开发环境
使用VMware Fusion 8.0.1创建ubuntu 64bit虚拟机:使用ubuntu-14.04.3-desktop-amd64.iso镜像缺省安装ubuntu,用户名odoo,密码1234 ...
- 配置Windows 2008 R2 64位 Odoo 8.0 源码PyCharm开发调试环境
安装过程中,需要互联网连接下载python依赖库: 1.安装: Windows Server 2008 R2 x64标准版 2.安装: Python 2.7.10 amd64 到C:\Python27 ...
- 玩转Linux之- CentOS 7.0,启用iptables防火墙
原文 玩转Linux之- CentOS 7.0,启用iptables防火墙 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall:sy ...
- macOS Sierra(10.12.6), odoo(11.0), Python(3.5.4)配置
欣闻odoo11支持python3环境了,赶紧在mac平台尝试一下: 前期设置,参考另篇文章:macOS Sierra 10.12.6 odoo 10.0 开发环境配置 因为odoo11尚未正式发布, ...
- macOS Sierra 10.12.6 odoo 10.0 开发环境配置
参考了网上的一些教程,将最终过程记录一下,其中需要的一些程序,我已经放到百度网盘: https://pan.baidu.com/s/1boKHSTL 1.抹盘安装macOS Sierra 10.12. ...
- odoo 10.0部署shell
环境ubuntu16+nginx+python2.7.12+postgresql9.5+odoo 10.0 community #!/bin/bash #author:guoyihot@outlook ...
- ODOO v10.0 自动生成财务凭证的科目设置
ODOO v10.0 自动生成财务凭证的科目设置 可以在产品类别及产品档案里设置,建议在产品类别下设置,方便维护. 项目 设置为(具体科目以公司科目表为主) 对应作用业务 Income Account ...
- 【Odoo 8开发教程】第一章:Odoo 8.0安装
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/10779733.html odoo有三种常见的安装方式:打包程序安装.源码安装以及Docker镜像安装. 一:打 ...
- 在Ubuntu Server 14.04上源码安装Odoo 9.0
1. 更新Ubuntu服务器软件源 sudo apt-get update #更新软件源 sudo apt-get dist-upgrade #更新软件包,自动查找依赖关系 sudo shutdown ...
随机推荐
- Android开发 EditText按回车按键后出现 focus search returned a view that wasn't able to take focus! 错误
问题描述 将EditText这个View成为了ListView或者RecyclerView的item时,在按输入法的回车/下一步/next时会出现的 focus search returned a v ...
- Android开发 StateListDrawable详解
前言 StateListDrawable是与xml中的selector属性对应代码实现类,它需要配合GradientDrawable的使用,如果你还不了解GradientDrawable可以参考我的另 ...
- 容斥原理——hdu2204dfs深搜
/* 枚举素数幂p 然后求k^p<=n 的 k的个数 因为 k^p1*p2==k^p2*p1,所以这两种情况是多算的,所以要进行容斥 减去两个质数幂相乘的,再加上三个质数幂相乘的 因为2*3*5 ...
- js封装设置获取cookie
var docCookies = { getItem: function (sKey) { return decodeURIComponent(document.cookie.replace(new ...
- (转)第02节:在Canvas上画简单的图形
我们现在已经可以在HTML中使用Fabric.js库了,那这节我们就详细的学习一下如何在canvas上画出简单的图形. 在画东西之前我们需要了解画任何东西的基本三个步骤: 声明画布(canvas),用 ...
- 深入浅出 Java Concurrency (40): 并发总结 part 4 性能与伸缩性[转]
性能与伸缩性 使用线程的一种说法是为了提高性能.多线程可以使程序充分利用闲置的资源,提高资源的利用率,同时能够并行处理任务,提高系统的响应性. 但是很显然,引入线程的同时也引入了系统的复杂性.另外系统 ...
- Windows的SEH机理简要介绍
1.异常分类 一般来说,我们把Exception分为2类,一类是CPU产生的异常,我们称之为CPU异常(或者硬件异常).另一类为是通过调用RaiseException API产生的软件异常,我们称之为 ...
- C++ 函数模板&类模板详解
在 C++ 中,模板分为函数模板和类模板两种.函数模板是用于生成函数的,类模板则是用于生成类的. 函数模板&模板函数 类模板&模板类 必须区分概念 函数模板是模板,模板函数时 ...
- 06_springmvc之参数绑定(pojo和集合)
一.包装类型pojo参数绑定 实现方法: 第一种方法:在形参中 添加HttpServletRequest request参数,通过request接收查询条件参数. 第二种方法:在形参中让包装类型的po ...
- Linux常见问题解答--如何修复“tar:Exiting with failure status due to previous errors”
问题: 当我用tar命令来创建一个压缩文件时,总在执行过程中失败,并且抛出一个错误说明"tar:由于前一个错误导致失败退出"("Exiting with failure ...