Linux雲端計算架構-系統調優【CPU、IO、網路、核心引數調優】

熊博主發表於2020-11-09

Linux雲端計算架構-系統調優【CPU、IO、網路、核心引數調優】

1. CPU調優

①程式優先順序調整:使用top命令檢視優先順序,NI列表示優先順序。優先順序範圍從高到低為[-20,19],預設是0。NI即nice,可以看作老好人,值越大,說明比較好人,佔用cpu的時間就越少,優先順序就越低。 提高優先順序,降低數值大小;降低優先順序,提高數值大小;
在這裡插入圖片描述

②設定程式的cpu親和力:在多核cpu的情況下,某一程式的執行會在多個cpu核心上切換,cpu上下文切換會帶來額外的開銷。設定程式的cpu親和力,即將程式繫結到某個指定的cpu核心上,不進行cpu上下文切換。

cpu上下文切換:每個程式在使用某個cpu核心時,會把所需的資料先寫入到cpu的快取(暫存器)中,然後cpu再根據快取中的資料進行運算。cpu上下文切換即是指cpu暫存器中資料的寫入和讀出。

# 使用xshell開啟兩個終端做測試
# 一個終端開啟檔案a.txt,生成一個程式
[root@monitor ~]# vim a.txt
# 另一個終端檢視程式佔用資源情況
[root@monitor ~]# ps aux | grep a.txt
root      10672  0.1  0.2 151808  5388 pts/1    S+   19:18   0:00 vim a.txt
root      10720  0.0  0.0 112724   996 pts/2    S+   19:18   0:00 grep --color=auto a.txt
# 可以看到程式10672在8個cpu核心上都可以執行
[root@monitor ~]# rpm -qf `which taskset`
util-linux-2.23.2-59.el7.x86_64
[root@monitor ~]# taskset -cp 10672
pid 10672's current affinity list: 0-7

# 指定cpu核心執行程式
[root@monitor ~]# taskset -c 1,3 vim b.txt
[root@monitor ~]# ps aux | grep b.txt
root      10799  0.0  0.2 151808  5388 pts/2    S+   19:25   0:00 vim b.txt
root      10801  0.0  0.0 112724  1000 pts/1    S+   19:25   0:00 grep --color=auto b.txt
[root@monitor ~]# taskset -cp 10799
pid 10799's current affinity list: 1,3

③使用vmstat檢視系統瓶頸

# 檢視系統整體情況,在機器執行較慢時不建議使用top檢視,建議使用vmstat檢視
[root@monitor ~]# vmstat 
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   8456 384712     36 744960    0    0    37    18   29   32  0  0 99  0  0
==程式====================
r 執行狀態的程式個數。展示了正在執行和等待cpu資源的任務個數。當這個值長期大於cpu核心數的3倍,就會出現cpu瓶頸。
b 不可中斷睡眠、正在進行IO等待、阻塞狀態的程式個數
==記憶體====================
swpd 使用交換(虛擬)記憶體的大小,值越大,說明實體記憶體遇到瓶頸,比較緊張。值大於0,只能說使用了虛擬記憶體,不代表實體記憶體使用緊張。
free 空閒的實體記憶體大小,單位kb
buff 記憶體從磁碟讀出的內容【磁碟到記憶體】
cache 記憶體要寫入磁碟的內容【記憶體到磁碟】值越大,說明在cache的檔案越多,當頻繁訪問cache中的檔案時,磁碟的讀寫IO會很小,即基本沒有對磁碟進行讀寫,只在記憶體中進行讀寫。
==交換記憶體================
si swapin換入記憶體【磁碟到虛擬記憶體】值大於0,表示實體記憶體不夠用或記憶體洩漏了。
so swapout換出記憶體【虛擬記憶體到磁碟】值大於0,表示實體記憶體不夠用或記憶體洩漏了。
# si和so在記憶體足夠時值為0,當free值很小時,要看si和so的值是否是0,若是0,則系統效能不會因為free小而受影響。
==IO=====================
bi blockin 從硬碟往記憶體讀的大小
bo blockout 從記憶體往硬碟寫的大小
==system系統==============
in 每秒中斷次數,包括時鐘中斷
cs 每秒上下文切換次數,cpu排程次數越多,cs越大。該值越小越好。
us 系統使用者程式使用百分比
sy 核心中的程式佔用百分比,當sy值較高時,要檢查原因,是不良表現。
id 空閒的cpu百分比
wa cpu等待I/O完成的時間,值越大,說明IO等待比較嚴重,機器IO效能就越差。
st 虛擬機器佔用cpu的時間,也稱作虛擬機器偷取實體記憶體的時間。

在這裡插入圖片描述

資料解讀:
1、r列程式數為0或1,說明當前系統執行的程式較少。8核心cpu,r的值大於24才認為cpu繁忙。
2、free值為381880KB,大約372MB,記憶體較少但還是夠用的。
3、swap交換記憶體資料si和so都是0,說明沒有使用到交換記憶體。即實體記憶體還是夠用的。若實體記憶體不夠了,要加記憶體。
4、IO資料,若bi大,則說明從硬碟讀出到記憶體的資料比較大。若bo大,則說明從記憶體寫入到硬碟的資料比較大。
5、us值越小,id值越大說明系統效能較好,毫無壓力。
6、wa值越大,說明cpu等待IO完成的時間比較長,即機器IO效能較差。

其他說明:
1、當系統處於高併發訪問時,會消耗cpu,即正在執行的程式數一般會大於3倍cpu核心數。若此時wa值為0,即不存在因IO效能問題佔用cpu的時候,故可以認為此時一直都在消耗cpu。可以通過ps或top命令檢視程式使用cpu的情況。

2. IO調優

①限制使用者執行的最大程式數和單個程式能開啟的最大檔案數:

# 檢視最多可以開啟的檔案數
[root@master ~]# ulimit -n
1024

# 臨時生效
[root@master ~]# ulimit -n 102400
[root@master ~]# ulimit -n
102400

# 修改使用者執行的最大程式數和單個程式開啟的最大檔案數,重新開啟新的終端即可生效。
# *為萬用字元,指所有使用者。
[root@master ~]# vim /etc/security/limits.conf
* soft noproc 102400
* hard noproc 102400
* soft nofile 102400
* hard nofile 102400

# 限制使用者執行的最大程式數,功能同上。
[root@monitor ~]# cat /etc/security/limits.d/20-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited

②檢視所有的資源限制資訊

[root@monitor ~]# ulimit -a
core file size          (blocks, -c) 0    # kdump轉儲功能開啟後產生的core file大小限制
data seg size           (kbytes, -d) unlimited   # 資料段大小限制
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited   # 檔案大小限制
pending signals                 (-i) 7144
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 102400      # 單個程式可開啟的檔案個數限制
pipe size            (512 bytes, -p) 8    # 管道大小的限制
POSIX message queues     (bytes, -q) 819200    # 訊息佇列大小
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192    # 棧大小
cpu time               (seconds, -t) unlimited   # cpu時間使用限制
max user processes              (-u) 7144        # 最大的使用者程式數限制
virtual memory          (kbytes, -v) unlimited   # 虛擬記憶體限制
file locks                      (-x) unlimited

在這裡插入圖片描述

③測試硬碟的讀寫速度

=============================讀速度測試===============================================
# 硬碟讀速度測試工具
[root@monitor ~]# rpm -qf `which hdparm`
hdparm-9.43-5.el7.x86_64

# 3s從硬碟中讀取資料3118MB,平均讀取速度為1039.24MB
[root@monitor ~]# hdparm -t --direct /dev/sda

/dev/sda:
 Timing O_DIRECT disk reads: 3118 MB in  3.00 seconds = 1039.24 MB/sec
============================寫速度測試=================================================
# 使用dd命令建立一個檔案,測試寫速度。
[root@monitor ~]# dd if=/dev/zero of=test.dbf bs=1M count=1000 oflag=direct,nonblock
記錄了1000+0 的讀入
記錄了1000+0 的寫出
1048576000位元組(1.0 GB)已複製,1.28078 秒,819 MB/秒
oflag=direct  讀寫資料直接採用IO方式,即直接從記憶體寫入硬碟中,不走快取。
nonblock      讀寫資料採用非阻塞IP方式,繞開快取,測試寫更準確。

# 在生產環境,建議使用hdparm命令測試硬碟讀速度,使用dd命令測試寫速度。

============================計算命令執行時間=============================================
[root@monitor ~]# time dd if=/dev/zero of=test.dbf bs=1M count=1000 oflag=direct,nonblock
記錄了1000+0 的讀入
記錄了1000+0 的寫出
1048576000位元組(1.0 GB)已複製,1.79318 秒,585 MB/秒

real	0m1.797s    # 實際時間>cpu時間=使用者cpu時間+系統cpu時間
user	0m0.001s    # 使用者cpu時間
sys	0m1.466s        # 系統cpu時間

3. 網路調優

網路卡繫結(bonding)技術:網路卡繫結,也稱為網路卡捆綁。是將多塊物理網路卡虛擬成一塊網路卡,以提供負載均衡網路冗餘

3.1 網路冗餘(主備模式)

①配置兩張網路卡,都為橋接模式。IP地址分別為:192.168.8.134192.168.8.133
在這裡插入圖片描述
②配置bond0虛擬網路卡裝置,首先應該移除原來的網路卡配置檔案。
在這裡插入圖片描述
③修改bond0網路卡配置檔案:
在這裡插入圖片描述
④繫結網路卡ens32和網路卡ens34bond0

[root@master ~]# nmcli connection add type bond-slave ifname ens32 master bond0 
連線“bond-slave-ens32-1”(68baaf69-7088-4491-9c4a-d275b3e67eda) 已成功新增。
[root@master ~]# nmcli connection add type bond-slave ifname ens34 master bond0 
連線“bond-slave-ens34-1”(6babfeba-6eeb-4795-8da9-2357efc3b775) 已成功新增。
[root@master ~]# ll /etc/sysconfig/network-scripts/ifcfg-*
-rw-r--r--. 1 root root 418 11月  9 21:13 /etc/sysconfig/network-scripts/ifcfg-bond0
-rw-r--r--. 1 root root 127 11月  9 21:13 /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens32-1
-rw-r--r--. 1 root root 127 11月  9 21:13 /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens34-1
-rw-r--r--. 1 root root 254 8月  24 2018 /etc/sysconfig/network-scripts/ifcfg-lo

⑤重啟網路,檢視bond0的狀態:

[root@master ~]# systemctl restart network
# 檢視當前已啟用的網路介面
[root@master ~]# nmcli connection show --active
NAME                UUID                                  TYPE      DEVICE 
bond0               6f518bf7-4fcc-44ab-8cf6-77cd1a1cd3c9  bond      bond0  
bond-slave-ens32-1  68baaf69-7088-4491-9c4a-d275b3e67eda  ethernet  ens32  
bond-slave-ens34-1  6babfeba-6eeb-4795-8da9-2357efc3b775  ethernet  ens34  
virbr0              a6da33ae-d4f3-4c30-81a0-cf12820e46a9  bridge    virbr0 
# 檢視bond0的執行狀態
[root@master ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)    # bonding模式,這裡是主備模式
Primary Slave: ens32 (primary_reselect always)
Currently Active Slave: ens32   # 當前使用的網路卡是ens32
MII Status: up   # 連線狀態
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens32  # 繫結在bond0的網路卡ens32
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:ec
Slave queue ID: 0

Slave Interface: ens34  # 繫結在bond0的網路卡ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:f6
Slave queue ID: 0

⑥測試bond0主備模式的高可用:
模擬故障,斷開ens32的網路連線:
在這裡插入圖片描述

[root@master ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: ens32 (primary_reselect always)
Currently Active Slave: ens34    # 可以看到當前使用的網路卡為ens34
MII Status: up    # 連線狀態正常
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens32
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1    # 連線失敗數:1
Permanent HW addr: 00:0c:29:d2:f7:ec
Slave queue ID: 0

Slave Interface: ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:f6
Slave queue ID: 0

重新連線ens32網路卡,然後重啟網路服務:
在這裡插入圖片描述

[root@monitor ~]# systemctl restart network   # 在虛擬機器上重啟網路服務,否則在ens32重連之後,是無法使用xshell連線上的。
[root@master ~]# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: ens32 (primary_reselect always)
Currently Active Slave: ens32  # 可以看到,正在使用的又變成了ens32
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens32
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:ec
Slave queue ID: 0

Slave Interface: ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:f6
Slave queue ID: 0

總結下:bondind繫結技術實現網路卡的主備模式高可用,當一塊網路卡損壞時,會由另一塊備用網路卡頂替,保證服務不中斷。但存在一個不人性化的問題,若修復了損壞的網路卡裝置,要讓該網路卡重新繫結到bond0上,需要在虛擬機器上重啟網路服務,否則使用xshell是無法連線上的。

3.2 負載均衡模式

①配置負載均衡模式的bond0:

# 在刪除所有的網路卡配置檔案後,建立bond0網路卡裝置
[root@master ~]# nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode balance-rr ip4 192.168.8.133/24
[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0
BONDING_OPTS="miimon=100 mode=balance-rr"
TYPE=Bond
BONDING_MASTER=yes
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.8.133
PREFIX=24
GATEWAY=192.168.8.1  # 加進去
DNS1=8.8.8.8   # 加進去
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=bond0
UUID=828d6d72-523b-4b51-b738-8116ab14261b
DEVICE=bond0
ONBOOT=yes

②繫結網路卡ens32和網路卡ens34bond0

[root@master ~]# nmcli connection add type bond-slave ifname ens32 master bond0 
連線“bond-slave-ens32”(59da2797-6c13-4e19-b00c-c2add67a526c) 已成功新增。
[root@master ~]# nmcli connection add type bond-slave ifname ens34 master bond0 
連線“bond-slave-ens34”(5495ea02-e9fb-40f1-969f-a7be6e77fffb) 已成功新增。
[root@master ~]# ll /etc/sysconfig/network-scripts/ifcfg-bond*
-rw-r--r--. 1 root root 401 11月  9 21:54 /etc/sysconfig/network-scripts/ifcfg-bond0
-rw-r--r--. 1 root root 125 11月  9 21:58 /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens32
-rw-r--r--. 1 root root 125 11月  9 21:59 /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens34
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens32
TYPE=Ethernet
NAME=bond-slave-ens32
UUID=59da2797-6c13-4e19-b00c-c2add67a526c
DEVICE=ens32
ONBOOT=yes
MASTER=bond0
SLAVE=yes
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens34
TYPE=Ethernet
NAME=bond-slave-ens34
UUID=5495ea02-e9fb-40f1-969f-a7be6e77fffb
DEVICE=ens34
ONBOOT=yes
MASTER=bond0
SLAVE=yes

③重啟網路,檢視bond0的狀態:

[root@master ~]# systemctl restart network
[root@master ~]# nmcli connection show --active 
NAME              UUID                                  TYPE      DEVICE 
bond0             828d6d72-523b-4b51-b738-8116ab14261b  bond      bond0  
bond-slave-ens32  59da2797-6c13-4e19-b00c-c2add67a526c  ethernet  ens32  
bond-slave-ens34  5495ea02-e9fb-40f1-969f-a7be6e77fffb  ethernet  ens34  
virbr0            a6da33ae-d4f3-4c30-81a0-cf12820e46a9  bridge    virbr0 
[root@master ~]# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: load balancing (round-robin)   # 負載均衡,輪詢
MII Status: up  # 連線狀態
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens32   # 繫結在bond0的網路卡ens32
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:ec
Slave queue ID: 0

Slave Interface: ens34  # 繫結在bond0的網路卡ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:f6
Slave queue ID: 0

④測試bonding負載均衡:

[root@master ~]# watch cat /proc/net/dev
可以看到ens32和ens34都在使用。

在這裡插入圖片描述

4. 核心引數調優

預防以及解決DDOS洪水攻擊

# 修改/etc/sysctl.conf配置檔案為以下引數,可有效預防DDOS洪水攻擊。在伺服器上線之前,都應該配置如下核心引數。
[root@monitor ~]# vim /etc/sysctl.conf 
net.ipv4.tcp_synack_retries = 0   # 當傳送SYN+ACK握手包給客戶端時,若收不到客戶端傳送的ACK確認,服務端則不重發SYN+ACK握手包,加快半連線的回收,不耗光資源。預設為重發5次,每次等待30-40s,即半連線狀態會保持180s左右才會斷開連線。
net.ipv4.tcp_syn_retries = 1      # 客戶端重發SYN握手包的次數
net.ipv4.tcp_max_syn_backlog = 20480  # 半連線佇列長度
net.ipv4.tcp_syncookies = 0   # 關閉當出現半連線溢位時,向對方傳送syncookies的功能 ,1為開啟,在外網環境不要開啟。  
net.ipv4.tcp_tw_reuse = 0   # 關閉TIME_WAIT狀態的連線重用功能,1為開啟,在外網環境不要開啟。 
net.ipv4.tcp_tw_recycle = 0  # 關閉TIME_WAIT狀態的連線回收功能,1為開啟,在外網環境不要開啟。 
net.ipv4.tcp_fin_timeout = 10    # TCP保持在FIN_WAIT_2狀態的時間
fs.file-max = 819200    # 系統允許的檔案控制程式碼的最大數目,因為連線需要佔用檔案控制程式碼
net.core.somaxconn = 65535   # 用來應對突發的大併發connect 請求
net.core.rmem_max = 1024123000  # 最大的TCP 資料接收緩衝(位元組)
net.core.wmem_max = 16777216    # 最大的 TCP 資料傳送緩衝(位元組)
net.core.netdev_max_backlog = 165536   # 網路裝置接收資料包的速率比核心處理資料包的速率快時,允許送到佇列的資料包的最大數目
net.ipv4.ip_local_port_range = 10000 65535   # 本機主動連線其他主機時的埠分配範圍

================================================================================================
# 具體核心引數檔案:
[root@master ~]# cd /proc/sys/
[root@master sys]# ll
總用量 0
dr-xr-xr-x. 1 root root 0 11月  9 22:51 abi
dr-xr-xr-x. 1 root root 0 11月  9 20:26 crypto
dr-xr-xr-x. 1 root root 0 11月  9 22:51 debug
dr-xr-xr-x. 1 root root 0 11月  9 22:51 dev
dr-xr-xr-x. 1 root root 0 11月  9 20:26 fs
dr-xr-xr-x. 1 root root 0 11月  9 20:26 kernel
dr-xr-xr-x. 1 root root 0 11月  9 20:26 net
dr-xr-xr-x. 1 root root 0 11月  9 22:51 sunrpc
dr-xr-xr-x. 1 root root 0 11月  9 22:51 user
dr-xr-xr-x. 1 root root 0 11月  9 20:26 vm

# 檢視net.ipv4.ip_local_port_range的值:
[root@master sys]# cat ./net/ipv4/ip_local_port_range
32768	60999

相關文章