主要配置資訊
CPU:4核2.2GHz,記憶體:32GB,硬碟:60GB
一、檢視基礎資訊
1.檢視CPU資訊
- [root@odoodev ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
- 4
- [root@odoodev ~]#
2.檢視記憶體資訊
- [root@odoodev ~]# dmidecode -t memory
- # dmidecode 3.1
- Getting SMBIOS data from sysfs.
- SMBIOS 2.4 present.
- Handle 0x1000, DMI type 16, 15 bytes
- Physical Memory Array
- Location: Other
- Use: System Memory
- Error Correction Type: Multi-bit ECC
- Maximum Capacity: 32 GB
- Error Information Handle: Not Provided
- Number Of Devices: 2
- Handle 0x1100, DMI type 17, 21 bytes
- Memory Device
- Array Handle: 0x1000
- Error Information Handle: 0x0000
- Total Width: 64 bits
- Data Width: 64 bits
- Size: 16384 MB
- Form Factor: DIMM
- Set: None
- Locator: DIMM 0
- Bank Locator: Not Specified
- Type: RAM
- Type Detail: None
- Handle 0x1101, DMI type 17, 21 bytes
- Memory Device
- Array Handle: 0x1000
- Error Information Handle: 0x0000
- Total Width: 64 bits
- Data Width: 64 bits
- Size: 16384 MB
- Form Factor: DIMM
- Set: None
- Locator: DIMM 1
- Bank Locator: Not Specified
- Type: RAM
- Type Detail: None
- [root@odoodev ~]#
3.檢視硬碟資訊
- [root@odoodev ~]# fdisk -l
- 磁盤 /dev/vda:64.4 GB, 64424509440 位元組,125829120 個扇區
- Units = 扇區 of 1 * 512 = 512 bytes
- 扇區大小(邏輯/實體):512 位元組 / 512 位元組
- I/O 大小(最小/最佳):512 位元組 / 512 位元組
- 磁盤标簽類型:dos
- 磁盤辨別符:0x000ca9d8
- 裝置 Boot Start End Blocks Id System
- /dev/vda1 * 2048 2099199 1048576 83 Linux
- /dev/vda2 2099200 125829119 61864960 8e Linux LVM
- 磁盤 /dev/mapper/centos_pgsqlhosta-root:38.2 GB, 38235275264 位元組,74678272 個扇區
- Units = 扇區 of 1 * 512 = 512 bytes
- 扇區大小(邏輯/實體):512 位元組 / 512 位元組
- I/O 大小(最小/最佳):512 位元組 / 512 位元組
- 磁盤 /dev/mapper/centos_pgsqlhosta-swap:6442 MB, 6442450944 位元組,12582912 個扇區
- Units = 扇區 of 1 * 512 = 512 bytes
- 扇區大小(邏輯/實體):512 位元組 / 512 位元組
- I/O 大小(最小/最佳):512 位元組 / 512 位元組
- 磁盤 /dev/mapper/centos_pgsqlhosta-home:18.7 GB, 18668847104 位元組,36462592 個扇區
- Units = 扇區 of 1 * 512 = 512 bytes
- 扇區大小(邏輯/實體):512 位元組 / 512 位元組
- I/O 大小(最小/最佳):512 位元組 / 512 位元組
- [root@odoodev ~]# df -Th
- 檔案系統 類型 容量 已用 可用 已用% 挂載點
- /dev/mapper/centos_pgsqlhosta-root xfs 36G 14G 22G 39% /
- devtmpfs devtmpfs 16G 0 16G 0% /dev
- tmpfs tmpfs 16G 12K 16G 1% /dev/shm
- tmpfs tmpfs 16G 1.6G 15G 11% /run
- tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup
- /dev/vda1 xfs 1014M 206M 809M 21% /boot
- /dev/mapper/centos_pgsqlhosta-home xfs 18G 18G 20K 100% /home
- tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/26
- tmpfs tmpfs 3.2G 12K 3.2G 1% /run/user/42
- tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/0
- [root@odoodev ~]#
二、性能評估
網絡帶寬 Odoo 對帶寬要求較高,一般建議 10使用者 /M 帶寬。
1.系統整體性能評估
- [root@odoodev ~]# uptime
- 14:08:33 up 34 days, 22:38, 1 user, load average: 0.01, 0.02, 0.05
load average這個輸出值,這三個值的大小一般不能大于系統CPU的個數,例如,本輸出中系統有4個CPU,如果load average的三個值長期大于4時,說明CPU很繁忙,負載很高,可能會影響系統性能,但是偶爾大于4時,倒不用擔心,一般不會影響系統性能。相反,如果load average的輸出值小于CPU的個數,則表示CPU還有空閑的時間片,比如本例中的輸出,CPU是非常空閑的。
2.cpu性能評估
(1)利用vmstat指令監控系統CPU
該指令可以顯示關于系統各種資源之間相關性能的簡要資訊,這裡我們主要用它來看CPU一個負載情況。
下面是vmstat指令在某個系統的輸出結果:
- [root@odoodev ~]# vmstat 2 5 #每2秒更新資訊,統計5次
- procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 1 0 0 24778076 2120 6110512 0 0 0 6 1 2 1 0 99 0 0
- 0 0 0 24777928 2120 6110524 0 0 0 0 222 244 1 0 99 0 0
- 0 0 0 24777324 2120 6110524 0 0 0 56 296 332 1 0 99 0 0
- 0 0 0 24778944 2120 6110532 0 0 0 0 123 161 0 0 100 0 0
- 0 0 0 24778960 2120 6110532 0 0 0 4 128 151 0 0 100 0 0
- [root@odoodev ~]#
目前,CPU充足。
Procs
r清單示運作和等待cpu時間片的程序數,這個值如果長期大于系統CPU的個數,說明CPU不足,需要增加CPU。
b清單示在等待資源的程序數,比如正在等待I/O、或者記憶體交換等。
Cpu
us列顯示了使用者程序消耗的CPU 時間百分比。us的值比較高時,說明使用者程序消耗的cpu時間多,但是如果長期大于50%,就需要考慮優化程式或算法。
sy列顯示了核心程序消耗的CPU時間百分比。Sy的值較高時,說明核心消耗的CPU資源很多。
根據經驗,us+sy的參考值為80%,如果us+sy大于 80%說明可能存在CPU資源不足。
(2) 利用sar指令監控系統CPU
sar功能很強大,可以對系統的每個方面進行單獨的統計,但是使用sar指令會增加系統開銷,不過這些開銷是可以評估的,對系統的統計結果不會有很大影響。
下面是sar指令對某個系統的CPU統計輸出:
- [root@odoodev ~]# sar -u 3 5
- Linux 3.10.0-957.10.1.el7.x86_64 (odoodev) 2020年07月23日 _x86_64_ (4 CPU)
- 14時37分34秒 CPU %user %nice %system %iowait %steal %idle
- 14時37分37秒 all 0.25 0.00 0.17 0.00 0.00 99.58
- 14時37分40秒 all 0.17 0.00 0.08 0.00 0.00 99.75
- 14時37分43秒 all 0.25 0.00 0.08 0.00 0.00 99.67
- 14時37分46秒 all 0.25 0.00 0.17 0.08 0.00 99.50
- 14時37分49秒 all 0.33 0.08 0.42 0.00 0.00 99.16
- 平均時間: all 0.25 0.02 0.18 0.02 0.00 99.53
- [root@odoodev ~]#
對上面每項的輸出解釋如下:
%user列顯示了使用者程序消耗的CPU 時間百分比。
%nice列顯示了運作正常程序所消耗的CPU 時間百分比。
%system列顯示了系統程序消耗的CPU時間百分比。
%iowait列顯示了IO等待所占用的CPU時間百分比
%steal列顯示了在記憶體相對緊張的環境下pagein強制對不同的頁面進行的steal操作 。
%idle列顯示了CPU處在空閑狀态的時間百分比。
3.記憶體性能評估
(1)利用free指令監控記憶體
- [root@odoodev ~]# free -m #檢視以M為機關的記憶體使用情況
- total used free shared buff/cache available
- Mem: 32174 2029 24172 1869 5971 27814
- Swap: 6143 0 6143
- [root@odoodev ~]#
24172/32174=75%,說明記憶體資源很充足。
【經驗公式】:應用程式可用記憶體/系統實體記憶體>70%時,表示系統記憶體資源非常充足,不影響系統性能,應用程式可用記憶體/系統實體記憶體<20%時,表示系統記憶體資源緊缺,需要增加系統記憶體,20%<應用程式可用記憶體/系統實體記憶體<70%時,表示系統記憶體資源基本能滿足應用需求,暫時不影響系統性能。
(2)利用vmstat指令監控記憶體
- [root@odoodev ~]# 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
- 1 0 0 24762464 2120 6122280 0 0 0 6 1 3 1 0 99 0 0
- 0 0 0 24762612 2120 6122300 0 0 0 179 349 354 1 0 98 0 0
- 0 0 0 24762612 2120 6122320 0 0 0 0 314 307 1 0 98 0 0
- [root@odoodev ~]#
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)利用iostat評估磁盤性能
- [root@odoodev ~]# iostat -d 2 3 #-d 顯示磁盤的使用情況
- Linux 3.10.0-957.10.1.el7.x86_64 (odoodev) 2020年07月23日 _x86_64_ (4 CPU)
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- vda 2.10 0.48 25.19 1451558 76122344
- dm-0 1.79 0.47 25.18 1423879 76107735
- dm-1 0.00 0.00 0.00 2464 0
- dm-2 0.00 0.00 0.00 14500 12490
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- vda 14.00 4.00 25.75 8 51
- dm-0 9.50 4.00 25.75 8 51
- dm-1 0.00 0.00 0.00 0 0
- dm-2 0.00 0.00 0.00 0 0
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- vda 1.50 0.00 3.25 0 6
- dm-0 1.00 0.00 3.25 0 6
- dm-1 0.00 0.00 0.00 0 0
- dm-2 0.00 0.00 0.00 0 0
- [root@odoodev ~]#
對上面每項的輸出解釋如下:
Device: 以sdX形式顯示的裝置名稱tps: 每秒程序下發的IO讀、寫請求數量KB_read/s: 每秒從驅動器讀入的資料量,機關為K。KB_wrtn/s: 每秒從驅動器寫入的資料量,機關為K。KB_read: 讀入資料總量,機關為K。KB_wrtn: 寫入資料總量,機關為K。
- 可以通過KB_read/s和KB_wrtn/s的值對磁盤的讀寫性能有一個基本的了解,如果KB_wrtn/s值很大,表示磁盤的寫操作很頻繁,可以考慮優化磁盤或者優化程式,如果KB_read/s值很大,表示磁盤直接讀取操作很多,可以将讀取的資料放入記憶體中進行操作。
- 對于這兩個選項的值沒有一個固定的大小,根據系統應用的不同,會有不同的值,但是有一個規則還是可以遵循的:長期的、超大的資料讀寫,肯定是不正常的,這種情況一定會影響系統性能。
(2)利用sar評估磁盤性能
通過“sar –d”組合,可以對系統的磁盤IO做一個基本的統計。
- [root@odoodev ~]# sar -d 2 3
- Linux 3.10.0-957.10.1.el7.x86_64 (odoodev) 2020年07月23日 _x86_64_ (4 CPU)
- 15時10分27秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 15時10分29秒 dev252-0 13.50 0.00 50.50 3.74 0.00 5.93 0.11 0.15
- 15時10分29秒 dev253-0 9.00 0.00 50.50 5.61 0.08 8.89 8.89 8.00
- 15時10分29秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15時10分29秒 dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15時10分29秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 15時10分31秒 dev252-0 6.00 0.00 506.00 84.33 0.00 4.17 0.08 0.05
- 15時10分31秒 dev253-0 6.50 0.00 506.00 77.85 0.03 4.00 3.23 2.10
- 15時10分31秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15時10分31秒 dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15時10分31秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 15時10分33秒 dev252-0 1.50 0.00 25.50 17.00 0.00 5.00 0.00 0.00
- 15時10分33秒 dev253-0 1.00 0.00 25.50 25.50 0.01 7.50 7.50 0.75
- 15時10分33秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15時10分33秒 dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 平均時間: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 平均時間: dev252-0 7.00 0.00 194.00 27.71 0.00 5.36 0.10 0.07
- 平均時間: dev253-0 5.50 0.00 194.00 35.27 0.04 6.88 6.58 3.62
- 平均時間: dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 平均時間: dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- [root@odoodev ~]#
需要關注的幾個參數含義:
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
檢視TCP連接配接數:
- [root@odoodev ~]# netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}'
- LISTEN 17
- ESTABLISHED 3
- FIN_WAIT1 1
- TIME_WAIT 10
- SYN_SENT 6
- [root@odoodev ~]#
檢視連接配接數最多的ip
- [root@odoodev ~]# netstat -pant |grep ":80"|awk '{print $5}' | awk -F: '{print $1}'|sort|uniq -c|sort -nr
- 8 123.183.158.11
- 2 5.255.86.129
- 2 107.191.99.221
- 2 0.0.0.0
- 1 45.9.148.129
- 1 45.9.148.117
- [root@odoodev ~]#
三、針對問題的常用改進措施
1.為磁盤I/O調整Linux核心電梯算法
在選擇檔案系統後,有一些核心和挂載選項可能會影響到它的性能表現,其中一個核心設定是電梯算法,通過調整電梯算法,系統可以平衡低延遲需求,收集足夠的資料,以有效地組織對磁盤的讀和寫請求。
2.禁用不必要的守護程序,節省記憶體和CPU資源
每台伺服器上都運作着許多守護程序或服務,而具有諷刺意味的是,有很多通常不是必需的,這些服務沒有發揮作用,但卻消耗了寶貴的記憶體和CPU時間。此外,它們可能将伺服器置于危險境地,多運作一個服務就等于多向黑客打開一扇長驅直入的門,是以,你應該将它們從伺服器移除,禁用它們最大的好處是可以加快啟動時間,釋放記憶體。另外,你可以減少CPU需要處理的程序數,禁用它們的另一個好處是增強伺服器的安全性,因為越少的守護程序意味着可被攻擊和利用的漏洞越少。
下面是一些應該被禁用的Linux守護程序,預設情況下,它們都是自動運作的:
序号 | 守護程序 | 描述 |
---|---|---|
1 | Apmd | 進階電源管理守護程序 |
2 | Nfslock | 用于NFS檔案鎖定 |
3 | Isdn | ISDN Moderm支援 |
4 | Autofs | 在背景自動挂載檔案系統(如自動挂載CD-ROM) |
5 | Sendmail | 郵件傳輸代理 |
6 | Xfs | X Window的字型伺服器 |
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.共享記憶體的設定
系統中共享記憶體的預設值都很低,為了更好的利用伺服器資源,我們将對其進行調整,網上有一個調整的腳本。
- #!/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可以減少許多寫入周期,極大地提高固态硬碟的使用壽命。