1. 程式人生 > >odoo 8.0 多核啟用

odoo 8.0 多核啟用

itl 虛擬 jpg com 分享 roo aaa 成了 建議

技術分享

對於很多企業來說,隨著時間的推移,用戶量或者企業建點擴張,使用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 多核啟用