Odoo 環境下Ubuntu服務器性能優化–參數調整 (轉老鄧的)

使用Odoo進行內部信息化管理,隨着業務增長,服務器性能問題變成了瓶頸,爲了解決這些問題,最近的工作重點將移到性能調整上來,同時也會在此記錄整個處理過程,以便日後回顧。

1.根據相關資料建議,在linux文件系統有一個預讀的參數,可以通過如下命令查看:

blockdev --getra /dev/sda

一般的默認值爲256,我們可以將此數據改大一點,建議的範圍是在4096-16384之間,預讀不足的常見問題是寫磁盤的速度要比讀取的速度要高。

改變參數的命令格式是:blockdev --setra 4096 /dev/sda

需要根據每塊磁盤單獨進行設置,通常可以將調整命令寫入rc.local啓動腳本中。

2.在linux中,用戶每訪問一個文件,系統都會更新文件的其中一個屬性(上次訪問時間),當用戶在訪問數據時,系統會需要不斷的進行寫操作,這個在系統中也是一筆不小的開銷,我們可以在/etc/fstab文件中,對掛載的卷加上noatime選項來禁用此行爲:

/dev/sda1 / ext3 noatime,errors=remount-ro 0 1

修改完以後,執行sudo mount -a 命令生效即可。

3.在linux中有關讀緩存與交換的參數如下有兩個,可以在/etc/sysctl.conf中加上兩行:

vm.swappiness=0

vm.overcommit_memory=2

這些參數可以在/proc/sys/vm/中查看

4.共享內存的設定,ubuntu中共享內存的默認值都很低,爲了更好的利用服務器資源,我們將對其進行調整,網上有一個調整的腳本。

#!/bin/bash  
      
    page_size=`getconf PAGE_SIZE`  
    phys_pages=`getconf _PHYS_PAGES`  
    shmall=`expr $phys_pages / 2`  
    shmmax=`expr $shmall \* $page_size`  
    echo kernel.shmmax = $shmmax  
    echo kernel.shmall = $shmall

直接以root身份運行 ./shmsetup >> /etc/sysctl.conf

sysctl -p

  一、首先我們要分析影響odoo 服務器 性能的因素

       CPU

       目前大部分CPU在同一時間只能運行一個線程,超線程的處理器可以在同一時間處理多個線程,因此可以利用超線程特性提高系統性能。

       在linux系統下只有運行SMP內核才能支持超線程,但是安裝的CPu數量越多,從超線程獲得的性能提升越少。

       odoo單進程模式下對 CPU 要求並不高,但是爲了支持多併發,需要開啓 workers,一般 CPU(核)的數量和

       work 數量爲 works = 2 * cpu(核) + 1

       內存

       內存太小,系統進程將被阻塞,應用也將變得緩慢,甚至失去響應;內存太大,導致資源浪費。

       虛擬內存可以緩解物理內存的不足,但是虛擬內存的過多佔用會導致應用程序的性能明顯下降。

       在一個32位處理器的linux系統中超過8GB的物理內存都將被浪費,因此要使用更大的內存,建議安裝64位的操作系統,同時開啓linux的大內存內核支持。

       由於處理器尋址範圍的限制,在32位linux操作系統上,應用程序單個進程最大隻能使用2GB的內存。

       oodo 一般建議部署在 64 位環境中,內存數量和 odoo 開啓的 worker 數量成正比,odoo 有個稍微複雜的估算,一般建議簡單用下列方法覈算:

       ​works * 500M

       磁盤I/O性能

       磁盤RAID技術,Redundant Array of Independent Disk,即獨立磁盤冗餘陣列,簡稱磁盤陣列。

       RAID通過將多塊獨立的磁盤(物理硬盤)按不同的方式組合起來形成一個磁盤組(邏輯硬盤),從而提供比單個磁盤更高的IO性能和數據冗餘。

       根據磁盤組合方式不同,分爲RAID0、RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10等,常用的有RAID0、RAID1、RAID5、RAID0+1。

       RAID0:通過把多塊硬盤粘合成一個容量更大的硬盤組,提高磁盤的性能和吞吐量,成本低,至少兩塊磁盤,但是沒有容錯和數據修復功能,只能用在對數據安全性要求不高的環境中。

       RAID1:也就是磁盤鏡像,通過把一個磁盤的數據鏡像到另外一個磁盤上,最大限度的保證磁盤數據的可靠性和可修改性,具有很高的數據冗餘能力,但是磁盤利用率只有50%,成本較高,多用在保存重要數據的場合。

       RAID5:磁盤分段加奇偶校驗技術,提高了系統的可靠性。讀出效率很高,寫效率一般,至少需要3塊磁盤,允許一塊磁盤故障,不影響數據的可用性。

       RAID0+1:把RAID0和RAID1技術結合起來,至少需要4塊硬盤,每個盤都有其鏡像盤,提高全冗餘能力,並具有快速讀寫能力。

       網絡帶寬​ Odoo 對帶寬要求較高,一般建議 10用戶 /M 帶寬。

       

       二、系統性能評估

       找到影響 Odoo 性能的關鍵原因,才能對症下藥,工欲善其事,必先利其器,需要數量使用一下命令:

       常用系統命令

       Vmstat、sar、iostat、netstat、free、ps、top等

       常用組合方式

       l 用vmstat、sar、iostat檢測是否是CPU瓶頸

       l 用free、vmstat檢測是否是內存瓶頸

       l 用iostat檢測是否是磁盤I/O瓶頸

       l 用netstat檢測是否是網絡帶寬瓶頸

       

       1:系統整體性能評估(uptime命令)

       [root@web1 ~]# uptime

       16:38:00 up 118 days, 3:01, 5 users, load average: 1.22, 1.02, 0.91

       這裏需要注意的是:load average這個輸出值,這三個值的大小一般不能大於系統CPU的個數,例如,本輸出中系統有8個CPU,如果load average的三個值長期大於8時,說明CPU很繁忙,負載很高,可能會影響系統性能,但是偶爾大於8時,倒不用擔心,一般不會影響系統性能。相反,如果load average的輸出值小於CPU的個數,則表示CPU還有空閒的時間片,比如本例中的輸出,CPU是非常空閒的。

       

       2:cpu性能評估

       (1)利用vmstat命令監控系統CPU

       該命令可以顯示關於系統各種資源之間相關性能的簡要信息,這裏我們主要用它來看CPU一個負載情況。

       下面是vmstat命令在某個系統的輸出結果:

       [root@node1 ~]# vmstat 2 3 #每2秒更新信息,統計3次

       procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------

       r b swpd free buff cache si so bi bo in cs us sy id wa st

       0 0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 0

       0 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 0

       0 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0

       Procs

       r列表示運行和等待cpu時間片的進程數,這個值如果長期大於系統CPU的個數,說明CPU不足,需要增加CPU。

       b列表示在等待資源的進程數,比如正在等待I/O、或者內存交換等。

       Cpu

       us列顯示了用戶進程消耗的CPU 時間百分比。us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期大於50%,就需要考慮優化程序或算法。

       根據經驗,us+sy的參考值爲80%,如果us+sy大於 80%說明可能存在CPU資源不足。

       (2) 利用sar命令監控系統CPU

       sar功能很強大,可以對系統的每個方面進行單獨的統計,但是使用sar命令會增加系統開銷,不過這些開銷是可以評估的,對系統的統計結果不會有很大影響。

       下面是sar命令對某個系統的CPU統計輸出:

       [root@webserver ~]# sar -u 3 5 #u顯示系統所有cpu在採樣時間內的負載狀態

       Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU)

       11:41:24 AM CPU %user %nice %system %iowait %steal %idle

       11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83

       11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50

       11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.92

       11:41:36 AM all 90.08 0.00 0.13 0.16 0.00 9.63

       11:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41

       Average: all 0.34 0.00 0.16 0.05 0.00 99.45

       對上面每項的輸出解釋如下:

       l %user列顯示了用戶進程消耗的CPU 時間百分比。

       l %nice列顯示了運行正常進程所消耗的CPU 時間百分比。

       l %system列顯示了系統進程消耗的CPU時間百分比。

       l %iowait列顯示了IO等待所佔用的CPU時間百分比。

       l %steal列顯示了在內存相對緊張的環境下pagein強制對不同的頁面進行的steal操作 。

       l %idle列顯示了CPU處在空閒狀態的時間百分比。

       

       3:內存性能評估

       (1)利用free指令監控內存

       free是監控linux內存使用狀況最常用的指令,看下面的一個輸出:

       [root@webserver ~]# free -m #查看以M爲單位的內存使用情況

        total used free shared buffers cached

       Mem: 8111 7185 926 0 243 6299

       -/+ buffers/cache: 643 7468

       Swap: 8189 0 8189

        一般有這樣一個經驗公式:應用程序可用內存/系統物理內存>70%時,表示系統內存資源非常充足,不影響系統性能,應用程序可用內存/系統物理內存<20%時,表示系統內存資源緊缺,需要增加系統內存,20%<應用程序可用內存/系統物理內存<70%時,表示系統內存資源基本能滿足應用需求,暫時不影響系統性能。

       (2) 利用vmstat命令監控內存

       [root@node1 ~]# vmstat 2 3

       procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------

       r b swpd free buff cache si so bi bo in cs us sy id wa st

       0 0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 0

       0 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 0

       0 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0

       memory

       swpd列表示切換到內存交換區的內存數量(以k爲單位)。如果swpd的值不爲0,或者比較大,只要si、so的值長期爲0,這種情況下一般不用擔心,不會影響系統性能。

       free列表示當前空閒的物理內存數量(以k爲單位)

       buff列表示buffers cache的內存數量,一般對塊設備的讀寫才需要緩衝。

       cache列表示page cached的內存數量,一般作爲文件系統cached,頻繁訪問的文件都會被cached,如果cache值較大,說明cached的文件數較多,如果此時IO中bi比較小,說明文件系統效率比較好。

       swap

       si列表示由磁盤調入內存,也就是內存進入內存交換區的數量。

       so列表示由內存調入磁盤,也就是內存交換區進入內存的數量。

       一般情況下,si、so的值都爲0,如果si、so的值長期不爲0,則表示系統內存不足。需要增加系統內存。

       

       4:磁盤I/O性能評估

       (1)磁盤存儲基礎

       l 熟悉RAID存儲方式,可以根據應用的不同,選擇不同的RAID方式。

       l 儘可能用內存的讀寫代替直接磁盤I/O,使頻繁訪問的文件或數據放入內存中進行操作處理,因爲內存讀寫操作比直接磁盤讀寫的效率要高千倍。

       l 將經常進行讀寫的文件與長期不變的文件獨立出來,分別放置到不同的磁盤設備上。

       l 對於寫操作頻繁的數據,可以考慮使用裸設備代替文件系統。

       使用裸設備的優點有:

       ü 數據可以直接讀寫,不需要經過操作系統級的緩存,節省了內存資源,避免了 內存資源爭用。

       ü 避免了文件系統級的維護開銷,比如文件系統需要維護超級塊、I-node等。

       ü 避免了操作系統的cache預讀功能,減少了I/O請求。

       ü 使用裸設備的缺點是:

       ü 數據管理、空間管理不靈活,需要很專業的人來操作。

       (2)利用iostat評估磁盤性能

       [root@webserver ~]# iostat -d 2 3 #-d 顯示磁盤的使用情況

       Linux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU)

       Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn

       sda 1.87 2.58 114.12 6479462 286537372

       Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn

       sda 0.00 0.00 0.00 0 0

       Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn

       sda 1.00 0.00 12.00 0 24

       對上面每項的輸出解釋如下:

       Blk_read/s表示每秒讀取的數據塊數。

       Blk_wrtn/s表示每秒寫入的數據塊數。

       Blk_read表示讀取的所有塊數。

       Blk_wrtn表示寫入的所有塊數。

       可以通過Blk_read/s和Blk_wrtn/s的值對磁盤的讀寫性能有一個基本的瞭解,如果Blk_wrtn/s值很大,表示磁盤的寫操作很頻繁,可以考慮優化磁盤或者優化程序,如果Blk_read/s值很大,表示磁盤直接讀取操作很多,可以將讀取的數據放入內存中進行操作。

       對於這兩個選項的值沒有一個固定的大小,根據系統應用的不同,會有不同的值,但是有一個規則還是可以遵循的:長期的、超大的數據讀寫,肯定是不正常的,這種情況一定會影響系統性能。

       (3)利用sar評估磁盤性能

       通過“sar –d”組合,可以對系統的磁盤IO做一個基本的統計,請看下面的一個輸出:

       [root@webserver ~]# sar -d 2 3

       Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU)

       11:09:33 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

       11:09:35 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

       11:09:35 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

       11:09:37 PM dev8-0 1.00 0.00 12.00 12.00 0.00 0.00 0.00 0.00

       11:09:37 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

       11:09:39 PM dev8-0 1.99 0.00 47.76 24.00 0.00 0.50 0.25 0.05

       Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

       Average: dev8-0 1.00 0.00 19.97 20.00 0.00 0.33 0.17 0.02

       需要關注的幾個參數含義:

       await表示平均每次設備I/O操作的等待時間(以毫秒爲單位)。

       svctm表示平均每次設備I/O操作的服務時間(以毫秒爲單位)。

       %util表示一秒中有百分之幾的時間用於I/O操作。

       對以磁盤IO性能,一般有如下評判標準:

       正常情況下svctm應該是小於await值的,而svctm的大小和磁盤性能有關,CPU、內存的負荷也會對svctm值造成影響,過多的請求也會間接的導致svctm值的增加。

       await值的大小一般取決與svctm的值和I/O隊列長度以及I/O請求模式,如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠高於svctm的值,則表示I/O隊列等待太長,系統上運行的應用程序將變慢,此時可以通過更換更快的硬盤來解決問題。

       %util項的值也是衡量磁盤I/O的一個重要指標,如果%util接近100%,表示磁盤產生的I/O請求太多,I/O系統已經滿負荷的在工作,該磁盤可能存在瓶頸。長期下去,勢必影響系統的性能,可以通過優化程序或者通過更換更高、更快的磁盤來解決此問題。

       

       5:網絡性能評估.

       (1)通過ping命令檢測網絡的連通性

       (2)通過netstat –i組合檢測網絡接口狀況

       (3)通過netstat –r組合檢測系統的路由表信息

       (4)通過sar –n組合顯示系統的網絡運行狀態 sar -n DEV 5 3

       (5)常用分析

       netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}' 查看tcp鏈接數

       netstat -pant |grep ":80"|awk '{print $5}' | awk -F: '{print $1}'|sort|uniq -c|sort -nr 查看連接數最多的ip

       cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -n10

       提取日誌 分別是訪問URL和URL訪問來源 排序

       awk '{print $7}' access.log | sort | uniq -c |sort -nr | head -n10 > test.txt

       (6)shell分析nginx日誌

       178.255.215.86 - - [04/Jul/2013:00:00:31 +0800] "GET /tag/316/PostgreSQL HTTP/1.1" 200 4779 "-" "Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter); +http://www.exabot.com/go/robot)" "-"- 178.255.215.86 - - [04/Jul/2013:00:00:34 +0800] "GET /tag/317/edit HTTP/1.1" 303 5 "-" "Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter); +http://www.exabot.com/go/robot)" "-"- 103.29.134.200 - - [04/Jul/2013:00:00:34 +0800] "GET /code-snippet/2022/edit HTTP/1.0" 303 0 "-" "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0" "-"- 103.29.134.200 - - [04/Jul/2013:00:00:35 +0800] "GET /user/login?url=http://outofmemory.cn/code-snippet/2022/edit HTTP/1.0" 200 4748 "-" "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0" "-"-

       以下腳本都是基於上面日誌格式的,如果你的日誌格式不同需要調整awk後面的參數。

       分析日誌中的UserAgent

       cat access_20130704.log | awk -F "\"" '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20

       上面的腳本將分析出日誌文件中最多的20個UserAgent

       分析日誌中那些IP訪問最多

       cat access_20130704.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20

       分析日誌中那些Url請求訪問次數最多

       cat access_20130704.log | awk -F "\"" '{print $(NF-5)}' | sort | uniq -c | sort -nr | head -20

       

       三、針對發現問題的常用改進措施

       1、爲磁盤I/O調整Linux內核電梯算法

       在選擇文件系統後,有一些內核和掛載選項可能會影響到它的性能表現,其中一個內核設置是電梯算法,通過調整電梯算法,系統可以平衡低延遲需求,收集足夠的數據,以有效地組織對磁盤的讀和寫請求。

       2、禁用不必要的守護進程,節省內存和CPU資源

       每臺服務器上都運行着許多守護進程或服務,而具有諷刺意味的是,有很多通常不是必需的,這些服務沒有發揮作用,但卻消耗了寶貴的內存和CPU時間。此外,它們可能將服務器置於危險境地,多運行一個服務就等於多向黑客打開一扇長驅直入的門,因此,你應該將它們從服務器移除,禁用它們最大的好處是可以加快啓動時間,釋放內存。另外,你可以減少CPU需要處理的進程數,禁用它們的另一個好處是增強服務器的安全性,因爲越少的守護進程意味着可被攻擊和利用的漏洞越少。

       下面是一些應該被禁用的Linux守護進程,默認情況下,它們都是自動運行的:

       3、關掉GUI

       一般說來,Linux服務器是不需要GUI的,所有管理任務都可以在命令行下完成,因此最好關掉GUI,重定向X顯示或通過一個Web瀏覽器界面顯示。爲了禁用GUI,“init level(啓動級別)”應該被設置爲3(命令行登錄),而不是5(圖形登錄),如果需要GUI,可以隨時運行startx進入圖形用戶界面。

       4、清理不需要的模塊或功能

       在服務器軟件包中有太多被啓動的功能或模塊實際上是不需要的(如Apache中的許多功能模塊),仔細查看Apache配置文件,確定FrontPage支持或其它額外的模塊是否真的要用到,如果不需要,應該毫不猶豫地從服務器禁用掉,這樣有助於提高系統內存可用量,騰出更多資源給那些真正需要的軟件,讓它們運行得更快。

       5.修改磁盤緩存:Odoo 有大量的小文件,修改磁盤預讀緩存可以顯著 提高 odoo 訪問速度

       blockdev 工具允許從命令行調用區塊設備控制程序。

       –setro 設置設備爲只讀

       –getro 讀取設備是否爲只讀(成功爲1,0則爲可讀寫)

       –setrw 設置設別爲可讀寫

       –getss 打印設備的扇區大小,通常是512

       –getsize 打印設別的容量,按照一個扇區512個字節計算

       –setra N 設置預讀扇區(512字節)爲N個.Set readahead to N 512-byte sectors.

       –getra 打印readahead(預讀扇區)

       –flushbufs 刷新緩衝

       –rereadpt 重讀分區表。

       blockdev --getra /dev/sda

       默認值爲256,建議的範圍是在4096-16384之間,預讀不足的常見問題是寫磁盤的速度要比讀取的速度要高。

       改變參數的命令格式是:blockdev --setra 4096 /dev/xdva1

       需要根據每塊磁盤單獨進行設置,通常可以將調整命令寫入rc.local啓動腳本中。

       6.在linux中,用戶每訪問一個文件,系統都會更新文件的其中一個屬性(上次訪問時間),當用戶在訪問數據時,系統會需要不斷的進行寫操作,這個在系統中也是一筆不小的開銷,我們可以在/etc/fstab文件中,對掛載的卷加上noatime選項來禁用此行爲:

       /dev/sda1 / ext3 noatime,errors=remount-ro 0 1

       修改完以後,執行sudo mount -a 命令生效即可。

       7.在linux中有關讀緩存與交換的參數如下有兩個,可以在/etc/sysctl.conf中加上兩行:

       vm.swappiness=0

       vm.overcommit_memory=2

       這些參數可以在/proc/sys/vm/中查看

       8.共享內存的設定,ubuntu中共享內存的默認值都很低,爲了更好的利用服務器資源,我們將對其進行調整,網上有一個調整的腳本。

       #!/bin/bash

       page_size=`getconf PAGE_SIZE`

       phys_pages=`getconf _PHYS_PAGES`

       shmall=`expr $phys_pages / 2`

       shmmax=`expr $shmall \* $page_size`

       echo kernel.shmmax = $shmmax

       echo kernel.shmall = $shmall

       直接以root身份運行 ./shmsetup >> /etc/sysctl.conf

       sysctl -p

       9、將日誌文件轉移到內存中

       當一臺機器處於運行中時,最好是將系統日誌放在內存中,當系統關閉時再將其複製到硬盤,當你運行一臺開啓了syslog功能的筆記本電腦或移動設備時,ramlog可以幫助你提高系統電池或移動設備閃存驅動器的壽命,使用ramlog的一個好處是,不用再擔心某個守護進程每隔30秒向syslog發送一條消息,放在以前,硬盤必須隨時保持運轉,這樣對硬盤和電池都不好。

       10、先打包,後寫入

       在內存中劃分出固定大小的空間保存日誌文件,這意味着筆記本電腦硬盤不用一直保持運轉,只有當某個守護進程需要寫入日誌時才運轉,注意ramlog使用的內存空間大小是固定的,否則系統內存會很快被用光,如果筆記本使用固態硬盤,可以分配50-80MB內存給ramlog使用,ramlog可以減少許多寫入週期,極大地提高固態硬盤的使用壽命。

       持續更新中

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章