1. 程式人生 > >odoo 8.0 多核啟用,python多核心利用測試

odoo 8.0 多核啟用,python多核心利用測試

轉自:
Difference between built-in multiprocessor-mode and gunicorn
odoo 在配置workers後的錯誤解決方法
python多核心利用測試
時間:2016-04-18 11:31:26   來源:fengyunsen   編輯:夏珍   點選:8  

A-A+

 

u=3120216121,1881524516&fm=21&gp=0.jpg

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

spacer.gifwKioL1cTlqfA-2fbAABFsGJyBLc678.png

程式碼建立了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()

wKiom1cTleuCG67oAABOMfL6eE4403.png

       多執行緒的程式碼建立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/ 去測試

wKiom1cTle2wAGgLAABZs9-7TnU162.png

果然都用到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

檢視埠:wKioL1cTlqrwxKRVAAAyHcInDo0098.png

ok,測試:./webbench -c 1000 -t 30 http://192.168.1.125/ 

          1000併發 ,持續30秒

 wKiom1cTle_g9N0NAAB4gCdVpcY471.png

     結論:python可以利用多程序的情況實現多核心利用,java在效能方面確實比python要好,但是python開發速度相對快,odoo其實也可以實現多核心利用情況,估計效能會上一個臺階,另外nginx的多核心利用只能支援到8核心(網上說的,懶得去測試)。