1 簡介node
BEK內核(BigCloud Enterprise Kernel,簡稱BEK內核),是BC-Linux操做系統團隊基於社區長期支持版(LTS)內核,傾力打造的一款高性能、高穩定內核產品,知足對服務器操做系統穩定性、安全性、高性能等方面的需求,爲操做系統上層應用提供了多種功能加強和性能優化,適合部署和搭建各類企業級應用服務。BEK內核已經默認集成在BC-Linux操做系統中,用戶可根據須要選擇使用,搶鮮體驗社區高版本內核的特點功能。nginx
2 功能及優點git
BEK內核爲用戶提供內核社區最新加強功能,在文件系統、網絡、Cgroup、KVM虛擬化等子系統上增長了大量適用於容器及雲應用場景的新特性、性能優化和安全漏洞修復,目前已經發布了多個版本,包括:在2018年初,Intel CPU爆出兩個重大安全漏洞Spectre 、Meltdown,漏洞普遍影響1995年以後的處理器。Intel CPU存在設計上的缺陷,致使***者能夠讀取系統內核的內存,不受系統權限的限制。最新的BEK內核已經默認修復了這兩個嚴重的安全漏洞,可使用漏洞檢測腳本進行驗證,具體方法以下:github
下載並執行IntelCPU漏洞檢測腳本:
算法
# ./spectre-meltdown-checker.sh
使用該腳本檢測漏洞修復狀況,能夠看到Spectre(幽靈)及Meltdown(熔斷)漏洞已經獲得修復: docker
圖1 Intel CPU漏洞修復
安全
在/etc/sysctl.conf裏面添加以下設定,TCP默認使用BBR擁塞控制算法:性能優化
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
保存生效:服務器
# sysctl -p
查看確認tcp_bbr模塊能夠正確加載:微信
# lsmod | grep bbr
tcp_bbr 20480 0
經過tc命令控制網卡丟包率達到1%:
# modprobe sch_netem
# tc qdisc add dev eth0 root netem loss 1%
在客戶端經過wget測試下載速度,下載速率爲659MB/s:
# wget http://192.168.10.184/BCLinux-R7-U4-Server-x86_64-DVD-180727.iso
…
2018-08-22 16:26:16 (659 MB/s) - ‘BCLinux-R7-U4-Server-x86_64-DVD-180727.iso’ saved [4856467456/4856467456]
關閉BBR,打開默認的CUBIC機制做爲擁塞控制算法:
net.ipv4.tcp_congestion_control = cubic
net.core.default_qdisc = pfifo_fast
一樣測試wget下載速度,能夠看到下載速率降低爲175MB/s,而在BBR模式下速率爲659MB/s,因此BBR擁塞控制算法的加速效果很是明顯,在有必定丟包率的網絡鏈路上充分利用帶寬,很是適合高延遲、高帶寬的網絡鏈路:
# wget http://192.168.10.184/BCLinux-R7-U4-Server-x86_64-DVD-180727.iso
...
2018-08-22 16:24:27 (175 MB/s) - ‘BCLinux-R7-U4-Server-x86_64-DVD-180727.iso’ saved [4856467456/4856467456]
TFO(TCP Fast Open)是一種可以在TCP鏈接創建階段傳輸數據的機制,使用這種機制能夠將數據交互提早,下降應用層事務的延遲,提升兩端點之間鏈接的打開速度。BEK內核開啓該特性的基本步驟參考以下:
在/etc/sysctl.conf裏面添加以下設定:
net.ipv4.tcp_fastopen = 3
保存生效:
# sysctl -p
安裝nginx服務:
# yum install nginx
配置nginx默認開啓TCP fastopen屬性:
# cat /etc/nginx/nginx.conf | grep fastopen
listen 80 fastopen=3 reuseport default_server;
listen [::]:80 fastopen=3 reuseport default_server;
安裝最新版本的curl工具,能夠測試TCP fastopen效果:
# pushd curl
# ./buildconf
# ./configure
# make && make install
# popd
在環回接口lo抓包:
# tcpdump -i lo -s0 -w lo.pcap
經過curl測試驗證在tcp fasopen開啓的狀況下,訪問nginx主頁正常,執行以下命令兩次:
# curl --tcp-fastopen localhost
# curl --tcp-fastopen localhost
tcp fasopen的key會自動隨機生成:
# cat /proc/sys/net/ipv4/tcp_fastopen_key
7bc50abb-123fb8cf-9232816a-41e91ee6
抓包結果顯示有tcp fastopen cookie,並且第二次tcp鏈接在syn包裏會帶上get請求的數據,節省了請求包的一次來回,在數據傳輸的開始下降了延遲:
圖2 TCP Fastopen
eBPF程序能夠動態的將用戶態程序插入到內核之中,可以作到不修改程序就能夠直接監控一個正在運行的進程。BEK內核支持在Cgroup中體驗eBPF程序,下面請看一個應用示例:
# yum groupinstall "Development Tools"
# yum install go
安裝ebpf監控工具BCC[1],具體能夠參考INSTALL.md:
# git clone https://github.com/iovisor/bcc.git
# mkdir bcc/build; cd bcc/build
# cmake .. -DCMAKE_INSTALL_PREFIX=/usr
# make
# sudo make install
獲取go的bpf庫框架源碼,並將源碼恢復到支持cgroup監控的初始版本:
# go get github.com/iovisor/gobpf
# cd ~/go/src/github.com/iovisor/gobpf/
# git checkout 0da86fd81e69febe51a46ad77a464017a1b690f2
下載cgroup的ebpf測試程序[2]:
# git clone https://github.com/kinvolk/cgroup-ebpf.git
修改該測試代碼,將AttachProgram替換爲最新的AttachCgroupProgra:
$ git diff
diff --git a/main.go b/main.go
index fb4be53..1463da2 100644
--- a/main.go
+++ b/main.go
@@ -42,7 +42,7 @@ func main() {
}
for cgProg := range b.IterCgroupProgram() {
- if err := b.AttachProgram(cgProg, os.Args[2], elf.EgressType); err != nil {
+ if err := b.AttachCgroupProgram(cgProg, os.Args[2], elf.EgressType); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
編譯ebpf測試程序:
# make
參考測試樣例,新建cgroup-v2組,並將sshd進程加入該組:
# mkdir /cgroup2
# mount -t cgroup2 none /cgroup2
# mkdir -p /cgroup2/unified/demo
# echo 1832 > /cgroup2/unified/demo/cgroup.procs
最後執行測試程序`cgroup-ebpf`,能夠監控sshd進程收發包狀況:
# ./cgroup-ebpf out/ebpf.o /cgroup2/unified/demo/
BEK內核從4.14版本[3]開始默認支持Cgroup v2的線程模式,能夠建立線程子目錄,用於限制線程資源,每一個線程能夠綁定線程子目錄的cgroup組,具體配置方法可參考以下:
新建cgroup v2測試組:
# mkdir /cgroup2
# mount -t cgroup2 -o none /cgroup2/
# mkdir -p /cgroup2/unified/demo
默認狀況下,全部進程會統計在根目錄的`cgroup.procs`裏,而全部線程統計在`cgroup.threads`裏:
# cat /cgroup2/cgroup.procs | wc -l
156
# cat /cgroup2/cgroup.threads | wc -l
249
舉例說明一下,若是安裝了`docker`服務,能夠將dockerd-current的某個線程加入以前新建demo的組裏作資源限制:
# yum install docker
# systemctl start docker
...
# echo 1523 > /cgroup2/unified/demo/cgroup.procs
# echo 10936 > /cgroup2/unified/demo/cgroup.threads
BEK內核從4.19版本[4]開始能夠在cgroup v1中兼容使用v2的功能特性,例如對於cpuset組,使用方法參考以下:
首先卸載系統默認的cgroup v1的cpuset組:
# umount /sys/fs/cgroup/cpuset/
從新掛載cpuset組,增長mount選項`cpuset_v2_mode`:
# mount -t cgroup -ocpuset,nosuid,nodev,noexec,cpuset_v2_mode cgroup /sys/fs/cgroup/cpuset/
支持設定更多cgroup資源控制屬性,包括:
1. 經過配置cgroup.max.descendants設定最多子cgroup數量; 2. 經過配置cgroup.max.depth設定cgroup樹的最大深度; 3. cgroup.stat統計信息;
# cat /cgroup2/cgroup.stat
nr_descendants 2
nr_dying_descendants 0
# cat /cgroup2/cgroup.max.depth
max
# cat /cgroup2/cgroup.max.descendants
max
3 性能測試
kernel-bek默認集成使用了大量社區內核版本的功能,在研發過程當中,爲了驗證社區版內核的性能以及穩定性,咱們引入了成熟的PTS開源自動化測試框架,包括衆多CPU、網絡、磁盤、中間件應用性能測試套件,在Linux社區每次發佈主線或者長期支持版本內核時,都會基於社區版本自動化構建RPM包並進行性能測試,並且測試完成後會自動發送郵件通知,測試結果在Review以後能夠評估決定是否發佈版本:
圖3 性能對比測試
在測試過程當中,咱們也發現了很多內核的缺陷,併爲社區貢獻了多個補丁,主要包括漏洞修復、代碼改進、新特性支持等功能優化,如修復潛在的內存泄露BUG,修復KVM虛機崩潰問題,ipip6隧道支持dst_cache特性以提高性能,容器命名空間內支持tcp調優參數等,進一步提高了Linux內核的可用性及穩定性。
4 後續計劃
持續開發新特性,作好性能優化,並將補丁回饋開源社區,也積極將社區最新的成果呈現給用戶。
進一步完善操做系統及內核產品文檔,給雲上用戶以最佳的體驗。
積極參與內核開發大會,分享更多操做系統及內核知識,加強社區內核領域的合做與交流。
5 結語
BEK內核由BC-Linux操做系統團隊負責開發,歡迎有志之士加入咱們的團隊,共同參與雲上操做系統的開發,爲BEK內核「添磚加瓦」,探索實現更多的可能。簡歷可發至zhangshengju@cmss.chinamobile.com。掃碼↓加微信瞭解更多。參考文獻:
[1] https://github.com/iovisor/bcc/blob/master/INSTALL.md
[2] https://github.com/kinvolk/cgroup-ebpf
[3] https://kernelnewbies.org/Linux_4.14
[4] https://kernelnewbies.org/Linux_4.19