1 簡介
BEK內核(BigCloud Enterprise Kernel,簡稱BEK內核),是BC-Linux操作系統團隊基於社區長期支持版(LTS)內核,傾力打造的一款高性能、高穩定內核產品,滿足對服務器操作系統穩定性、安全性、高性能等方面的需求,爲操作系統上層應用提供了多種功能增強和性能優化,適合部署和搭建各種企業級應用服務。BEK內核已經默認集成在BC-Linux操作系統中,用戶可根據需要選擇使用,搶鮮體驗社區高版本內核的特色功能。
2 功能及優勢
BEK內核爲用戶提供內核社區最新增強功能,在文件系統、網絡、Cgroup、KVM虛擬化等子系統上增加了大量適用於容器及雲應用場景的新特性、性能優化和安全漏洞修復,目前已經發布了多個版本,包括:- 2017年5月,容器定製版1.0發佈,定製研發了4.9.6版本BEK內核,默認加載支持Overlay2文件系統驅動,爲Docker大幅提升了存儲IO性能;
- 2017年10月,容器定製版1.1發佈,BEK內核首次引進支持內核熱補丁技術,並增加自研補丁以支持Namespace內核參數設定,可以在容器內進行網絡調優,另外還修復了大量CVE安全漏洞;
- 2018年8月,BC-Linux 7.4發佈,定製研發了4.9.82版本BEK內核,默認修復了Intel CPU“熔斷”及”幽靈“漏洞,新增支持Google的TCP BBR擁塞控制算法,TCP Fastopen,IPv6 VXLAN等新特性;
- 2019年1月,BC-Linux 7.5發佈,定製研發了4.14.78版本BEK內核,新增支持socket“零拷貝”機制,BFQ及Kyber兩種IO調度器,virit-net默認開啓了多隊列特性,Cgroupv2支持線程模式等;
- 2019年5月,BC-Linux 7.6發佈,定製研發了4.19.25版本BEK內核,支持ARM架構,修復了Intel CPU的L1TF漏洞,基於紅黑樹管理tcp重傳隊列,qdisc支持CAKE隊列管理算法,xfs文件系統支持lazytime特性,並增加自研補丁支持容器Namespace內tcp_fastopen調優參數。
2.1 默認修復Intel CPU漏洞
在2018年初,Intel CPU爆出兩個重大安全漏洞Spectre 、Meltdown,漏洞廣泛影響1995年之後的處理器。Intel CPU存在設計上的缺陷,導致***者可以讀取系統內核的內存,不受系統權限的限制。最新的BEK內核已經默認修復了這兩個嚴重的安全漏洞,可以使用漏洞檢測腳本進行驗證,具體方法如下:
下載並執行IntelCPU漏洞檢測腳本:
# ./spectre-meltdown-checker.sh
使用該腳本檢測漏洞修復情況,可以看到Spectre(幽靈)及Meltdown(熔斷)漏洞已經得到修復:
圖1 Intel CPU漏洞修復
2.2 BBR擁塞控制
在/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]
2.3 TCP Fastopen特性
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
2.4 Cgroup默認支持eBPF程序
eBPF程序可以動態的將用戶態程序插入到內核之中,能夠做到不修改程序就可以直接監控一個正在運行的進程。BEK內核支持在Cgroup中體驗eBPF程序,下面請看一個應用示例:
- 安裝go語言環境,源碼安裝或者利用yum源安裝go的RPM包:
# 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/
2.5 Cgroup v2線程模式
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
2.6 其他Cgroup v2新增特性
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內核“添磚加瓦”,探索實現更多的可能。簡歷可發至[email protected]。掃碼↓加微信瞭解更多。參考文獻:
[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