性能調(diào)優(yōu)是個大而復(fù)雜的系統(tǒng)性問題,涉及Linux系統(tǒng)(進程管理,文件系統(tǒng),磁盤系統(tǒng),網(wǎng)絡(luò)IO處理等),內(nèi)核參數(shù)調(diào)優(yōu),常見檢測及配置工具的使用等等。在目前針對云和虛擬化的基礎(chǔ)設(shè)施的性能評價體系,我們可以可以分別從CPU,內(nèi)存,存儲,網(wǎng)絡(luò)以及內(nèi)核參數(shù)幾個方面來查看性能調(diào)優(yōu)的具體實現(xiàn)和方法論。
在這之前,我們有必要了解一下相應(yīng)的檢測及配置工具,如下圖:

內(nèi)核參數(shù)
TBD
CPU
我們先看看如何查看sysvinit或者systemd的服務(wù)
查看sysvinit運行的服務(wù),其中+代表開啟,-代表關(guān)閉:
# service --status-all
[ + ]? acpid
[ + ]? apache-htcacheclean
[ + ]? apache2
[ + ]? apparmor
[ + ]? apport
[ + ]? atd
[ + ]? binfmt-support
[ - ]? bootmisc.sh
[ - ]? cgroupfs-mount
[ - ]? checkfs.sh
[ - ]? checkroot-bootclean.sh
[ - ]? checkroot.sh
...
查看啟動的系統(tǒng)守護進程,這里有一個工具叫做chkservice,執(zhí)行后的界面如下:

安裝步驟如下:
# sudo add-apt-repository ppa:linuxenko/chkservice
# sudo apt-get update
# sudo apt-get install chkservice
查看啟動的systemd服務(wù):
# systemctl
查看裝載的服務(wù)類型單元(服務(wù)即名稱為.service)
# systemctl list-units --type service
UNIT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LOAD? ACTIVE SUB? ? DESCRIPTION
acpid.service? ? ? ? ? ? ? ? ? ? ? loaded active running ACPI event daemon
apparmor.service? ? ? ? ? ? ? ? ? loaded active exited? LSB: AppArmor initialization
apport.service? ? ? ? ? ? ? ? ? ? loaded active exited? LSB: automatic crash report generation
...
查看已安裝的服務(wù)類型單元文件(服務(wù)類別)
# systemctl list-unit-files --type service
UNIT FILE STATE
accounts-daemon.service? ? ? ? ? ? ? ? ? ? enabled
acpid.service? ? ? ? ? ? ? ? ? ? ? ? ? ? ? disabled
apport-forward@.service? ? ? ? ? ? ? ? ? ? static
apt-daily-upgrade.service? ? ? ? ? ? ? ? ? static
systemd-cgtop?按照資源使用率(CPU,內(nèi)存,磁盤吞吐率)從高到低的順序顯示系統(tǒng)中的控制組(Control Group)。類似top的一個命令,每秒刷新
# systemd-cgtop?
Control Group?????????????????????????????????????????????????????????????????????????????????????????????????????????Tasks?? %CPU?? Memory?Input/s Output/s
/?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????-?? 13.1???? 1.7G???????-??????? -
/kubepods????????????????????????????????????????????????????????????????????????????????????????????????????????????????96??? 9.2??996.9M??????? -??????? -
/kubepods/burstable??????????????????????????????????????????????????????????????????????????????????????????????????????38??? 7.2?? 493.8M???????-??????? -
/kubepods/burstable/pod4685929b3a965eb93b397eb2e4262428??????????????????????????????????????????????????????????????????13??? 3.3?? 341.4M???????-??????
...
以下是基本的方法論:
1. 對業(yè)務(wù)做CPU核綁定,針對OpenStack中的虛機,我們需要版本的支持
2. 分配大頁內(nèi)存減少TLB不命中的概率
3. TBD
內(nèi)存
TBD
存儲
對于存儲尤其是遠程訪問的存儲節(jié)點,一些基本的要素需要保證:
1. host上專有的物理網(wǎng)卡(如10G);
2. 隔離的網(wǎng)絡(luò);
3. 較大的MTU;
4. 高性能磁盤(SSD,SAS);
5. 大的內(nèi)存;
說存儲有必要提一下LVM,一個磁盤卷的管理工具,里面幾個概念通過一張圖來了解一下。可以看到P指的是物理意義,V指的是虛擬或者邏輯意義,通過LVM實現(xiàn)對物理磁盤的邏輯劃分和分組。


網(wǎng)絡(luò)
針對DPDK對網(wǎng)絡(luò)IO性能的提升,以下是基本的方法論:
1. 更新DPDK驅(qū)動(uio-pci-generic ----> vfio-pci);
2. vSwitch微調(diào), 如NIC卡的mbuf分配;
針對TCP協(xié)議棧的性能調(diào)優(yōu),重點在于眾多TCP參數(shù)的理解和配合。
查看默認TCP分配內(nèi)存,其值是根據(jù)當(dāng)前系統(tǒng)內(nèi)存大小動態(tài)生成的一個值,其中顯示的三個值分別是最小值,初始值和最大值。
在128G內(nèi)存的設(shè)備上:
# cat /proc/sys/net/ipv4/tcp_mem
1347279 1796375 2694558
在32G內(nèi)存的設(shè)備上:
# cat /proc/sys/net/ipv4/tcp_mem
384375? 512503? 768750
查看用來socket所使用接收緩沖區(qū)大小,固定值為208K
# cat /proc/sys/net/core/rmem_default
212992
查看socket所使用接收緩沖區(qū)最大值,理論不小于default值
# cat /proc/sys/net/core/rmem_max
212992
查看用來socket所使用發(fā)送緩沖區(qū)大小,固定值為208K
# cat /proc/sys/net/core/wmem_default
212992
查看socket所使用發(fā)送緩沖區(qū)最大值,理論不小于default值
# cat /proc/sys/net/core/wmem_max
212992
The maximum amount of option memory buffers:
每個socket可用的最大緩沖區(qū)大小。默認20K
# cat /proc/sys/net/core/optmem_max
20480
針對以上的默認值,可以將值做如下調(diào)整,僅供參考:
# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf
使能RFC1323定義的window scaling,要支持超過64KB的TCP窗口,必須啟用該值(1表示啟用),TCP窗口最大至1GB,TCP連接雙方都啟用時才生效。
# echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf
使能RFC1323定義的timestamps
# echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf
啟用有選擇的應(yīng)答(1表示啟用),通過有選擇地應(yīng)答亂序接收到的報文來提高性能,讓發(fā)送者只發(fā)送丟失的報文段,(對于廣域網(wǎng)通信來說)這個選項應(yīng)該啟用,但是會增加對CPU的占用。
# echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf
當(dāng)連接關(guān)閉的時候,TCP 默認緩存了很多連接指標(biāo)在 route cache 中,以至于在不久的將來,連接建立的時候,可以用這些值來設(shè)置初始化條件。通常,這提升了整體的性能,但是,有時候會引起性能下降,如果設(shè)置的話,TCP 在關(guān)閉的時候不緩存這些指標(biāo)。
# echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf
設(shè)置在入方向上可入隊列的最大報文數(shù),當(dāng)端口接收報文的速率大于內(nèi)存處理速率時,微調(diào)該選項可以緩解CPU負荷
# echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
重新載入新的設(shè)置
# sysctl -p
寫入/etc/sysctl.conf是保證重啟配置不會消失,如果僅做臨時的操作調(diào)優(yōu),可以用sysctl來實現(xiàn)配置的查看和修改,如下:
# sysctl kernel.shmmax
# sysctl -w kernel.shmmax=xx