Linux雲端計算架構-系統調優【CPU、IO、網路、核心引數調優】
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.134
和192.168.8.133
。
②配置bond0
虛擬網路卡裝置,首先應該移除原來的網路卡配置檔案。
③修改bond0網路卡配置檔案:
④繫結網路卡ens32
和網路卡ens34
到bond0
:
[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
和網路卡ens34
到bond0
:
[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
相關文章
- Linux核心引數調優Linux
- Linux系統優化部分核心引數調優中文註釋Linux優化
- linux系統引數調優全解析Linux
- Linux核心調優部分引數說明Linux
- swoole優化核心引數調整優化
- linux 效能調優引數Linux
- 調優引數
- Linux常用的一些核心引數(調優)Linux
- Linux優化之IO子系統監控與調優Linux優化
- 數倉調優實戰:GUC引數調優
- 淺談JVM整體架構與調優引數JVM架構
- Linux系統調優Linux
- mysql 引數調優MySql
- 大資料叢集核心引數調優大資料
- 效能調優(cpu/IO/JVM記憶體分析)JVM記憶體
- JVM 引數調優(qbit)JVM
- 1,Spark引數調優Spark
- JVM常用調優引數JVM
- Hadoop引數調優Hadoop
- 【sql調優】系統資訊統計SQL
- Linux系統調優介紹Linux
- Linux系統效能調優技巧Linux
- 大資料學習—Kafka的核心調優引數大資料Kafka
- irace package -- 引數調優神器Package
- hadoop之 引數調優Hadoop
- 【深度學習篇】--神經網路中的調優一,超引數調優和Early_Stopping深度學習神經網路
- Hadoop作業調優引數Hadoop
- MySQL引數調優最佳實踐MySql
- Oracle記憶體引數調優Oracle記憶體
- 雲端計算分散式平行計算:系統架構分散式架構
- Linux核心引數以及Oracle引數調整(updated)LinuxOracle
- 馬司系統調優
- Linux系統效能調優之效能分析Linux
- 系統效能調優:提升 CPU 快取的命中率快取
- HBase 核心元件協調及RegionServer JVM引數調優-OLAP商業環境實戰元件ServerJVM
- nginx引數調優能提升多少效能Nginx
- RDS MySQL引數調優最佳實踐MySql
- Linux 核心引數優化(for oracle)Linux優化Oracle