【大雲製造】爲雲而生 - 大雲BEK內核

圖片


1 簡介

BEK內核(BigCloud Enterprise Kernel,簡稱BEK內核),是BC-Linux操作系統團隊基於社區長期支持版(LTS)內核,傾力打造的一款高性能、高穩定內核產品,滿足對服務器操作系統穩定性、安全性、高性能等方面的需求,爲操作系統上層應用提供了多種功能增強和性能優化,適合部署和搭建各種企業級應用服務。BEK內核已經默認集成在BC-Linux操作系統中,用戶可根據需要選擇使用,搶鮮體驗社區高版本內核的特色功能。


2 功能及優勢

BEK內核爲用戶提供內核社區最新增強功能,在文件系統、網絡、CgroupKVM虛擬化等子系統上增加了大量適用於容器及雲應用場景的新特性、性能優化和安全漏洞修復,目前已經發布了多個版本,包括:
  1. 20175月,容器定製版1.0發佈,定製研發了4.9.6版本BEK內核,默認加載支持Overlay2文件系統驅動,爲Docker大幅提升了存儲IO性能;
  2. 201710月,容器定製版1.1發佈,BEK內核首次引進支持內核熱補丁技術,並增加自研補丁以支持Namespace內核參數設定,可以在容器內進行網絡調優,另外還修復了大量CVE安全漏洞;
  3. 20188月,BC-Linux 7.4發佈,定製研發了4.9.82版本BEK內核,默認修復了Intel CPU“熔斷幽靈漏洞,新增支持GoogleTCP BBR擁塞控制算法,TCP FastopenIPv6 VXLAN等新特性;
  4. 20191月,BC-Linux 7.5發佈,定製研發了4.14.78版本BEK內核,新增支持socket“零拷貝機制,BFQKyber兩種IO調度器,virit-net默認開啓了多隊列特性,Cgroupv2支持線程模式等;
  5. 20195月,BC-Linux 7.6發佈,定製研發了4.19.25版本BEK內核,支持ARM架構,修復了Intel CPUL1TF漏洞,基於紅黑樹管理tcp重傳隊列,qdisc支持CAKE隊列管理算法,xfs文件系統支持lazytime特性,並增加自研補丁支持容器Namespacetcp_fastopen調優參數。
下面主要針對以上提到BEK內核新增的關鍵特性做一下簡要的概述:

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擁塞控制


BBRGoogle2016年提出的一種擁塞控制算法,在BEK內核4.9及以後的版本中已默認添加該算法。從 Google 的報告來看,這一新的算法可以明顯降低網絡延遲,充分利用網絡帶寬,具體開啓方法參考如下:
  • /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特性

TFOTCP 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






性能測試

kernel-bek默認集成使用了大量社區內核版本的功能,在研發過程中,爲了驗證社區版內核的性能以及穩定性,我們引入了成熟的PTS開源自動化測試框架,包括衆多CPU、網絡、磁盤、中間件應用性能測試套件,在Linux社區每次發佈主線或者長期支持版本內核時,都會基於社區版本自動化構建RPM包並進行性能測試,而且測試完成後會自動發送郵件通知,測試結果在Review之後可以評估決定是否發佈版本:

image.png

圖3 性能對比測試

在測試過程中,我們也發現了不少內核的缺陷,併爲社區貢獻了多個補丁,主要包括漏洞修復、代碼改進、新特性支持等功能優化,如修復潛在的內存泄露BUG,修復KVM虛機崩潰問題,ipip6隧道支持dst_cache特性以提升性能,容器命名空間內支持tcp調優參數等,進一步提升了Linux內核的可用性及穩定性。


4 後續計劃

  • 持續開發新特性,做好性能優化,並將補丁回饋開源社區,也積極將社區最新的成果呈現給用戶。

  • 進一步完善操作系統及內核產品文檔,給雲上用戶以最佳的體驗。

  • 積極參與內核開發大會,分享更多操作系統及內核知識,增強社區內核領域的合作與交流。

5 結語

BEK內核由BC-Linux操作系統團隊負責開發,歡迎有志之士加入我們的團隊,共同參與雲上操作系統的開發,爲BEK內核添磚加瓦,探索實現更多的可能。簡歷可發至[email protected]。掃碼加微信瞭解更多。 

image.png



參考文獻:

[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


image.png




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章