【大云制造】为云而生 - 大云BEK内核

【大云制造】为云而生 - 大云BEK内核


1 简介

BEK内核(BigCloud Enterprise Kernel,简称BEK内核),是BC-Linux操作系统团队基于社区长期支持版(LTS)内核,倾力打造的一款高性能、高稳定内核产品,满足对服务器操作系统稳定性、安全性、高性能等方面的需求,为操作系统上层应用提供了多种功能增强和性能优化,适合部署和搭建各种企业级应用服务。BEK内核已经默认集成在BC-Linux操作系统中,用户可根据需要选择使用,抢鲜体验社区高版本内核的特色功能。


2 功能及优势

BEK内核为用户提供内核社区最新增强功能,在文件系统、网络、Cgroup、KVM虚拟化等子系统上增加了大量适用于容器及云应用场景的新特性、性能优化和安全漏洞修复,目前已经发布了多个版本,包括:
  1. 2017年5月,容器定制版1.0发布,定制研发了4.9.6版本BEK内核,默认加载支持Overlay2文件系统驱动,为Docker大幅提升了存储IO性能;
  2. 2017年10月,容器定制版1.1发布,BEK内核首次引进支持内核热补丁技术,并增加自研补丁以支持Namespace内核参数设定,可以在容器内进行网络调优,另外还修复了大量CVE安全漏洞;
  3. 2018年8月,BC-Linux 7.4发布,定制研发了4.9.82版本BEK内核,默认修复了Intel CPU“熔断”及”幽灵“漏洞,新增支持Google的TCP BBR拥塞控制算法,TCP Fastopen,IPv6 VXLAN等新特性;
  4. 2019年1月,BC-Linux 7.5发布,定制研发了4.14.78版本BEK内核,新增支持socket“零拷贝”机制,BFQ及Kyber两种IO调度器,virit-net默认开启了多队列特性,Cgroupv2支持线程模式等;
  5. 2019年5月,BC-Linux 7.6发布,定制研发了4.19.25版本BEK内核,支持ARM架构,修复了Intel CPU的L1TF漏洞,基于红黑树管理tcp重传队列,qdisc支持CAKE队列管理算法,xfs文件系统支持lazytime特性,并增加自研补丁支持容器Namespace内tcp_fastopen调优参数。
下面主要针对以上提到BEK内核新增的关键特性做一下简要的概述:

2.1 默认修复Intel CPU漏洞

在2018年初,Intel CPU爆出两个重大安全漏洞Spectre 、Meltdown,漏洞广泛影响1995年之后的处理器。Intel CPU存在设计上的缺陷,导致***者可以读取系统内核的内存,不受系统权限的限制。最新的BEK内核已经默认修复了这两个严重的安全漏洞,可以使用漏洞检测脚本进行验证,具体方法如下:

  • 下载并执行IntelCPU漏洞检测脚本:

# ./spectre-meltdown-checker.sh
  • 使用该脚本检测漏洞修复情况,可以看到Spectre(幽灵)及Meltdown(熔断)漏洞已经得到修复: 

【大云制造】为云而生 - 大云BEK内核

图1 Intel CPU漏洞修复

2.2 BBR拥塞控制


BBR是Google在2016年提出的一种拥塞控制算法,在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特性

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请求的数据,节省了请求包的一次来回,在数据传输的开始降低了延迟:

【大云制造】为云而生 - 大云BEK内核

图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之后可以评估决定是否发布版本:

【大云制造】为云而生 - 大云BEK内核

图3 性能对比测试

在测试过程中,我们也发现了不少内核的缺陷,并为社区贡献了多个补丁,主要包括漏洞修复、代码改进、新特性支持等功能优化,如修复潜在的内存泄露BUG,修复KVM虚机崩溃问题,ipip6隧道支持dst_cache特性以提升性能,容器命名空间内支持tcp调优参数等,进一步提升了Linux内核的可用性及稳定性。


4 后续计划

  • 持续开发新特性,做好性能优化,并将补丁回馈开源社区,也积极将社区最新的成果呈现给用户。

  • 进一步完善操作系统及内核产品文档,给云上用户以最佳的体验。

  • 积极参与内核开发大会,分享更多操作系统及内核知识,增强社区内核领域的合作与交流。

5 结语

BEK内核由BC-Linux操作系统团队负责开发,欢迎有志之士加入我们的团队,共同参与云上操作系统的开发,为BEK内核“添砖加瓦”,探索实现更多的可能。简历可发至zhangshengju@cmss.chinamobile.com。扫码↓加微信了解更多。 

【大云制造】为云而生 - 大云BEK内核



参考文献:

[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


【大云制造】为云而生 - 大云BEK内核


上一篇:Docker核心原理:cgroups隔离


下一篇:容器学习笔记——OOM Killer与Memory Cgroup